通过链接到静态库加载动态库
dynamic library loading with linking to static library
我有一个程序结构
静态库(ACE)
静态库(通用.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函数,错误是抱怨未定义的符号,如下所示:
[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 开发人员将其标记为这样,我不知道。
相关文章:
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 在 Linux 平台的 C++ 中动态加载 DLL
- 在Qt C++单元测试中动态加载QQuickWindow而不是QQuickWidget
- 使用动态链接加载程序 <dlfcn.h> 而不是直接函数调用的目的是什么?
- 从 C 可执行文件加载动态库时收到错误C++"undefined symbol"
- 从动态加载的 dll 内部调用C++函数
- 使用CFBundleCreate在C++中的Mac上加载动态共享库(DLL)
- C/C++函数动态加载器(helper)
- 地址清理器和运行时加载动态库 ->(<未知模块>)
- 从zip、内存等加载动态库
- 我们可以在链接期间加载动态库吗
- 从内存加载动态库
- 加载动态链接库的第三种方法?大头针
- 以下代码是如何工作的(从DLL加载动态类)
- 通过链接到静态库加载动态库
- 在 Mac 中加载动态库路径错误
- 如何避免在c++项目(XCode)中在其他机器上加载动态库
- 无法在运行时加载动态共享库,包括C++中的另一个共享库
- 无法加载动态库/usr/lib/OGRE/RenderSystem_GL
- 是否有任何链接器标志告诉在打开后延迟加载动态库