假设应用程序myapp.exe
是使用g++
构建的,并且它使用标志-static-libstdc++
,以便可以将其安装在没有libstdc++.so
的环境中。myapp.exe
还为某些功能plugf
添加了插件支持,这些功能可以通过shard库通过dlopen
动态加载。
如果libplug.so
是这样的插件库,也链接到libstdc++
,那么它如何以一种能够与myapp.exe
一起使用的方式?
如果libstdc++
在动态上链接,这很简单,因为myapp.exe
和libplug.so
都可以使用相同的动态加载标准库,但是我尚不清楚如何最好使用静态链接的标准库来完成此操作。
我正在考虑的一种方法是让libplug.so
也使用标志-static-libstdc++
,然后使用版本脚本
{
global: plugf;
local: *;
};
确保使用其标准库的版本,但这意味着将有两个加载到内存中的libstdc++
的副本。我知道这种方法不会受到C 标准的祝福,因为它会违反Ord违规,但是libstdc++
可以以任何方式支持吗?手册部分的Multiple ABI testing
部分确实引用了听起来相似的场景。
是的,此解决方案可以起作用,但
- 由于代码重复,它引入了某些开销
- ,由于您最近的libstdc 在插件/应用程序之间尝试传递插件/应用程序之间的stl对象,它可能会破裂。
删除由std::allocator
在不同C 运行时分配的对象应该在Linux上工作,尽管我在LibstDC 文档中找不到有关此的明确说明。当Mikhail在评论中指出时,它确实在Windows上失败。