假设应用程序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++
以任何方式支持的东西?它的Multiple ABI testing
部分的manual部分确实引用了一个听起来相似的场景。
是的,这个解决方案可行但是
删除std::allocator
在不同C ++运行时中分配的对象应该可以在Linux上运行,尽管我在libstdc ++ docs中找不到关于它的明确声明。正如Mikhail在评论中指出的那样,它在Windows上失败了。