我正在向系统添加两个类和库,parent.so
并child.so
从中派生。
问题是当程序加载时,child.so
它无法从parent.so
.
发生什么了,
nm -D child.so
会给出类似的东西(我刚改了名字)
U _ZN12PARENT15virtualFunctionEv
程序运行会崩溃
_handle = dlopen(filename, RTLD_NOW|RTLD_GLOBAL); //filename is child.so
它会给出一个错误LD_DEBUG = libs
symbol lookup error: undefined symbol: _ZN12PARENT15virtualFunctionEv (fatal)
我无法解释的是,我尝试LD_DEBUG = symbols
使用 GDB,在运行时dlopen
,日志显示它基本上尝试在系统中的所有库中查找,除了parent.so
定义符号的位置。但是从库日志parent.so
已经加载并且代码已经运行,并且它与所有其他库的路径相同。
......
27510: symbol=_ZN12PARENT15virtualFunctionEv; lookup in file=/lib/tls/libm.so.6
27510: symbol=_ZN12PARENT15virtualFunctionEv; lookup in file=/lib/tls/libc.so.6
27510: symbol=_ZN12PARENT15virtualFunctionEv; lookup in file=/lib/ld-linux.so.2
27510: child.so: error: symbol lookup error: undefined symbol: _ZN12PARENT15virtualFunctionEv(fatal)
程序或系统如何管理查找符号定义的库?
我是Linux新手,谁能给我一些工作方向?
谢谢。
编辑
用于生成parent.so
文件的命令是
c++ -shared -o parent.so parent.o
类似的child.so
。此处链接是否缺少任何信息?看起来孩子只包括父母的头文件。
编辑2
经过另一次测试,调用
_handle = dlopen("parent.so", RTLD_NOW|RTLD_GLOBAL);
之前的崩溃线会解决问题,我认为这意味着最初parent.so
没有加载。但我仍然不太清楚原因。