小编use*_*253的帖子

在Linux上编译一个共享库以定位所有发行版

我们想要创建一个共享库(.so)来定位所有发行版,包括旧发行版.代码用C++编写并使用C++ 11特性,因此编译器必须至少为gcc 4.7.我们注意到,如果我们在安装了gcc 4.7.2的Linux机器上编译我们的代码(例如,Ubuntu 12.10),那么.so生产的版本1(GNU/Linux),而在较旧的OS(例如,CentOS 5.6)上版本是"版本1(SYSV)" - 具有GNU/Linux更新版本的库不能用于旧版本的操作系统.

所以我们尝试了在CentOS 5.6机器上安装gcc 4.7的方法,使用这个编译器编译我们的代码并与libstdc ++(-static-libstdc ++)静态链接 - 这产生了一个可以在我们找到的每个linux上使用的.so.

这适用于32位.但是,当我们在64位操作系统(CentOS)上遵循相同的方法时,这个错误导致我们尝试链接到的现有libstdc ++.是在没有-fPIC的情况下编译的.

所以我们尝试使用"-with-pic"选项编译gcc 4.7.2源代码,但是我们无法链接到新的libstdc ++.a - 错误是:

/opt/centos/devtoolset-1.1/root/usr/libexec/gcc/x86_64-CentOS-linux/4.7.2/ld:/usr/local/lib/libFoo.so:找不到符号_ZNSs7_M_copyEPcPKcm @ GLIBCXX_3的版本节点. 4 /opt/centos/devtoolset-1.1/root/usr/libexec/gcc/x86_64-CentOS-linux/4.7.2/ld:未能设置动态节大小:错误值collect2:错误:ld返回1退出状态

我们用Google搜索编译libstdc ++与-fPIC可能有问题,但为什么它适用于32位而不适用于64位操作系统?是否有另一种建议的方法来为所有Linux发行版创建一个.so?

c++ linux gcc libstdc++ static-linking

5
推荐指数
1
解决办法
1136
查看次数

标签 统计

c++ ×1

gcc ×1

libstdc++ ×1

linux ×1

static-linking ×1