【问题标题】:CMake shared library in subdirectory子目录中的 CMake 共享库
【发布时间】:2017-11-12 17:39:29
【问题描述】:

我的问题解释起来比较简单。我有一个主要在 Windows 上运行的 CMake 项目(使用 CLion)。

一个主CMakeLists.txt项目,链接2个子目录

  • src/Library共享库
  • src/Executable 可执行链接 Library

请参阅下面的项目结构。

# 主 CMakeLists.txt

cmake_minimum_required(VERSION 3.8)
project(TestTest)

set(CMAKE_CXX_STANDARD 11)

add_subdirectory(src/Library)
add_subdirectory(src/Executable)


# src/Library/CMakeLists.txt
add_subdirectory(include)
add_subdirectory(src)

add_library(TestLib SHARED ${TESTLIB_H_FILES} ${TESTLIB_SRC_FILES} )
target_include_directories(TestLib PUBLIC include)

#src/Executable/CMakeLists.txt

add_subdirectory(src)
add_executable(Executable ${EXECUTABLE_SRC_FILES})
target_link_libraries(Executable PUBLIC TestLib)

我的问题是可执行文件在运行时找不到共享库。

我尝试添加link_directories( ${CMAKE_CURRENT_BINARY_DIR}/src/Library),但没有成功。

我错过了什么?

请注意:我不希望通过 CMake 手动/自动复制可执行文件旁边的共享库,因为我相信我会失去共享库的调试“能力”。我将收到 GDB 的以下错误消息:No source file named C:/Users/flatron/CLionProjects/TestTest/src/Library/src/libr‌​ary.cpp.

所有建议都非常欢迎和赞赏,

感谢您的帮助

【问题讨论】:

  • My problem is that the executable can't find the shared library. - 你的意思是当可执行文件运行时(在运行时),加载器找不到库? (这与由于链接器找不到库而导致可执行文件构建失败的情况相反)。
  • 你是对的,我只有在运行时才有问题,可执行文件构建得很好。我编辑了这个问题。感谢您的评论。
  • 感谢您查找此内容,我错过了此内容。我希望这个问题有更好的解决方案,我同意上述线程的最后一个答案,这是一个相当糟糕的解决方案。将所有库移动到同一个文件夹也不起作用,从那时起我将失去调试Library 带断点。这是一个非常简单的问题,我错过了一个更好的简单解决方案;)
  • Windows 不支持对可执行文件中的库的“引用”(这称为“运行时路径”,在其他操作系统中称为 RPATH)。因为这是一个操作系统约束; CMake 和 CLion 都无法克服它。顺便说一句,你关心调试;与其一般询问,为什么不专门询问有关调试的问题?请注意引用问题的第二个答案:stackoverflow.com/a/26513002/3440745:它不是copy the shared library next to the executable,但它在同一目录中创建库和可执行文件。所以调试不应该被破坏。

标签: c++ dll cmake shared-libraries clion


【解决方案1】:

我建议使用以下 cmake 命令:

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

这会将所有可执行文件和共享库构建到bin 文件夹中。 因此,无需手动复制任何内容。

【讨论】:

  • 感谢您的回答 Soeren。我试过这个,但它以某种方式弄乱了调试,因为它不会复制应该包含的符号,如果我可以让它在断点处停止,我会尝试做一些测试。
  • 问题是 GDB 将无法找到我的来源,所以我将收到 GDB No source file named C:/Users/flatron/CLionProjects/TestTest/src/Library/src/libr‌​ary.cpp. 的以下错误消息
猜你喜欢
  • 1970-01-01
  • 2020-05-04
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多