【发布时间】:2009-10-31 19:15:44
【问题描述】:
我想以重要的通知作为开头,即我不是 C/C++ 程序员,并且对 C 中的库链接如何工作知之甚少。
我们的代码使用 libstdc++.so.6(我认为是 gcc 3.4)。我们有使用 libstdc++.so.5(我认为是 gcc 2.something 或 3.2)的第三方预编译(闭源)库。这是在linux上。我们有第三方库的 .a 和 .so 版本。
是否可以使用 3rd 方库构建我们的应用程序?如何?是否可以在没有安装 libstdc++.so.5 的情况下构建/运行我们的应用程序,如何?
如果我忘记了一些重要信息,请告诉我 - 我几乎不知道与这些内容有什么关系。我意识到一个完整的答案可能是不可能的;我真的在寻找方向和指导。静态链接 this、dynamic that、rebuild that、prebuild so-and-so、切换到版本 x 或符号链接 quizdoodle 等。
更新:
我们尝试使用 dlopen 和 RTLD_LOCAL 将第 3 方库与我们应用程序的其余部分隔离开来。这似乎大部分起作用了,但是,由于未知原因,我们留下了大量的内存泄漏。我们怀疑,当我们调用dlopen 时,第三方库会从已经加载的.so.6 中提取malloc 之类的符号,然后事情就会变得混乱。
为了傻笑,我们尝试将第三方库放入LD_PRELOAD,然后运行我们的应用程序,内存泄漏似乎完全消失了。
【问题讨论】:
-
我不禁觉得命名空间可以帮助解决这个问题。由于供应商不会修复他们的库,是否可以让他们将他们的东西放在一个额外的命名空间中,比如
namespace 5 {}。也就是说,他们的库将使用5::malloc,而最新的东西将只使用malloc。 (我回避了一些问题,比如为什么他们在 C++ 程序中使用malloc)。
标签: gcc build linker libstdc++