You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 17:40:31