gpt4 book ai didi

gcc - 如何构建同时需要 libstdc++.so.5 和 libstdc++.so.6 的应用程序?

转载 作者:行者123 更新时间:2023-12-03 16:53:01 28 4
gpt4 key购买 nike

我想以重要的通知作为开头,我不是 C/C++ 程序员,并且对库的链接如何在 C 中工作知之甚少。

我们的代码使用 libstdc++.so.6(我认为是 gcc 3.4)。我们有使用 libstdc++.so.5(我认为是 gcc 2.something 或 3.2)的第三方预编译(闭源)库。这是在linux上。我们有第三方库的 .a 和 .so 版本。

是否可以使用 3rd 方库构建我们的应用程序?如何?是否可以在没有 libstdc++.so.5 安装我们的机器的情况下构建/运行我们的应用程序,如何?

如果我忘记了一些重要信息,请告诉我——我几乎不知道与这些东西有什么关系。我意识到一个完整的答案可能是不可能的;我真的在寻找方向和指导。静态链接这个,动态链接,重建那个,预构建某某,切换到版本 x,或符号链接(symbolic link) quizdoodle 等。

更新:

我们尝试使用 dlopenRTLD_LOCAL将 3rd 方库与我们应用程序的其余部分隔离开来。这似乎大部分都有效,但是,由于未知原因,我们留下了大量的内存泄漏。我们怀疑,当我们调用 dlopen , 第三方库会引入 malloc 之类的符号从已经加载的 .so.6 开始,事情变得一团糟。

傻笑,我们尝试将第三方库放入 LD_PRELOAD ,然后运行我们的应用程序,内存泄漏似乎完全消失了。

最佳答案

您可以尝试围绕您的 3rd 方库构建一个包装库:使用该库的静态版本 + 将其与静态标准库链接(-static-libgcc - 确保通过 -L 选择正确的版本)。要做的重要事情是正确关闭此包装库,即只应导出原始第 3 方库中的符号,应隐藏其他所有内容。这样,您的包装库将为您的应用程序公开所有需要的符号并将标准内容封装在其中。请注意,特别是如果您的代码和第 3 方代码之间共享某些内存操作(例如,您在代码中分配内存并在第 3 方中取消分配),它不能保证有效......在这种情况下,唯一的选择是保留第 3 次派对库在不同的进程空间中。

我不认为上面提到的动态选项会起作用,因为你会遇到完全相同的问题 - 只是稍后。

一般来说,最好不要在同一进程空间中混合具有不同运行时间的二进制文件。这几乎总是灾难的根源。

关于gcc - 如何构建同时需要 libstdc++.so.5 和 libstdc++.so.6 的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1655310/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com