c++ - 如何在 g++ 中链接同一库的不同版本?

标签 c++ linux gcc linker makefile

我想知道如何在 SLES10 机器上加载两个不同版本的 libstdc++.so。我的客户有一个进程 Foo,它是用 GCC 4.1.2 构建的,因此使用 6.0.8 版本的 libstdc++.so。我们还在构建名为 libBar.so 的共享库。该库将在运行时由 Foo 动态加载。 libBar.so 是使用 GCC 4.3.6 和 libstdc++ 版本 6.0.10 编译的。

目前,当我尝试让 Foo 加载 libBar.so 时,出现以下错误。

error: unable to load shared object '/usr/lib64/libBar.so': /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by /usr/lib64/libBar.so)

目前,我能让它工作的唯一方法是更改​​我的库加载顺序(通过 ld.so.conf),以便 Foo 和 libbar.so 都加载相同的 (6.0.10) libstdc++。所以。但是,这不是 vialbe 解决方案,因为它需要我修改客户端的系统。

我想做的是让 Foo 加载它的 libstdc++.so 版本和 libBar.so 链接到它自己的 libstdc++.so 版本,但我不知道如何编写我的 Makefile 来实现这一点.到目前为止,这是我在 Makefile.am 中的 LIBADD 行...

libBar_la_LIBADD = ../../vendor/SLES10/lib/libstdc++.so.6.0.10

我假设想要特定版本的 libstdc++.so。但是,当我针对完全编译和链接的 libBar.so 运行 ldd 时,这是我看到的行...

libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00002aaaaeac5000)

为什么它不专门链接到 libstdc++.so.6.0.10?我应该怎么做?

最佳答案

我在使用 libstdc++ 的过时版本的第 3 方库中遇到了类似的问题。 .

我通过静态预链接第 3 方库与旧版本的 libstdc++ 解决了这个问题.最终结果是另一个没有 Unresolved 共享库 libstdc++符号。命令行是这样的:

ld --relocatable -o lib3rd-party-prelinked.so lib3rd-party.so /usr/lib64/libstdc++.a.6

然后我用了lib3rd-party-prelinked.so而不是 lib3rd-party.so . (在 --relocatable 中查找 man ld)。

在我的案例中这是可能的,因为第 3 方库公开了一个 C API,其接口(interface)中没有使用 C++ 标准库组件。

如果您的第 3 方库在其接口(interface)中公开了 C++ 标准库类,这些类的 ABI 在这些类之间是不同的 libstdc++版本,那是行不通的。例如。您的应用程序通过了 std::list<>将新的 ABI 连接到需要 std::list<> 的第 3 方库使用旧的 ABI 版本。即使它链接,也会在运行时导致未定义的行为。

关于c++ - 如何在 g++ 中链接同一库的不同版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21783761/

相关文章:

c++ - 如何制作抽象模板类的 vector

c++ - 默认的构造函数和析构函数是内联的吗?

c++ - wchar_t 和编码

linux - Logrotate 脚本未运行

c - 从多个套接字中选择 - 正确的 NFSD 值?

c++ - 在 ifstream 对象上调用 close 时出现段错误

c++ - pthread_getspecific(key) 得到的不是 NULL 结果,但没有调用 pthread_setspecific(key),为什么?

c - GCC 将寄存器 args 放置在堆栈上,并在局部变量下方留有间隙?

gcc - 为什么丢失的共享库会致命?

gcc - 为什么 gcc 在创建汇编代码时会这样做?