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 >'
两条命令差异:
- clang++命令移除了
-lstdc++fs引用 - clang++添加了
-fsanitize=address选项 - clang++添加了
-stdlib=libc++选项,否则代码无法构建
疑问:为什么clang构建时无法链接到g下可见的库?
解决方案
核心原因
这是C++标准库ABI不兼容导致的问题:
- g默认使用GNU的
libstdc++标准库,而clang指定-stdlib=libc++后会切换到LLVM的libc++标准库。 - 你链接的静态依赖库(
libzmq.a、libswap32.a、libliquid.a)是基于libstdc++编译的,和libc++的二进制接口不匹配,所以出现符号找不到的错误。
具体解决步骤
统一标准库(优先方案)
既然你必须用-stdlib=libc++才能构建代码,那需要重新编译所有依赖库(swap32、zmq、liquid_dsp):- 编译依赖库时,使用
clang++作为编译器,并添加-stdlib=libc++参数,确保依赖库和你的程序用同一套标准库。 - 如果要使用
-fsanitize=address,编译依赖库时也要加上这个选项,ASAN要求整个链路的代码都用ASAN编译才能正常工作。
- 编译依赖库时,使用
补充链接libc++相关库(临时尝试)
如果暂时无法重新编译依赖库,可尝试在clang命令中添加-lc++ -lc++abi,确保完整链接libc的组件,但这种跨标准库链接大概率会出现其他兼容性问题,不推荐长期使用。关于stdc++fs的说明
libc从C17开始已经将文件系统库集成到主标准库中,不需要单独链接libc++fs,所以clang++下移除-lstdc++fs是正确的操作,和当前链接错误无关。
内容的提问来源于stack exchange,提问作者Giox79
相关产品推荐
相关产品推荐

