Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 链接到静态库的动态库加载_C++_Plugins_Linker_Shared Libraries_Static Libraries - Fatal编程技术网

C++ 链接到静态库的动态库加载

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

我有一个程序结构

静态库(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./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开发者会这样标记它