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

Apple Silicon Mac上GCC12+GTest1.13的CMake链接错误求助

解决Apple Silicon上GCC12链接Homebrew GTest1.13的未定义符号问题

问题根源

Homebrew默认使用系统Clang编译预构建的Google Test包,而你使用GCC12编译项目代码,两者的C++ ABI(应用二进制接口)不兼容,导致ARM64架构下链接时出现未定义符号错误。


解决方案1:用GCC重新编译安装GTest

强制Homebrew使用GCC12从源码编译GTest,确保ABI一致:

  1. 卸载现有GTest:
brew uninstall googletest
  1. 指定GCC作为编译器,源码构建安装:
CC=gcc-12 CXX=g++-12 brew install --build-from-source googletest
  1. 清理旧CMake缓存并重新构建项目:
rm -rf CMakeCache.txt CMakeFiles
cmake .
make

解决方案2:修改CMake配置强制使用GCC标准库

无需重新编译GTest,通过指定链接GCC的libstdc++标准库来匹配ABI:
修改你的CMakeLists.txt:

cmake_minimum_required(VERSION 3.15)

set(CMAKE_C_COMPILER gcc-12)
set(CMAKE_CXX_COMPILER g++-12)

# 强制使用GCC的C++标准库
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libstdc++")

project(gtest_issue)

find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})

add_executable(runTests GTest_main.cpp)
# 链接时指定标准库
target_link_libraries(runTests ${GTEST_LIBRARIES} -stdlib=libstdc++)

然后清理缓存重新构建:

rm -rf CMakeCache.txt CMakeFiles
cmake .
make

解决方案3:用CMake FetchContent源码构建GTest

直接在项目中拉取GTest源码,和你的代码用同一编译器构建,彻底消除ABI差异:
替换CMakeLists.txt为:

cmake_minimum_required(VERSION 3.15)

set(CMAKE_C_COMPILER gcc-12)
set(CMAKE_CXX_COMPILER g++-12)

project(gtest_issue)

# 拉取GTest 1.13.0源码
include(FetchContent)
FetchContent_Declare(
  googletest
  URL https://github.com/google/googletest/archive/refs/tags/v1.13.0.tar.gz
)
# 禁止安装GTest到系统
set(INSTALL_GTEST OFF CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)

add_executable(runTests GTest_main.cpp)
# 链接GTest的目标库
target_link_libraries(runTests GTest::gtest_main)

清理缓存和依赖目录后重新构建:

rm -rf CMakeCache.txt CMakeFiles _deps
cmake .
make

内容的提问来源于stack exchange,提问作者Emil Andre Løvbak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:02:50