我想知道如何在 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/