【发布时间】:2021-06-16 22:27:15
【问题描述】:
下面是一个简单的 CMake 项目。在 Linux 上,一切都可以编译,并且运行 main 会给出预期的输出。在 Windows 上,编译也成功了,但 main 没有给出任何输出。我无法真正解释这个错误,但是当我从main 调用getNumber() 函数时,main 不再起作用。我什至无法在此处设置断点并对其进行调试。
|-CMakeLists.txt
|-Main
|---main.cpp
|---CmakeLists.txt
|-SHLib
|---foo.h
|---foo.cpp
|---CmakeLists.txt
CMakeLists.txt:
add_subdirectory(SHLib)
add_subdirectory(Main)
Main/CMakeLists.txt:
add_executable(Main main.cpp)
target_link_libraries(Main PUBLIC SHLib)
SHLib/CMakeLists.txt
add_library(
SHLib SHARED
foo.h
foo.cpp
)
add_compile_definitions(LIBRARY_EXPORTS)
target_include_directories(SHLib PUBLIC "${PROJECT_SOURCE_DIR}")
主/main.cpp
#include <iostream>
#include <SHLib/foo.h>
int main()
{
if (getNumber() == 7)
std::cout << "Successful linking\n";
std::cout << "End of main function\n";
}
SHLib/foo.h
#ifdef _WIN32
# ifdef LIBRARY_EXPORTS
# define LIBRARY_API __declspec( dllexport )
# else
# define LIBRARY_API __declspec( dllimport )
# endif
#else
# define LIBRARY_API
#endif
LIBRARY_API int getNumber();
SHLib/foo.cpp
#include <SHLib/foo.h>
int getNumber()
{
return 7;
}
【问题讨论】:
-
你是把.dll文件复制到可执行文件旁边还是把构建好的dll所在的目录添加到PATH中?
-
确实是问题所在。我将 .dll 复制到可执行文件中,它可以工作。为什么它可以在 Linux 上运行?
-
在 Linux 上,.so 文件的完整路径包含在可执行文件中。您可能可以将 CMake output directory 配置为对所有库和 exe 都相同,这应该有助于调试。也可以在调试时将lib输出文件夹添加到PATH中。
-
如果您解决了您的问题,您能否将解决方案描述为下面的“答案”并接受它? :-)
标签: c++ cmake shared-libraries multiplatform