使用CMake生成的系统在构建时运行Google测试
Running Google test at build time with CMake generated system
我的配置有CMake 3.6, Visual Studio 2015和最新的谷歌测试从GitHub。我通过一个cmake函数addGtest
添加单元测试,然后进行构建。在此之后,我可以从我的RUN_TESTS
目标或使用ctrl + F5在VS中运行测试并按预期工作。
最终目标是在构建时使用CMake依赖管理运行单元测试。现在,作为第一步,我已经增强了我的函数来创建custom_target
(包括整个函数,以防工作部分出现不可预见的问题),但没有构建它:
function (addGtest)
# vvvv this part works as explained vvvv #
set (optBOOLS)
set (optSINGLES EXE)
set (optLISTS DLL_LIST)
cmake_parse_arguments (myARGS
"${optBOOLS}" "${optSINGLES}" "${optLISTS}" ${ARGN})
# addExecutable is a function that adds target executables
set(myARGS_DLL_LIST gtest_main gtest "${myARGS_DLL_LIST}")
addExecutable (EXE ${myARGS_EXE} DLL_LIST ${myARGS_DLL_LIST} ${myARGS_UNPARSED_ARGUMENTS})
add_test (NAME ${myARGS_EXE} COMMAND ${myARGS_EXE} WORKING_DIRECTORY
${CMAKE_INSTALL_PREFIX}/$<$<CONFIG:Release>:Release>$<$<CONFIG:Debug>:Debug>/bin
) # so it can be run using ctest
# ^^^^ this part works as explained ^^^^ #
add_custom_target (${myARGS_EXE}.tgt DEPENDS ${myARGS_EXE}
COMMAND ${myARGS_EXE} --gtest_output="xml:${myARGS_EXE}.xml"
WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/$<$<CONFIG:Release>:Release>$<$<CONFIG:Debug>:Debug>/bin
)
endfunction (addGtest)
正如预期的那样,当我执行构建时,一个新的目标,比如,utMyTest.tgt
被添加到VS中,但它没有被构建。现在,当我在VS中手工构建这个新目标时,我希望测试能够运行。但它没有,并给出以下错误:
1> The filename, directory name, or volume label syntax is incorrect.
我尝试提供COMMAND
选项的完整路径,删除--gtest_output
值周围的双引号,但无济于事。另一方面,当我在命令行窗口中cd到工作目录并调用exe时,它工作得很好!
第一个问题是如何通过构建这个新目标来修复它以运行测试?之后,我计划add_custom_target (${myARGS_EXE}.run)
和add_dependencies (${myARGS_EXE}.run ${myARGS_EXE}.tgt)
。当exe更改时,会运行测试吗?还是我该做点别的?谢谢你的帮助。
不能在评论中添加太多细节,因此这个回答
1。原问题解答
由于我需要add_custom_target
命令的WORKING_DIRECTORY
选项中的配置依赖路径,但不能将生成器表达式传递给它,因此想法是使用 CMAKE_CFG_INTDIR
变量:
add_custom_target (${myARGS_EXE}.tgt
DEPENDS ${myARGS_EXE}
COMMAND ${myARGS_EXE} --gtest_output=xml:${myARGS_EXE}.xml
WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${CMAKE_CFG_INTDIR}/bin
)
现在,当您构建上述目标时,单元测试在WORKING_DIRECTORY
中运行,这并不是完全理想的,因为这是lib和exe的安装目录。如果……就好了。
2。从构建目录
运行单元测试同时,从Visual Studio中提取DLL路径,并将Gtest生成的.xml
文件存储在构建目录中。解决方案如下:
在CMake 3.10版本中添加了CMAKE_MSVCIDE_RUN_PATH
属性。在项目范围的CMakeLists.txt中,set(CMAKE_MSVCIDE_RUN_PATH ${CMAKE_INSTALL_PREFIX}/${CMAKE_CFG_INTDIR}/bin)
-由于这个解决方案#3,我们可以附加PATH
来指向我们的安装目录。然后将上面的add_custom_target
命令替换为:
add_custom_command (
TARGET ${myARGS_EXE} POST_BUILD
COMMAND ${myARGS_EXE} --gtest_output=xml:${myARGS_EXE}.xml
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
)
这个解决方案避免了创建额外目标的混乱。显然,只有在构建myARGS_EXE
时,才运行单元测试。显然,myARGS_EXE
对其他dll的传递依赖也包括在内。
如果你有其他优雅的解决方案,请发帖。
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 无法在 geany 上运行代码。无法执行构建命令
- 如何在使用Makefile构建后在cmd中运行该程序?
- 使用纯 CMake 构建 SFML 时出现运行时错误
- 在 Visual Studio 中构建一个没有 C/C++ 运行时的静态库
- CMake:尝试在 Jenkins 构建机器上运行时出现"Linked Library"错误 (0xc0000135)
- 什么是运行英特尔线程构建模块的 XCode 8 环境变量
- 有关为指向运行时确定的多个结构之一的指针构建类的建议
- 无法构建 quazip。MOC 编译器不会运行。命令行未找到相关类
- 是否可以在运行时在C++中构建变量名称?
- C\C++构建的dll在LabView中实时运行
- 如何在构建Qt应用程序时运行git命令
- 使用 CodeBlocks + GCC 构建的可执行文件是否可以在任何 Windows 上运行?
- C++运行时构建嵌套函数
- 代码示例 "switch" (b.eckel) 不在 Xcode 上构建/运行,而是在 QT 上构建/运行
- 应用程序停滞在构建/运行过程中
- 如何使用Eclipse Luna在CDT中使用构建/运行配置
- 构建运行良好,但在运行时崩溃
- Boost库构建-运行时链接和链接选项之间的差异
- 构建运行在不同版本linux上的cpp程序