我有一个使用共享对象(*.so
)的应用程序作为在运行时加载的插件。我还有一个静态库(*.a
),它包含一些静态函数。如果PluginA和PluginB都链接到库,他们是否也会获得自己的静态函数副本?
答案 0 :(得分:0)
是的,两个插件都将获得静态.a库中包含的函数/符号的副本。要在共享库或插件中使用,.a库必须是与位置无关的代码,可以在编译和链接时使用选项-fPIC来实现。
你还必须确保PluginA和PluginB没有使用选项RTLD_GLOBAL进行dlopened(),因为PluginA和PluginB中包含的静态库的两个副本之间可能存在名称冲突。如果你在编译时动态链接PluginA和PluginB,这个名字冲突的问题在共享库中变得更加明显。