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

CMake链接标准库报未定义引用错误但手动g++编译运行正常

问题根因
  • 你使用的Ubuntu 18.04系统自带的libstdc版本较低,没有std::__throw_bad_array_new_length()的导出符号,而你安装的GCC 11自带的对应版本libstdc存放在非系统默认的库搜索路径下
  • 手动直接调用g编译时,g会自动将自身配套的libstdc++搜索路径加入链接参数,所以可以正常找到符号完成链接
  • CMake默认配置没有自动传递GCC 11对应的libstdc搜索路径给链接器,导致链接时优先加载了系统自带的低版本libstdc,找不到对应符号报错
  • 额外说明:如果是使用GTest的场景,GTest要求最低C11标准,若CMake未显式指定C标准导致编译标准不匹配,也会触发同类符号缺失问题
解决方案

按优先级尝试以下方案即可解决:

  1. 首先在CMakeLists.txt中显式指定全局C++标准,注意要放在project指令之前,确保拉取GTest等第三方依赖时也使用相同的标准:
cmake_minimum_required(VERSION 3.20)

# 显式指定C++标准,需放在project指令前生效
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

project(TestProject CXX)

add_executable(MainTest main.cpp)

清理build目录后重新构建,大多数场景下即可解决问题。

  1. 如果第一种方案依旧报错,可以给目标添加静态链接libstdc++的选项,完全规避动态库版本匹配问题:
cmake_minimum_required(VERSION 3.20)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

project(TestProject CXX)

add_executable(MainTest main.cpp)
# 添加静态链接libstdc++选项
target_link_options(MainTest PRIVATE -static-libstdc++)
验证方法

如果需要排查参数差异,可以在CMake构建时执行make VERBOSE=1打印完整的编译链接命令,和手动执行的g++编译命令对比即可定位参数差异。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 22:48:01