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

来源:互联网 发布:wan 微型端口 ip 编辑:程序博客网 时间:2024/05/22 01:45

前提说明:

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++”),接着就出现最前面的执行异常的问题。


0 0