gpt4 book ai didi

C++ 链接器问题 -- 动态和静态库依赖

转载 作者:搜寻专家 更新时间:2023-10-31 01:23:20 24 4
gpt4 key购买 nike

我有一个依赖于库 Y 的库 X。我有一个从 X 调用函数的应用程序 A。

假设库 Y 仅作为静态库提供。如果 X 和 Y 都静态链接到 App A,则一切正常。但是,我希望 X 成为一个动态(共享)库。

目前,静态链接 Y 不起作用,因为动态 X 看不到 Y 中的内容。

有没有什么方法可以让 Y 成为一个动态库,而不必将 X 静态链接到 Y?我们不能通过包装 Y 来获得 Y 的动态版本。一般来说,是否有可用的链接器选项以某种方式将 Y(静态链接到 A)暴露给 X(动态库)?

我问的原因是我还有库 Z,它也依赖于 Y。我不想将 Y 静态链接到 X 和 Z,这样 X 和 Z 就可以是动态的。

希望这不会太困惑。感谢您的帮助。

最佳答案

您想编译静态链接 Y 的 X 的动态版本。然后应用程序只链接 X,而忽略 Y 的使用。我认为您是否可以这样做因平台而异——我知道 GCC GNU 链接器将允许它。问题是编译为静态库的代码和编译为动态库的代码并不相同;动态库的生成使得它们可以重新定位在内存的任何区域(这使得它们可以共享)。在 Linux 和 Solaris 上,这意味着共享库是使用“-fpic”指令编译的。如果您在创建共享库时混合使用 PIC 代码和非 PIC 代码(当您将 Y 静态链接到 X 时会发生这种情况),您将收到有关未解析文本重定位的错误——这是链接器提示的部分你的图书馆是不可共享的。您可以通过传递 -mimpure-text 来禁用警告。但是,请注意内存中包含未使用“-fpic”编译的代码的任何页面(因此包含对 Y 的调用的任何页面)将不会在应用程序之间共享。因此,如果多个应用程序正在使用您的库,它们将无法获得通常使用共享库所带来的全部内存节省。如果您的平台是 MSVC,Windows 上可能有等效的标志。

编辑:在我第一次阅读时没有发现你的 Z 问题。尝试使用“-z undefs”编译 X 和 Z,这样 GCC 将忽略 undefined symbol ,然后当你链接你的应用程序时确保 Y 在链接上X 和 Z 之后的行(后来的库填写在早期库中找到的引用)。

关于C++ 链接器问题 -- 动态和静态库依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1614970/

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