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

如何避免安装步骤中复制FetchContent拉取的googletest模块文件

问题

基于googletest库的C++测试项目,使用CMake构建,通过FetchContent从Git拉取googletest。运行正常,但执行安装步骤时,gtest/gmock的头文件和库文件会被冗余复制到安装目录,这些文件并非测试程序运行所需,如何禁用该行为?

项目相关文件及操作步骤如下:

CMakeLists.txt

cmake_minimum_required(VERSION 3.20)
project(test)

include(FetchContent)
FetchContent_Declare(googletest
    GIT_REPOSITORY https://github.com/google/googletest.git
    GIT_TAG release-1.12.1
)
FetchContent_MakeAvailable(googletest)

add_executable(test main.cpp)
target_link_libraries(test gtest_main)

install(TARGETS test)

main.cpp

#include <gtest/gtest.h>

int add(int a, int b) {
    return a + b;
}

TEST(testCase, testAdd) {
    EXPECT_EQ(add(2, 3), 5);
}

执行命令

mkdir build
cd build
cmake ..
cmake --build . --config Release
cmake --install . --prefix ../install

Windows环境下生成的../install目录包含:

  • bin\test.exe(符合预期)
  • include\gmock...和include\gtest...(冗余头文件)
  • lib\gmock.lib、lib\gmock_main.lib等(冗余库文件)

怀疑该行为由FetchContent_MakeAvailable导致,想知道这是否仅针对googletest,以及如何调整。

解决方案

该问题并非googletest独有,本质是FetchContent拉取的第三方项目默认启用了自身的安装规则,执行cmake --install时这些规则会被触发。以下是几种解决方法:

方法1:禁用gtest/gmock的安装目标

googletest本身提供了CMake选项控制是否安装自身文件,在调用FetchContent_MakeAvailable前设置INSTALL_GTEST和INSTALL_GMOCK为OFF即可:

cmake_minimum_required(VERSION 3.20)
project(test)

include(FetchContent)
FetchContent_Declare(googletest
    GIT_REPOSITORY https://github.com/google/googletest.git
    GIT_TAG release-1.12.1
)
# 强制禁用gtest和gmock的安装规则
set(INSTALL_GTEST OFF CACHE BOOL "" FORCE)
set(INSTALL_GMOCK OFF CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)

add_executable(test main.cpp)
target_link_libraries(test gtest_main)

install(TARGETS test)

FORCE参数用于覆盖googletest自身CMake配置中的默认值,确保设置生效。

方法2:用EXCLUDE_FROM_ALL隔离第三方项目

如果是其他没有专属开关的第三方库,可以在FetchContent_Declare时添加EXCLUDE_FROM_ALL参数,让第三方项目的目标默认不纳入顶级构建的ALL目标,同时不会触发其安装规则:

FetchContent_Declare(googletest
    GIT_REPOSITORY https://github.com/google/googletest.git
    GIT_TAG release-1.12.1
    EXCLUDE_FROM_ALL YES
)

这种方式更通用,适用于大多数第三方依赖,但需注意如果第三方库有你需要的额外安装目标,需手动启用。

方法3:安装时指定组件(仅部分场景适用)

如果项目划分了多个组件,可以在install命令中指定组件,安装时只安装目标组件:

install(TARGETS test COMPONENT Runtime)

执行安装时添加组件参数:

cmake --install . --prefix ../install --component Runtime

这种方式只是规避冗余文件的安装,并未从根源禁用第三方库的安装规则,不如前两种方法彻底。


内容的提问来源于stack exchange,提问作者AntonK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:20:19