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

Ubuntu 22.04下Clang++链接标准库出现未定义引用问题求助

问题

环境信息:

  • clang版本:Ubuntu clang version 14.0.0-1ubuntu1.1
  • gcc版本:11.4.0

使用g++执行以下命令可正常编译链接:

g++ -Wall -Wextra -std=c++17 -Wno-deprecated-declarations -ggdb -O0 -g3 -O0 --coverage -Isrc/cscs -Isrc/include -Ilibraries/swap32/EC/debian/include -Ilibraries/zmq/EC/debian/include -Ilibraries/liquid_dsp/EC/debian/include -Xlinker -Map=telemachus.map   bin/file1.o  bin/file2.o  bin/file3.o -o bin/a.out -Llibraries/zmq/EC/debian -l:libzmq.a -Llibraries/swap32/EC/debian -l:libswap32.a -Llibraries/liquid_dsp/EC/debian/lib -l:libliquid.a -lpthread -lstdc++fs

改用clang++执行以下命令时链接失败:

clang++ -Wall -Wextra -std=c++17 -Wno-deprecated-declarations -ggdb -O0 -g3 -O0 --coverage -Isrc/cscs -Isrc/include -Ilibraries/swap32/EC/debian/include -Ilibraries/zmq/EC/debian/include -Ilibraries/liquid_dsp/EC/debian/include -stdlib=libc++ -fsanitize=address   bin/file1.o  bin/file2.o  bin/file3.o  -o bin/a.out -Llibraries/zmq/EC/debian -l:libzmq.a -Llibraries/swap32/EC/debian -l:libswap32.a -Llibraries/liquid_dsp/EC/debian/lib -l:libliquid.a -lpthread

错误信息:

  • undefined reference to std::__cxx11::basic_string<char, std::char_traits
  • undefined reference to vtable for std::__cxx11::basic_stringbuf<char,
  • undefined reference to vtable for std::basic_streambuf<char, std::char_traits >'

两条命令差异:

  1. clang++命令移除了-lstdc++fs引用
  2. clang++添加了-fsanitize=address选项
  3. clang++添加了-stdlib=libc++选项,否则代码无法构建

疑问:为什么clang构建时无法链接到g下可见的库?

解决方案

核心原因

这是C++标准库ABI不兼容导致的问题:

  • g默认使用GNU的libstdc++标准库,而clang指定-stdlib=libc++后会切换到LLVM的libc++标准库。
  • 你链接的静态依赖库(libzmq.a、libswap32.a、libliquid.a)是基于libstdc++编译的,和libc++的二进制接口不匹配,所以出现符号找不到的错误。

具体解决步骤

  1. 统一标准库(优先方案)
    既然你必须用-stdlib=libc++才能构建代码,那需要重新编译所有依赖库(swap32、zmq、liquid_dsp):

    • 编译依赖库时,使用clang++作为编译器,并添加-stdlib=libc++参数,确保依赖库和你的程序用同一套标准库。
    • 如果要使用-fsanitize=address,编译依赖库时也要加上这个选项,ASAN要求整个链路的代码都用ASAN编译才能正常工作。
  2. 补充链接libc++相关库(临时尝试)
    如果暂时无法重新编译依赖库,可尝试在clang命令中添加-lc++ -lc++abi,确保完整链接libc的组件,但这种跨标准库链接大概率会出现其他兼容性问题,不推荐长期使用。

  3. 关于stdc++fs的说明
    libc从C17开始已经将文件系统库集成到主标准库中,不需要单独链接libc++fs,所以clang++下移除-lstdc++fs是正确的操作,和当前链接错误无关。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:22:38