调用dlopen时未定义符号名称重整问题?

问题描述

我尝试使用dlopen加载动态库。 lib中的代码应在executeable内调用一个函数(与-rdynamic一起编译)。

dlopen出现此错误

undefined symbol: 
_Z10vGnsstraceNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEhS4_

如果我看一下用nm执行的导出符号,我会看到:

0004b779 T    _Z10vGnsstraceNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEhS4_

lib的nm结果是这样的:

         U _Z10vGnsstraceNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEhS4_

看起来应该匹配!?如何让lib知道可执行文件中的功能

根据此https://stackoverflow.com/a/17083153/10551203,它应该可以工作。

任何帮助将不胜感激

Ralf

解决方法

您好,感谢所有关注此内容的人。现在,几天后,我对这个话题有了更多的了解,与我的预期相比,我的真正问题完全不同。

我用nm检查了可执行文件,以查看导出的符号,但是我没有使用-D选项。即使我知道它的存在,也不确定是否需要它还是仅适用于动态库。实际上,可执行文件的符号根本没有导出。

我使用自动工具,并将-rdynamic添加到AM_LDFLAGS。但是Makefile.am很长,还有一个* _LDFLAGS节,特别是关于可执行文件,我不知道。因此,链接时未应用AM_LDFLAGS,这是预期的,请参见https://www.gnu.org/software/automake/manual/html_node/Program-Variables.html的AM_LDFLAGS部分: 在某些情况下,它不使用,而不是按可执行文件(或按库)_LDFLAGS。

最好的问候 拉尔夫