【笔记】unix系统下,多个静态库链接到一个可执行程序后,执行时出现莫名奇妙的问题

在web_transmit_service中集成了rayvision和aspera两个引擎后,在Mac和Linux环境下出现了vector异常,具体表现为push_back操作次数与size不一致且内容不符。通过调整引擎的链接方式及编译选项解决了该问题。

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

前提说明:

web_transmit_service是一个传输管理程序,内嵌rayvision引擎和aspera引擎,其中引擎是静态库,两个引擎封装的接口特别相似


出现问题:

vector异常,push_back()执行5次,但size()却是3,而且遍历出的结果与push进去的内容是不一样的,

另外,只链接一个引擎时就是正常的,同时链接两个引擎才会执行异常,

而且,windows下是正常的,虽然它用的是动态库(只是表达代码本身没问题的意思)


问题处理:

mac下,

将引擎由静态库改成动态库,不再有异常

linux(Ubuntu14.4、CentOS6.5)下,

将引擎由静态库改成动态库,也不再有异常

但由于动态库依赖,导致程序安装比较麻烦(安装机器缺少依赖库),所以,还是保持静态库,不过编译引擎时去掉了“-O1”的编译优化项


----------------------------------------------------------------------------------


其他:


mac下,编译aspera引擎时,发现IBM给的静态库和我的代码不能正常链接,原因是他们的编译选项中有“-stdlib=libstdc++”这个选项,而我的代码用的是“-std=c++11”,两个用的底层的STL是不一样的,导致一系列的链接问题


其实,我们默认的编译选项是“-stdlib=libc++”,而它用的是默认的STL,而“-stdlib=libstdc++”,用的是另一个版本的STL,所以,才有问题。(-std=c++11也相当于内嵌有一个"-stdlib=libc++"这样的选项,不管我表达的对不对,我就是想表达这层意思,用的是默认的STL)


最终,IBM那边重新编译了一个静态库给我(改用编译选项“-stdlib=libc++”),接着就出现最前面的执行异常的问题。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值