gpt4 book ai didi

c++ - 在标准库中静态链接时如何支持动态插件?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:07:17 25 4
gpt4 key购买 nike

假设一个应用程序 myapp.exe 是使用 g++ 构建的,它使用标志 -static-libstdc++ 以便它可以安装在没有 libstdc++.so 的环境。 myapp.exe 还添加了对某些函数 plugf 的插件支持,这些函数可以通过 dlopen 从分片库中动态加载。

如果 libplug.so 是这样一个也链接到 libstdc++ 的插件库,它如何以能够与 myapp 一起工作的方式链接.exe?

如果 libstdc++ 是动态链接的,这很简单,因为 myapp.exelibplug.so 可以使用相同的动态加载标准库,但我不清楚如何使用静态链接的标准库最好地做到这一点。

我正在考虑的一种方法是让 libplug.so 也使用标志 -static-libstdc++ 然后使用 version script

{
global: plugf;
local: *;
};

确保使用其版本的标准库,但这意味着将有两个 libstdc++ 拷贝加载到内存中。我知道这种方法不会受到 C++ 标准的支持,因为它会违反 ORD,但 libstdc++ 是否以任何方式支持它? manualMultiple ABI testing 部分部分确实引用了一个听起来相似的场景。

最佳答案

是的,这个解决方案可行,但是

  • 由于代码重复引入了一定的开销
  • 由于ABI changes in recent libstdc++,如果您尝试在插件/应用程序之间传递STL 对象,它可能会中断

在不同的 C++ 运行时删除由 std::allocator 分配的对象应该在 Linux 上工作,尽管我在 libstdc++ 文档中找不到关于此的明确声明。正如 Mikhail 在评论中指出的那样,它在 Windows 上确实失败了。

关于c++ - 在标准库中静态链接时如何支持动态插件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47841812/

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