【问题标题】:Linking a shared library to an executable using CMAKE使用 CMAKE 将共享库链接到可执行文件
【发布时间】: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


【解决方案1】:

要使其在 Windows 上运行,dll 和可执行文件必须位于同一文件夹中。您可以手动复制它们或在顶级 CMake 文件中设置输出目录,如下所示:set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "yours_output_directory")。这样,可执行文件和 dll 都将在 yours_output_directory 中结束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    相关资源
    最近更新 更多