【发布时间】:2017-11-12 17:39:29
【问题描述】:
我的问题解释起来比较简单。我有一个主要在 Windows 上运行的 CMake 项目(使用 CLion)。
一个主CMakeLists.txt项目,链接2个子目录
-
src/Library共享库 -
src/Executable可执行链接Library
请参阅下面的项目结构。
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/library.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