我有一个程序结构
静态库(ACE)
静态库(common.a)
动态库插件1(1.so)
插件 2(2.so) 和可执行文件
plugin1, plugin2 and executable
所有人都使用两者common.a
并libACE.a
按照此处的教程进行操作: http: //www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html。
我只在编译可执行文件时链接这两个静态库,如下所示:
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
关键是,我用dlopen打开这两个插件,一个成功一个失败,成功的一个使用了更多的ACE函数,报错是报undefined symbol如下图:
[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.
但它仍然找不到这个符号。任何想法?