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

CMake打包gtest/gmock库:如何将头文件与库文件一同导出?

解决gtest/gmock静态库打包时头文件导出问题

为节省编译时间,尝试将gtest/gmock打包为静态库。当前CMake脚本可生成库文件并输出到../lib目录,但无法将gtest/gmock的头文件一同导出到该目录,寻求解决方法。对应的CMake代码如下:

cmake_minimum_required(VERSION 3.1...3.22)

project(gtest)

set(COMPILER_DIRECTIVES    "-O0 -g3 -Wall -MMD -MP")
set(CMAKE_CXX_FLAGS        "${COMPILER_DIRECTIVES}")
set(CMAKE_EXE_LINKER_FLAGS "")

set(SOURCE                  ${CMAKE_SOURCE_DIR})

# Overrides
#set(CMAKE_VERBOSE_MAKEFILE          ON)

set(gtest_headers
    ${SOURCE}/googlemock
    ${SOURCE}/googlemock/include
    ${SOURCE}/googletest
    ${SOURCE}/googletest/include
)

include_directories(
    ${gtest_headers}
)

# Source files

file(GLOB_RECURSE googletest_sources CONFIGURE_DEPENDS
    ${SOURCE}/googlemock/src/*.cc
    ${SOURCE}/googletest/src/*.cc
)
list (REMOVE_ITEM googletest_sources
    ${SOURCE}/googletest/src/gtest_main.cc
    ${SOURCE}/googlemock/src/gmock-all.cc
    ${SOURCE}/googletest/src/gtest-all.cc
)

add_library(${PROJECT_NAME} STATIC ${googletest_sources})
target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_20)

target_include_directories(${PROJECT_NAME}
    PUBLIC
        ${gtest_headers}
)

set_target_properties(${PROJECT_NAME} PROPERTIES
    ARCHIVE_OUTPUT_DIRECTORY "../lib"
    LIBRARY_OUTPUT_DIRECTORY "../lib"
    OUTPUT_NAME ${PROJECT_NAME}
)

解决方案

方法一:使用CMake的install命令(推荐)

在现有脚本末尾添加install规则,明确指定头文件和库的安装路径:

# 将gtest/gmock的头文件安装到../lib/include目录
install(DIRECTORY ${SOURCE}/googlemock/include/
        DESTINATION ../lib/include)
install(DIRECTORY ${SOURCE}/googletest/include/
        DESTINATION ../lib/include)

# 安装编译好的静态库
install(TARGETS ${PROJECT_NAME}
        ARCHIVE DESTINATION ../lib)

执行编译命令时加上安装目标:

cmake --build . --target install

即可同时将库文件和头文件导出到指定目录。

方法二:自定义拷贝目标

如果不想使用install流程,可以添加自定义目标,让编译时自动复制头文件:

# 创建自定义目标用于拷贝头文件
add_custom_target(copy_gtest_headers ALL
        COMMAND ${CMAKE_COMMAND} -E copy_directory ${SOURCE}/googlemock/include/ ../lib/include/
        COMMAND ${CMAKE_COMMAND} -E copy_directory ${SOURCE}/googletest/include/ ../lib/include/
        COMMENT "Copying gtest/gmock headers to ../lib/include"
)

# 让静态库目标依赖拷贝目标,确保编译库前先完成头文件拷贝
add_dependencies(${PROJECT_NAME} copy_gtest_headers)

执行常规编译命令(如make或cmake --build .)时,头文件会自动被复制到../lib/include目录。

注意事项

  • 建议将头文件放到../lib/include子目录,而非与库文件同级,后续使用时只需指定../lib/include作为include路径即可,结构更规范。
  • 原gtest/gmock的头文件在include目录下已包含gtest、gmock子目录,拷贝后会自动保留层级,无需额外调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:43:23