首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让用CMake构建的可执行文件可以访问Boost DLL?

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

Stack Overflow用户
提问于 2011-11-02 17:46:32
回答 3查看 4.8K关注 0票数 10

我正在使用Windows上的CMake构建基于Boost.Test的测试套件。因为我动态链接到Boost.Test,所以我的可执行文件需要能够找到DLL (位于../../../boost/boost_1_47/lib或与可执行文件类似的目录下)。

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

--附加信息--

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

代码语言:javascript
复制
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})
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-01 05:54:09

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

代码语言:javascript
复制
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
)
票数 4
EN

Stack Overflow用户

发布于 2011-12-01 03:03:02

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

  1. 我总是将.../ boost /boost_1_47/lib添加到我的命令路径环境变量中,这样就可以在运行时找到boost unit_test_framework dll。
  2. 如果由于某种原因无法更改路径,可以使用cmake.

复制这些文件

(未测试)

代码语言:javascript
复制
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}"
)

  1. 如果你只在构建时运行测试(正如我上面所假设的),那么你需要一系列的INSTALL命令,就像Hans Passant建议的那样。在您的代码片段中,您没有针对可执行文件的INSTALL命令;因此,即使是您的可执行文件也不会出现在“可执行文件文件夹”中。首先,添加cmake INSTALL命令,将可执行文件放入某个位置,以响应cmake INSTALL目标。完成后,我们就可以研究如何添加另一个安装命令来将boost unit_test_framework库放到相同的位置。在此之后,如果您想使用CPACK创建安装程序,库将自动随可执行文件一起安装。
票数 6
EN

Stack Overflow用户

发布于 2012-08-28 23:25:18

我有一个非常类似的问题,但这里提出的解决方案并不令人满意。像最初的帖子一样,我想运行基于boost::test的单元测试。

我有多个测试项目,我们产品的每个市长组件都有一个。必须在每次测试之前运行install目标,这意味着为了运行属于核心组件的测试,必须重新编译整个测试。这就是我想要避免的。

如果我更改了核心组件中的某些内容,我希望编译该核心组件和相关的测试。然后运行测试。当测试成功后,我才想编译并最终安装剩下的部分。

为了在调试器中运行测试,我在以下位置找到一些非常有用的cmake脚本:https://github.com/rpavlik/cmake-modules

这样,我就可以指定所需dll的所有目录,并为新进程设置PATH环境变量:

代码语言:javascript
复制
# for debugging
INCLUDE(CreateLaunchers)

create_target_launcher(PLCoreTests 
    ARGS  "--run-test=Core1"
    RUNTIME_LIBRARY_DIRS ${PL_RUNTIME_DIRS_DEBUG} ${PROJECT_BINARY_DIR}/bin/Debug 
    WORKING_DIRECTORY ${PL_MAIN_DIR}/App/PL/bin
)

其中${PL_RUNTIME_DIRS_DEBUG}包含可以找到boost中的dll和所有其他库的目录。

现在,我正在寻找如何使用ADD_CUSTOM_COMMAND()实现类似的功能。

更新:

ADD_CUSTOM_COMMAND()可以有多个命令,用于将数据写入一个批处理文件。因此,您可以首先设置所有运行时目录的路径,然后执行测试可执行文件。为了能够轻松地手动执行测试,我让cmake在build目录中创建一个额外的批处理文件:

代码语言:javascript
复制
MACRO(RunUnitTest TestTargetName)
    IF(RUN_UNIT_TESTS)
        SET(TEMP_RUNTIME_DIR ${PROJECT_BINARY_DIR}/bin/Debug)
        FOREACH(TmpRuntimeDir ${PL_RUNTIME_DIRS_DEBUG})
            SET(TEMP_RUNTIME_DIR  ${TEMP_RUNTIME_DIR}  ${TmpRuntimeDir})
        ENDFOREACH(TmpRuntimeDir)

        ADD_CUSTOM_COMMAND(TARGET ${TestTargetName} POST_BUILD 
            COMMAND echo "PATH=${TEMP_RUNTIME_DIR};%PATH%" > ${TestTargetName}_script.bat
            COMMAND echo ${TestTargetName}.exe --result_code=no --report_level=no >> ${TestTargetName}_script.bat
            COMMAND ${TestTargetName}_script.bat
            WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Debug
        )
    ENDIF(RUN_UNIT_TESTS)
ENDMACRO()

这样,单元测试就可以尽可能快地捕获错误,而不必首先编译整个批次。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7978333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档