【发布时间】:2014-03-14 01:46:29
【问题描述】:
我试图弄清楚如何在 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 时,出现以下错误。
错误:无法加载共享对象 '/usr/lib64/libBar.so': /usr/lib64/libstdc++.so.6:未找到版本“GLIBCXX_3.4.9” (/usr/lib64/libBar.so 需要)
目前,我可以让它工作的唯一方法是更改我的库加载顺序(通过 ld.so.conf),以便 Foo 和 libbar.so 都加载相同的 (6.0.10) libstdc++。所以。但是,这不是一个可行的解决方案,因为它需要我修改客户端的系统。
我想做的是让 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?我应该怎么做?
【问题讨论】:
-
您不想在同一个进程中加载 2 个版本的 libstdc++,真正的目标是确保加载的版本是较新的。
-
我在完全相同的版本(RHEL 5,不是吗?)上遇到了同样的问题,@MadScientist 的评论对我有用。
标签: c++ linux gcc linker makefile