假设使用myapp.exe
构建了应用g++
,并使用了标记-static-libstdc++
,以便可以在没有libstdc++.so
的环境中安装它。 myapp.exe
还为某些函数plugf
添加了插件支持,可以通过dlopen
从分片库动态加载。
如果libplug.so
是一个也链接到libstdc++
的插件库,那么它如何能够以myapp.exe
的方式使用?
如果动态链接libstdc++
,这很简单,因为myapp.exe
和libplug.so
都可以使用相同的动态加载标准库,但我不清楚它是如何最好的使用静态链接的标准库来执行此操作。
我考虑的方法是让libplug.so
也使用标记-static-libstdc++
,然后使用version script
{
global: plugf;
local: *;
};
确保使用其标准库版本,但这意味着会有两个libstdc++
副本加载到内存中。我知道这种方法不会被C ++标准祝福,因为它会有ORD违规,但它是libstdc++
以任何方式支持的东西吗? manual部分的Multiple ABI testing
部分确实引用了类似的情景。
答案 0 :(得分:1)
是的,这个解决方案可行,但
删除由std::allocator
在不同C ++运行时分配的对象应该可以在Linux上运行,尽管我在libstdc ++ docs中找不到关于此的明确声明。正如米哈伊尔在评论中指出的那样,它确实在Windows上失败了。