c++编译器(g++)版本差异导致标准库函数崩溃

文章讲述了C++应用程序在Linux平台上使用g++9.3.0编译时,因第三方SDK(g++4.9.3)的static-libstdc++导致std::cout崩溃。通过分析编译命令和链接顺序,发现不同版本libstdc++的兼容性问题,解决方案是确保test程序优先链接其自身的libstdc++。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

平台: Linux

一款c++应用程序(g++ 9.3.0)接入一个第三方SDK(g++ 4.9.3).so,并且该SDK内部静态依赖libstdc++(对应链接选项命令-static-libstdc++)

场景

在这款c++应用程序中使用标准库输出函数std::cout, 一编译运行后直接signal fault,  gdb bt查看堆栈奔溃在这个函数std::cout 里边,并且这个奔溃显示调用到第三方库的so中的std::cout中,并不是依赖的应用程序本地的libstdc++库

 

分析

分析在编译本地c++应用程序时使用的编译命令如下

假设程序文件为test.cpp

假设第三方库为libthird.so

g++ -g -o test test.cpp -I./ -L./ -lthird -Wl,-rpath="/home/thirdPath"

这里由于test依赖第三方库third,而第三方库静态依赖了libstdc++,所以在third中引入了g++ 4.9.3 版本对应的std::cout实现,而test动态链接third,但是在test程序装载链接时,由于third先于test自身动态依赖的libstdc++库,所以将third中的std::cout符号先加载到了符号表,导致test执行程序时的std::cout执行到了third中,而由于编译test的g++版本为9.3.0(链接的对应的libstdc++库),而我们也知道一般我们是不建议混用不同编译器版本的c++库使用的,容易出现abi兼容问题,导致莫名的crash,而这里也证实了这个问题,对于不同的libstdc++ 库可能底层实现存在差异,编译器编译时可能存在差异,所以这里通过在编译test时优先链接test本身的libstdc++库来解决问题,通过以下编译命令

g++ -g -o test test.cpp -I./ -L./ -lstdc++ -lthird -Wl,-rpath="/home/thirdPath"

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农飞侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值