如何配置CMake在指定目录生成测试可执行文件?
解决CMake将测试可执行文件生成到指定目录的问题
问题出在你对add_executable的用法理解上——第一个参数是目标的名称,不是生成可执行文件的输出路径。CMake不会自动解析这个路径来创建输出目录,得通过专门的变量或属性来指定。
结合你的项目结构,这里有两种可靠的方法来实现把测试可执行文件放到project/build/tests目录:
方案一:全局设置测试目标的输出路径
如果你所有测试可执行文件都要放到同一个目录,可以在添加测试目标前,全局设置运行时文件的输出目录。这种方法适合批量处理测试目标:
cmake_minimum_required(VERSION 3.0) project(ProjectName) # 主程序配置(保持你原有的逻辑) # ... 定义SRC_LIST、INCLUDE_LIST,链接依赖库等 ... add_executable(${PROJECT_NAME} ${SRC_LIST} ${INCLUDE_LIST}) # 指定测试可执行文件的输出目录:build/tests set(TEST_OUTPUT_DIR ${PROJECT_BINARY_DIR}/tests) # 全局设置后续添加的所有可执行文件输出到该目录 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${TEST_OUTPUT_DIR}) # 添加测试目标(此时目标名只需写简单名称,不用带路径) add_executable(OpenMP_Check tests/openmp.cpp) # 若有其他测试,继续添加即可 add_executable(MemoryCheck tests/memory_check.cpp)
说明:
${PROJECT_BINARY_DIR}就是你执行cmake命令的build目录,CMake会自动识别这个变量,无需硬编码路径。
方案二:针对单个测试目标设置输出路径(推荐)
如果需要更灵活的控制(比如部分测试文件放到不同目录,或者不想影响其他非测试可执行文件),可以用set_target_properties给每个测试目标单独配置输出路径:
cmake_minimum_required(VERSION 3.0) project(ProjectName) # 主程序配置(保持你原有的逻辑) # ... 定义SRC_LIST、INCLUDE_LIST,链接依赖库等 ... add_executable(${PROJECT_NAME} ${SRC_LIST} ${INCLUDE_LIST}) # 添加第一个测试目标 add_executable(OpenMP_Check tests/openmp.cpp) # 设置该目标的输出目录为build/tests set_target_properties(OpenMP_Check PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/tests ) # 添加第二个测试目标,同理配置 add_executable(ThreadSafetyCheck tests/thread_safety.cpp) set_target_properties(ThreadSafetyCheck PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/tests )
可选:区分Debug/Release版本的输出目录
如果你的项目需要多配置构建(比如Debug和Release),可以给不同配置单独指定输出子目录,避免可执行文件混在一起:
set_target_properties(OpenMP_Check PROPERTIES RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_BINARY_DIR}/tests/Debug RUNTIME_OUTPUT_DIRECTORY_RELEASE ${PROJECT_BINARY_DIR}/tests/Release )
这样Debug版本的测试程序会生成在build/tests/Debug,Release版本在build/tests/Release,结构更清晰。
总结
推荐使用方案二,因为它的灵活性更高,不会意外影响主程序或其他非测试目标的输出路径。配置完成后,你执行make(或ninja、VS构建)时,测试可执行文件就会自动生成到指定的build/tests目录下了。
内容的提问来源于stack exchange,提问作者Patafikss
相关产品推荐
相关产品推荐

