Ubuntu16.04下GCC未链接libstdc++导致C++编译链接错误求助
排查Ubuntu 16.04下g++ 5.4的C++链接器错误
嘿,我来帮你捋捋这个链接器问题——我在Stack Overflow上处理过不少类似的场景,先从最容易踩的坑说起:
你现在用的是gcc命令编译C代码,虽然加了-std=c++11,但gcc默认不会自动帮你链接libstdc库,而g++会自动处理这个环节。这大概率是你碰到链接报错的根源之一,建议直接把编译命令换成g++,比如:
g++ -std=c++11 -m64 -fPIC ...(你的其他库参数)
接下来拆解你提到的几个关键点:
关于GLIBCXX版本符号的含义
你用strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX看到的那些字符串,是libstdc++用来标记不同版本特性的专属符号:
GLIBCXX_3.4是最基础的版本,对应早期C++标准的核心支持GLIBCXX_3.4.11是在libstdc++ 4.4版本里引入的,已经包含了对C0x(也就是C11的前身)部分特性的支持
不过要注意,g++ 5.4对应的libstdc++应该支持到更高的版本(比如GLIBCXX_3.4.21),如果你只看到低版本的符号,可能是系统里的libstdc++.so.6软链接指向了旧版本的库?你可以用这条命令看看它的指向:
ls -l /usr/lib/x86_64-linux-gnu/libstdc++.so.6
正常情况下它应该指向libstdc++.so.6.0.21左右的版本(这是g++5.x对应的标准库版本)。
链接器报错的通用排查步骤
如果换了g++还是有问题,可以按这几步排查:
- 确保编译和链接的一致性:所有源文件都要用
-std=c++11编译,全程用g处理,别混着用gcc和g,不然很容易出现链接时的符号不匹配 - 定位缺失的具体符号:虽然你用
c++filt处理了错误,但如果能拿到具体的缺失符号(比如std::thread()这类),能更快定位问题。通用的检查方法是:- 用
nm -D /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep 你的缺失符号名,确认这个符号是不是真的不在系统的标准库里 - 如果符号确实不存在,要么是你的代码用到了g5.4不支持的C特性(不过g5.4对C11的支持已经很完整了),要么是你链接的第三方库是用更高版本的g++编译的,依赖了更高版本的GLIBCXX符号
- 用
- 检查环境变量干扰:看看有没有设置
LD_LIBRARY_PATH导致链接到了其他路径的旧版libstdc++?用echo $LD_LIBRARY_PATH就能查看,或者编译出可执行文件后用ldd 你的程序名看看实际链接的库路径
强制链接正确的libstdc++版本
如果确认是系统软链接指向了旧库,可以在编译命令里手动指定g++5.4对应的标准库路径,比如:
g++ -std=c++11 -m64 -fPIC -L/usr/lib/gcc/x86_64-linux-gnu/5 -lstdc++ ...(你的其他参数)
这样会强制链接g5.4自带的libstdc版本,避开系统默认的可能过时的软链接。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

