我对以下针对Linux和Windows,GCC,MinGW和MSVC(如果可能)的问题的解决方案感兴趣。
我有一个我编写的应用程序支持用户定义的共享库导入(添加模块)。应用程序扫描目录,查找* .dll文件或* .so文件,并在运行时动态加载它们。
到目前为止,所有用户模块都完全由自给自足的代码组成。也就是说,构成DLL / SO的目标文件从链接器的角度来看没有产生不完整的引用。
不,我想让模块能够使用编译成构成导入这些模块的二进制应用程序的目标文件的函数。换句话说,我想让他们使用我的一些库代码,而不必编译成DLL / SO本身。不幸的是,在构建DLL / SO的链接器阶段,这个因投诉没有解决的符号而失败。
这可能吗?
答案 0 :(得分:2)
使用您要在用户模块和程序之间共享的代码创建一个库。 现在,用户程序和您的程序可以链接到这个新库。
答案 1 :(得分:1)
为什么不只是创建一个由主应用程序和所有用户库链接的DLL ...这是完全合法,安全的,并且做你想要的AFAICT。
答案 2 :(得分:1)
对于Linux和其他ELF平台,这是完全可能的。您只需从可执行文件中导出相应的符号,它们将优先于动态库中的相同符号。有关详细信息,请参阅this question。
正如该问题的答案之一所示,您可以将要导出的函数作为回调传递给动态库中的某些初始化函数。
答案 3 :(得分:0)
我的第一个想法是:找出另一种方法来做到这一点......要求附加组件通过已知的接口类型进行通信,然后就不需要尝试欺骗链接器......