我的C ++应用程序使用dlopen
和朋友来实现一个插件系统,其中根据需要加载共享库。插件依赖于当前在可执行文件中定义的类。
我很惊讶地发现,插件无法以某种方式成功编译" 将插件链接到可执行文件"。换句话说,插件编译时没有相关类的定义。为了调查这种情况,我使用nm -m thePlugin.o
查看了插件对象文件的符号。
在nm
的输出中,可执行文件中定义的符号列为(__TEXT,__textcoal_nt) weak external
。关于weak symbols州的维基百科文章
链接二进制可执行文件时,弱声明的符号不会 需要一个定义
所以这似乎是编译成功的原因。
问题A:在哪些情况下会生成这些弱外部符号?这是一种可移植的机制(至少对于OS X和Linux而言)?
问题B:当我的插件引用静态分配的变量(静态类成员或全局extern
变量)时,该符号不是weak external
而是unknown
和编译失败,可能是由于缺乏定义。我可以在外部使这些符号变弱,或者我可以用某种方式将我的插件与二进制文件链接起来吗?