运行ctest时如何为测试设置对应构建配置的工作目录?
解决gtest_discover_tests多配置下工作目录不匹配的问题
核心问题
你当前用${CMAKE_CURRENT_BINARY_DIR}作为工作目录,这是配置阶段的静态变量,在Visual Studio这类多配置生成器中,它指向测试目标的顶层二进制目录(比如D:/work/PROJECT/test),但实际测试可执行文件会生成在对应配置的子目录(Debug/Release)里,导致工作目录和可执行文件目录不一致。
解决方案
用CMake的生成器表达式动态获取测试可执行文件的输出目录,替换静态的工作目录设置。修改你的CMake代码如下:
gtest_discover_tests(${TEST_TARGET} DISCOVERY_MODE PRE_TEST WORKING_DIRECTORY $<TARGET_FILE_DIR:${TEST_TARGET}>)
原理说明
$<TARGET_FILE_DIR:${TEST_TARGET}>是CMake生成器表达式,会在构建/测试发现阶段根据当前配置(Debug/Release等)动态展开,直接指向测试可执行文件所在的完整路径(比如D:/work/PROJECT/test/Debug或D:/work/PROJECT/test/Release)。- 相比手动拼接
${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>,这个表达式更可靠——它会自动适配项目自定义的配置输出目录,不需要依赖标准的Debug/Release子目录命名规则。
为什么之前的尝试无效
- 使用
CMAKE_CONFIGURATION_TYPES:这个变量是列出项目支持的所有配置(比如Debug;Release),不是当前正在处理的配置,无法动态区分不同构建类型。 - 手动修改生成的
.cmake文件:这类文件是CMake自动生成的,每次重新配置项目都会被覆盖,修改无法持久化。
内容的提问来源于stack exchange,提问作者Mogu
相关产品推荐
相关产品推荐

