【问题标题】:Windows Cygwin error 127 when running in IDE在 IDE 中运行时 Windows Cygwin 错误 127
【发布时间】:2020-08-08 06:01:20
【问题描述】:

我的程序由一个共享库和一个链接到它的主库组成。一切正常,直到我在共享库中拆分实现和定义。

|-CMakeList.txt
|-main.cpp
|lib
    |-CMakeList.txt
    |-myclass.cpp
    |-myclass.hpp

共享库 - CMakeList.txt

include_directories(include ${CMAKE_CURRENT_BINARY_DIR})
add_library(mylib SHARED myclass.hpp myclass.cpp)

共享库 - myclass.hpp

#include <cstdio>

class myclass
{
public:
    void msg();
};

共享库 - myclass.cpp

#include "myclass.hpp"

void myclass::msg() // works fine if inside .hpp
{
    printf("this is a test message");
}

根 - CMakeList.txt

cmake_minimum_required(VERSION 3.16)
project(test)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_BUILD_TYPE Debug)

add_subdirectory(lib)

add_executable(test main.cpp)

target_link_libraries(test mylib)

根 - main.cpp

#include "lib/myclass.hpp"
int main()
{
    myclass m{};
    m.msg();
    return 0;
}

我在 Windows 上使用 CLion IDE。如果我将 dll 放在我的 .exe 旁边并从终端运行它,一切正常。

编辑: 当 dll 与 .exe 放在同一个文件夹中时,程序只有在终端运行时才能正常工作; IDE 返回代码 127。我不知道这是否是 CLion 的怪癖,我需要以某种方式对其进行调整。问题是我无法通过IDE进行调试。

另外,当 myclass.msg() 的实现位于标头中时, IDE 和终端中的一切都可以正常工作。但是当我拆分实现和定义时,我得到了上述错误。

【问题讨论】:

  • “如果我将 dll 放在我的 .exe 旁边...一切正常”。确切地告诉您问题出在哪里:您的 .exe 有一个在运行时无法找到的依赖 .dll。问题是“Windows DLL 搜索顺序”。看herehere
  • @paulsm4 “一切正常,直到我在共享库中拆分实现和定义。”我在我的帖子中添加了一个编辑。为什么我在实现位于 .cpp 并且我从 IDE 运行它时会遇到此问题。如果我把它变成一个只有头文件的库,一切都很好。另外,我确实将 dll 放在 .exe 旁边以通过终端运行程序

标签: c++ cygwin clion


【解决方案1】:

当你用这个结构建造时

|-CMakeList.txt
|-main.cpp
|lib
    |-CMakeList.txt
    |-myclass.cpp
    |-myclass.hpp

您的程序与您的 dll 正确链接

$ objdump -x test.exe | grep DLL
 vma:            Hint    Time      Forward  DLL       First
        DLL Name: cygwin1.dll
        DLL Name: KERNEL32.dll
        DLL Name: cygmylib.dll

但是共享库不在同一个目录

$ ls -1F
cmake_install.cmake
CMakeCache.txt
CMakeFiles/
lib/
Makefile
test.exe*

$ ls -1F lib
cmake_install.cmake
CMakeFiles/
cygmylib.dll*
libmylib.dll.a
Makefile

因此您可以将所有内容放在同一个目录中,或者将 lib 子目录添加到您的 IDE 测试路径中
以 Cygwin 终端为例

$ ./test.exe
D:/cygwin64/tmp/prova/build/test.exe: error while loading shared libraries: cygmylib.dll: cannot
open shared object file: No such file or directory

$ cp lib/cygmylib.dll .

$ ./test.exe
this is a test message

【讨论】:

    猜你喜欢
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多