我正在使用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})发布于 2012-03-01 05:54:09
最后,我使用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
)发布于 2011-12-01 03:03:02
假设您正在通过在Visual Studio中构建RUN_TESTS目标来运行测试:
复制这些文件
(未测试)
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}"
)INSTALL命令,就像Hans Passant建议的那样。在您的代码片段中,您没有针对可执行文件的INSTALL命令;因此,即使是您的可执行文件也不会出现在“可执行文件文件夹”中。首先,添加cmake INSTALL命令,将可执行文件放入某个位置,以响应cmake INSTALL目标。完成后,我们就可以研究如何添加另一个安装命令来将boost unit_test_framework库放到相同的位置。在此之后,如果您想使用CPACK创建安装程序,库将自动随可执行文件一起安装。发布于 2012-08-28 23:25:18
我有一个非常类似的问题,但这里提出的解决方案并不令人满意。像最初的帖子一样,我想运行基于boost::test的单元测试。
我有多个测试项目,我们产品的每个市长组件都有一个。必须在每次测试之前运行install目标,这意味着为了运行属于核心组件的测试,必须重新编译整个测试。这就是我想要避免的。
如果我更改了核心组件中的某些内容,我希望编译该核心组件和相关的测试。然后运行测试。当测试成功后,我才想编译并最终安装剩下的部分。
为了在调试器中运行测试,我在以下位置找到一些非常有用的cmake脚本:https://github.com/rpavlik/cmake-modules
这样,我就可以指定所需dll的所有目录,并为新进程设置PATH环境变量:
# 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目录中创建一个额外的批处理文件:
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()这样,单元测试就可以尽可能快地捕获错误,而不必首先编译整个批次。
https://stackoverflow.com/questions/7978333
复制相似问题