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

如何在googletest中为测试可执行文件添加多源文件且避免重定义错误

问题根因

你遇到的多定义链接错误核心来自两个常见问题:

  • 你的CMake配置没有将my_library_dir下的业务代码编译为独立编译单元,业务符号没有统一生成
  • 如果头文件中存在非inline的函数实现、非extern的全局变量定义,多个测试源文件分别引入头文件后,会在每个测试的编译单元中生成重复符号,链接阶段就会冲突
    你当前的临时方案是将所有测试合并为单个编译单元,规避了重复符号冲突,但不符合工程化实践。
正确修改方案

你需要先将自有业务代码编译为独立静态库,再让测试目标链接该库,修改后的完整CMakeLists.txt如下:

cmake_minimum_required(VERSION 3.14)
project(my-library-testing)

# 只需要设置这两行就可以指定C++标准,冗余的flag配置可以删掉
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

include(FetchContent)
FetchContent_Declare(
  googletest
  URL https://github.com/google/googletest/archive/e2239ee6043f73722e7aa812a459f54a28552929.zip
)

# For Windows: Prevent overriding the parent project's compiler/linker settings
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)

enable_testing()

# 新增:编译自有业务代码为静态库
add_library(my_library STATIC
  my_library_dir/obj1.cpp
  my_library_dir/obj2.cpp
)
# 给静态库配置公开头文件搜索路径,依赖该库的目标会自动继承该路径
target_include_directories(my_library
  PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
)

add_executable(
  library_test
  normTest1.cpp
  normTest2.cpp
  deathTest1.cpp
  deathTest2.cpp
)

# 新增:测试目标链接自己的业务库
target_link_libraries(
  library_test
  PRIVATE
  gtest_main
  my_library
)

include(GoogleTest)
gtest_discover_tests(library_test)
额外检查项

如果修改后仍然存在多定义错误,检查my_library.h及关联头文件:

  • 所有写在头文件里的函数实现都要加inline关键字
  • 全局变量只在头文件中加extern声明,具体定义放到对应的.cpp文件中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:06:04