通过链接到静态库加载动态库

dynamic library loading with linking to static library

本文关键字:加载 动态 静态 链接      更新时间:2023-10-16

我有一个程序结构

静态库(ACE)

静态库(通用.a)

动态库插件 1(1.so)

插件 2(2.so) 和可执行文件

plugin1, plugin2 and executable都同时使用common.alibACE.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函数,错误是抱怨未定义的符号,如下所示:

[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链接的最可能原因是符号在源级别具有__attribute__((visibility("hidden")))。文档在这里。

为什么 ACE 开发人员将其标记为这样,我不知道。