我正在努力弄清楚如何在一台libstdc++.so机器上加载两个不同版本的SLES10。我的客户端有一个process,它是用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时,我会得到以下错误。
错误:无法加载共享对象‘/usr/lib64 64/libBar.so’:/usr/lib64 64/libstdc++.so.6: version `GLIBCXX_3.4.9‘not (/usr/lib64 64/libBar.so需要)
目前,我能够让它工作的唯一方法是更改我的库加载顺序(通过ld.so.conf),以便Foo和libbar.so都加载相同的(6.0.10) libstdc++.so。但是,这不是vialbe解决方案,因为它要求我修改客户机的系统。
我想做的是让Foo加载它是libstdc++.so和libBar.so链接到它自己版本的libstdc++.so的版本,但是我不知道如何编写我的Makefile来实现这一点。到目前为止,这是我在Makefile.am的LIBADD系列.
libBar_la_LIBADD =.././供应商/SLES10 10/lib/libstdc++.so.6.0.10
我想我想要的是libstdc++.so的特定版本。但是,当我针对完全编译和链接的libBar.so运行ldd时,我看到的是.
libstdc++.so.6 => /usr/lib64 64/libstdc++.so.6(0x00002aaaeac5000)
为什么它不专门链接到libstdc++.so.6.0.10呢?我该怎么做呢?
发布于 2014-02-14 18:45:37
对于一个使用过时版本的libstdc++的第三方库,我也遇到了类似的问题。
我通过静态地将第三方库与旧版本的libstdc++链接来解决这个问题。最终的结果是另一个没有未解决的libstdc++符号的共享库。命令行如下所示:
ld --relocatable -o lib3rd-party-prelinked.so lib3rd-party.so /usr/lib64/libstdc++.a.6然后我用lib3rd-party-prelinked.so代替了lib3rd-party.so。(查找--relocatable in man ld)。
在我的例子中,这是可能的,因为第三方库公开了一个case,它的接口中没有使用C++标准库组件。
如果您的第三方库在其接口中公开了C++标准库类,其ABI在这些libstdc++版本之间是不同的,那么这是行不通的。例如,您的应用程序将一个带有新ABI的std::list<>传递给第三方库,该库期望使用旧的ABI版本的std::list<>。即使它链接,这也会导致运行时未定义的行为。
https://stackoverflow.com/questions/21783761
复制相似问题