linux - 如何在centos6上分发c++11共享库

标签 linux gcc c++11 linker

我有一个 c++11 库 ( https://github.com/matiu2/cdnalizer )。我想在 centos6 和 ubuntu12.04 LTS 上分发它。

它可以在 Ubuntu 13.10 和 Gentoo 上顺利编译。

我尝试尽可能多地静态编译,但它仍然依赖于 centos 没有的 glibc:

matiu@matiu-laptop:~/projects/cdnalizer/build/src/apache$ readelf -d mod_cdnalizer.so | grep NEED
 0x0000000000000001 (NEEDED)             Shared library: [libapr-1.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000006ffffffe (VERNEED)            0xd520
 0x000000006fffffff (VERNEEDNUM)         3

构建线:

/usr/bin/g++  -fPIC -I/usr/local/include -I/usr/include -I/usr/include/x86_64-linux-gnu -I/usr/include/x86_64-linux-gnu/c++/4.8 -Wall -Wextra -g   -shared -Wl,-soname,mod_cdnalizer.so -o mod_cdnalizer.so CMakeFiles/mod_cdnalizer.dir/mod_cdnalizer.cpp.o CMakeFiles/mod_cdnalizer.dir/config.cpp.o CMakeFiles/mod_cdnalizer.dir/filter.cpp.o ../libbase.a -lapr-1 

我曾尝试在 centos 上编译 gcc-4.8.2,但它生成的二进制文件具有类似的 glibc 依赖项:

[root@matt src]# ./test_config 
./test_config: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./test_config)
./test_config: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by ./test_config)

我听说您无法逃避共享库的 glibc 依赖项,因为 c++ 会抛出异常,因此需要共享 libstdc++(但我的库不会跨库边界抛出异常)。

我还听说你不能在 glibc 中静态链接,因为静态库不是用 -fPIC 编译的。


我的主要问题是:

  • 如何在 centos6 上分发我的 c++11 共享库?

我的子问题是:

  • 我可以在 ubuntu 13.10 上编译一个 c++11 共享库,并在 centos6(和旧版 ubuntus)上加载它吗?怎么样?
  • 我可以在 centos6 上编译一个 c++11 共享库并让它在标准的 centos 安装上运行吗?

(不要担心 Apache2.2 与 2.4 的依赖关系……这很简单)

最佳答案

Can I compile a c++11 shared library on centos6 and have it work on standard centos installs ?

如果您不能使用标准 CentOS 6 g++/glibc/libstdc++ 构建您的代码,那么不,它不会在标准 CentOS 6 安装上运行。

CentOS 发行版提供长期支持 (LTS)。关键错误会通过更新得到修复,但软件通常不会改变。 This is a feature .即使使用第 3 方存储库(例如 EPEL),CentOS 的可用软件也不是最新的。

Can I compile a c++11 shared library on ubuntu 13.10, and have it load on centos6 (and older ubuntus) ? how ?

如果您可以使用 g++ 4.4 工具链编译它,当然可以。在这种情况下,您不能使用更高级的编译器。快速搜索 Ubuntu 的 12.04 LTS 软件包列表显示 libstdc++6-4.5-dbg 使用 libstdc++.so.6 版本,根据上述错误消息,该版本将向后不兼容。

How can I distribute my c++11 shared library on centos6 ?

如上所示,您将至少有一个更新的依赖项 (libstdc++.so.6),您需要将其与您的库一起发布,并安装在某个奇怪的位置,随之而来的是令人头疼的问题(LD_LIBRARY_PATH,任何其他 C++ 插件会发生什么,等等)。并在某个时候更新。

一些企业用户会反对这样的东西,主要是因为它与现有操作系统不能很好地融合。

依赖项中的静态链接(如 Ali's answer 中的开发工具集)也可以工作。它也不是没有问题(再次更新依赖项),但可能是您的代码在 CentOS 6 上运行的最佳机会。

我从 Ali 的回答的评论中看到,devtools 1 (gcc 4.7.0) 不起作用,这使得 devtools 1.1 不太可能起作用。因此,在这种情况下,您似乎需要 C++11 支持达到 gcc 4.8 级别。

关于linux - 如何在centos6上分发c++11共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22109937/

相关文章:

c++ - 如何在一行中用 C++11 初始化一个包含 n 个相等元素的 vector ?

c++ - C++中的动态内存分配?

linux - 将 "man"替换为 "?"

gcc - GCC -MM 标志的 "system headers"的确切含义

linux - 使用大型终端的 Vim 中的选项卡切换缓慢

c - GCC 多个函数定义链接器错误

c++ - GCC 不能使用未定义的运算符=

c++ - 使用 phoenix::bind 将 spirit 解析的结构传递给函数

linux - CoAP数据包的大小是多少?

linux - PDF Lib 在 Linux 服务器上安装失败。使用 pecl 安装 pdflib