在CMake安装流程中集成GoogleTest:实现前置测试与系统检查
GoogleTest依赖优化与测试驱动安装方案
一、优先使用系统已安装的GoogleTest
通过find_package先尝试查找系统中已存在的GoogleTest,仅在未找到时才从源码拉取构建,避免重复编译:
# 先尝试查找系统已安装的GoogleTest find_package(GTest QUIET REQUIRED NO) if(NOT GTest_FOUND) # 系统未安装则从源码拉取 include(FetchContent) FetchContent_Declare( googletest URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip ) # 强制使用共享CRT,避免编译冲突 set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) FetchContent_MakeAvailable(googletest) endif()
二、实现测试通过才执行安装
通过自定义目标绑定测试与安装流程,确保只有测试全部通过后才执行make install:
1. 调整tests/CMakeLists.txt
在原有代码基础上添加测试运行的自定义目标:
# (保留前面的GoogleTest查找/拉取代码) # 构建测试可执行文件 add_executable(bin test.cpp) target_link_libraries(bin lib GTest::gtest_main pthread ) include(GoogleTest) gtest_discover_tests(bin) # 添加自定义目标:运行所有测试,失败则终止流程 add_custom_target(run_tests COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure DEPENDS bin WORKING_DIRECTORY ${CMAKE_BINARY_DIR} )
2. 修改根目录CMakeLists.txt
将安装目标与测试运行目标绑定:
# 全局启用测试 enable_testing() # 添加测试子目录 add_subdirectory(tests) # 你的原有安装规则,示例: install(TARGETS lib DESTINATION ${CMAKE_INSTALL_LIBDIR}) # ... 其他头文件、配置文件安装规则 # 让install依赖测试运行目标,测试失败则终止安装 add_dependencies(install run_tests)
关键说明
find_package(GTest QUIET REQUIRED NO):QUIET避免找不到时输出冗余警告,REQUIRED NO表示找不到也不终止构建,继续执行源码拉取逻辑。run_tests目标依赖测试可执行文件bin,确保先完成测试编译再运行;--output-on-failure参数让测试失败时直接输出详细日志,便于排查问题。add_dependencies(install run_tests):将安装流程与测试结果绑定,只有测试全部通过,make install才会正常执行。
内容的提问来源于stack exchange,提问作者aaries
相关产品推荐
相关产品推荐

