我们使用商业软件(比如A.exe),它使用DSO作为必须定义某些功能的插件,其中一个插件(比如B.so)与boost-1.43静态链接。根据其文档,B.so不需要boost :: filesystem库,因此它不会在libboost_filesystem.a中链接。
现在我正在开发一个插件(比如C.so),它与boost-1.42动态链接(编辑:我尝试了与A.exe的B.so插件相同的boost-1.43,它没有用,并且给了我使用相同的符号查找错误。),然后C.so使用boost文件系统,ldd C.so显示可以找到libboost_filesytem.so。 问题是,当我通过A.exe运行我的插件C.so时,它会显示“A.exe:符号查找错误:B.so undefined symbol boost :: filesystem :: detail :: status_api(...)”。
然后当我通过在B.so上运行nm来调试它(插件附带A.exe)来寻找符号时,我发现运行“nm -D -C B.so | grep'U'| grep boost “在shell中给了我”U boost :: filesystem :: detail :: status_api“,这意味着B.so有一个未定义的符号条目。
我很困惑:
1)这种混合增强版本的方式是否可行?
2)如果A.exe的文档说某些提升库是静态链接的(显然文件系统不需要,所以没有链接),为什么我在运行“nm -D -C B.so”时得到未定义的符号条目( -D用于动态符号,-C用于解码名称),特别是对于boost filesytem lib?
3)当我通过A.exe运行我的插件C.so时,为什么会出现“符号查找错误”?我的插件C.so应该只查找我提供的已经链接的boost文件系统库吗?而不是那个在B.so插件中静态链接的那个?
4)即使使用插件系统,主exe也会一直寻找第一个注册符号条目,而不是我的插件链接的那个吗?
5)这是因为两个插件之间的版本冲突吗?
有关加载插件时如何导入符号的文档?
任何帮助将不胜感激。