如何使用CMake搭配Catch2构建并运行阶乘测试项目?
配置CMake搭配Catch2构建阶乘测试项目
我来帮你一步步搞定这个CMake配置,让你的阶乘测试项目顺利构建和运行:
1. 完善各目录的CMakeLists.txt
根目录 /factorial/CMakeLists.txt
这个文件是项目的核心配置,负责全局设置和子目录管理:
cmake_minimum_required(VERSION 3.10) project(FactorialTest) # 指定C++标准,确保兼容性 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 把所有可执行文件输出到项目根目录的bin文件夹 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin) # 让所有目标都能找到include目录下的头文件 include_directories(${PROJECT_SOURCE_DIR}/include) # 添加源码和测试子目录 add_subdirectory(src) add_subdirectory(test)
源码目录 /factorial/src/CMakeLists.txt
这里负责编译阶乘功能为库,方便测试代码调用:
# 生成静态库(如果需要动态库可以把STATIC改成SHARED) add_library(fact STATIC fact.cpp) # 确保库本身能找到include目录的头文件,同时让链接它的目标也能访问这些头文件 target_include_directories(fact PUBLIC ${PROJECT_SOURCE_DIR}/include)
测试目录 /factorial/test/CMakeLists.txt
这里配置测试可执行文件,并且对接Catch2和CTest:
# 生成测试可执行文件 add_executable(test_fact test_fact.cpp) # 链接我们的阶乘库,让测试代码能调用factorial函数 target_link_libraries(test_fact PRIVATE fact) # 启用CTest,方便批量运行测试 enable_testing() # 添加测试用例,指定测试名称和对应的可执行文件 add_test(NAME FactorialTests COMMAND test_fact)
2. 补全测试文件 test_fact.cpp
你还需要编写测试逻辑,Catch2的单头文件版本只需要在测试文件中定义CATCH_CONFIG_MAIN来生成主函数:
#define CATCH_CONFIG_MAIN #include "catch.hpp" #include "fact.hpp" TEST_CASE("Factorial calculations are correct", "[factorial]") { // 注意:你的factorial函数返回number<=1时返回number,所以0的阶乘会返回0 // 如果要符合数学定义(0! = 1),可以修改fact.cpp的逻辑为 return number <=1 ? 1 : ... REQUIRE(factorial(0) == 0); REQUIRE(factorial(1) == 1); REQUIRE(factorial(2) == 2); REQUIRE(factorial(3) == 6); REQUIRE(factorial(5) == 120); REQUIRE(factorial(10) == 3628800); }
3. 构建和运行项目
按照以下步骤操作即可完成构建和测试:
- 首先在项目根目录创建构建目录(推荐用out-of-source构建,避免污染源码):
mkdir build && cd build - 运行CMake生成构建文件:
cmake .. - 编译项目(Linux/macOS用make,Windows用
cmake --build .):make - 运行测试:
方式一:直接执行bin目录下的测试程序:
方式二:用CTest批量运行测试(适合有多个测试用例的场景):../bin/test_factctest
小提示:如果希望0的阶乘返回符合数学定义的1,可以修改fact.cpp中的函数实现:
unsigned int factorial( unsigned int number ) { return number <= 1 ? 1 : factorial(number-1)*number; }
内容的提问来源于stack exchange,提问作者fronthem




