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一致:
- 卸载现有GTest:
brew uninstall googletest
- 指定GCC作为编译器,源码构建安装:
CC=gcc-12 CXX=g++-12 brew install --build-from-source googletest
- 清理旧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
相关产品推荐
相关产品推荐

