如何使用CMake构建的可执行文件可以访问Boost DLL?

Ale*_*ban 9 windows dll boost cmake

我在Windows上使用CMake来构建基于Boost.Test的测试套件.当我正在动态链接到Boost.Test时,我的可执行文件需要能够找到DLL(在../../../boost/boost_1_47/lib下或类似于可执行文件的那些).

所以我需要将DLL复制到可执行文件所在的文件夹中,或者以其他方式查找它.使用CMake实现这一目标的最佳方法是什么?

- 附加信息 -

我的CMakeLists.txt目前有这个与Boost相关的配置:

set(Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0")
set(BOOST_ROOT "../boost")

find_package(Boost 1.47 COMPONENTS unit_test_framework REQUIRED)
include_directories(${Boost_INCLUDE_DIR})
link_directories(${Boost_LIBRARY_DIR})

add_executable(test-suite test-suite.cpp)
target_link_libraries(test-suite ${Boost_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)

Chr*_*uns 6

假设您通过在Visual Studio中构建RUN_TESTS目标来运行测试:

  1. 我总是...... /升压/ boost_1_47/lib目录添加到我的命令PATH环境变量,所以升压unit_test_framework的dll可以在运行时被发现.这就是我推荐的.

  2. 如果由于某种原因无法更改PATH,则可以使用cmake复制文件.

(另)

get_filename_component(LIBNAME "${Boost_UNIT_TEST_FRAMEWORK_LIBRARY_RELEASE}" NAME)
add_custom_command(TARGET test-suite POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy "${Boost_UNIT_TEST_FRAMEWORK_LIBRARY_RELEASE}" "${CMAKE_CURRENT_BINARY_DIR}/${LIBNAME}"
)
Run Code Online (Sandbox Code Playgroud)

3.如果你只是运行在构建时的测试(如我上面假设),那么你就需要一系列的INSTALL命令,比如汉斯帕桑特建议.在您的代码段中,您没有INSTALL可执行文件的命令; 所以即使你的可执行文件也不会"在可执行文件夹中".首先添加一个cmake INSTALL命令,将您的可执行文件置于某个位置以响应cmake INSTALL目标.一旦你有了这个工作,我们就可以着手搞清楚如何添加另一个INSTALL命令,将boost unit_test_framework库放到同一个位置.之后,如果要使用CPACK创建安装程序,则库将自动与可执行文件一起安装.


Ale*_*ban 4

我最终使用install命令将 Boost DLL 复制到可执行文件的文件夹:

get_filename_component(UTF_BASE_NAME ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY_RELEASE} NAME_WE)
get_filename_component(UTF_PATH ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY_RELEASE} PATH)
install(FILES ${UTF_PATH}/${UTF_BASE_NAME}.dll
  DESTINATION ../bin
  CONFIGURATIONS Release RelWithDebInfo
)

get_filename_component(UTF_BASE_NAME_DEBUG ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY_DEBUG} NAME_WE)
install(FILES ${UTF_PATH}/${UTF_BASE_NAME_DEBUG}.dll
  DESTINATION ../bin
  CONFIGURATIONS Debug
)
Run Code Online (Sandbox Code Playgroud)