C++ 链接到静态库的动态库加载
我有一个程序结构 静态库(ACE) 静态库(common.a) 动态库插件1(1.so) 插件2(2.so)和可执行文件C++ 链接到静态库的动态库加载,c++,plugins,linker,shared-libraries,static-libraries,C++,Plugins,Linker,Shared Libraries,Static Libraries,我有一个程序结构 静态库(ACE) 静态库(common.a) 动态库插件1(1.so) 插件2(2.so)和可执行文件 plugin1、plugin2和executable都使用common.a和libACE.a 请按照此处的教程进行操作: 编译可执行文件时,我仅链接这两个静态库,如下所示: g++ -g -DUNIX -DLINUX -Wall -D__NUMBER_FIELD_ID__ -I/opt/ACE_wrappers -Ilib/ -I. -I./common -I./com
plugin1、plugin2和executable
都使用common.a
和libACE.a
请按照此处的教程进行操作:
编译可执行文件时,我仅链接这两个静态库,如下所示:
g++ -g -DUNIX -DLINUX -Wall -D__NUMBER_FIELD_ID__ -I/opt/ACE_wrappers -Ilib/ -I. -I./common -I./common/lib -I../inc -I/opt/pct/pctlib/inc -o acs_d acs_d.o -L../lib -Wl,--export-dynamic -rdynamic -Wl,--whole-archive /opt/ACE_wrappers/ace/libACE.a common/libcommon_d.a -Wl,--no-whole-archive -ldl -lrt -lpthread
[CModuleMgr] loadCModule(): Errors occurred when opening the module. nCModuleId[1] pLibHandle[(nil)] sCModulePath[/opt/acs/adapter/libadapter_d.so] sError[/opt/acs/adapter/libadapter_d.so: undefined symbol: _ZN17ACE_Event_Handler10set_handleEi]
关键是,当我使用dlopen打开这两个插件时,一个成功,一个失败
成功的一个使用多个ACE函数,错误为未定义符号,如下所示:
g++ -g -DUNIX -DLINUX -Wall -D__NUMBER_FIELD_ID__ -I/opt/ACE_wrappers -Ilib/ -I. -I./common -I./common/lib -I../inc -I/opt/pct/pctlib/inc -o acs_d acs_d.o -L../lib -Wl,--export-dynamic -rdynamic -Wl,--whole-archive /opt/ACE_wrappers/ace/libACE.a common/libcommon_d.a -Wl,--no-whole-archive -ldl -lrt -lpthread
[CModuleMgr] loadCModule(): Errors occurred when opening the module. nCModuleId[1] pLibHandle[(nil)] sCModulePath[/opt/acs/adapter/libadapter_d.so] sError[/opt/acs/adapter/libadapter_d.so: undefined symbol: _ZN17ACE_Event_Handler10set_handleEi]
对于主程序,我尝试使用命令nm来查找符号
$ nm acs_d | grep _ZN17ACE_Event_Handler10set_handleEi
000000000048f240 t _ZN17ACE_Event_Handler10set_handleEi
它在那里,但是插件找不到它!我使用了像-Wl,--export dynamic-rdynamic-Wl,--whole archive这样的选项。
但它仍然找不到这个符号。有什么想法吗
它在那里,但是插件找不到它
不,符号不在那里
或者更确切地说,符号具有内部链接(t
),并且在链接到的ELF图像之外不可见或不可用。全局可见符号具有外部(T
)链接
符号具有t
链接的最可能原因是符号在源级别具有\uuuu属性((可见性(“隐藏”))
。文件
我不知道为什么ACE开发者会这样标记它