这个链接错误是什么意思?

时间:2013-12-11 10:14:29

标签: linker ld shared-libraries

当我编译新软件时,我遇到了ld发出的一堆错误。

/usr/lib/libstreamanalyzer.so.0: undefined reference to `xmlSAXUserParseMemory@LIBXML2_2.4.30'
/usr/lib/libstreamanalyzer.so.0: undefined reference to `xmlCtxtResetPush@LIBXML2_2.6.1'
/usr/lib/libstreamanalyzer.so.0: undefined reference to `xmlCreatePushParserCtxt@LIBXML2_2.4.30'

这似乎令人困惑。链接器应该在对象中寻找符号,而不是库名,但在这种情况下,似乎在 @ 之前是函数名/符号,而LIBXML2_2.6.1是库名。对于动态库, soname x.y.z版本应该只在动态链接阶段,即可执行文件实际运行时才重要。

那么这个错误究竟意味着什么,以及上述假设的哪一部分是错误的?

编辑:

安装libxml2 2.7.8后出现问题。在libxml2升级到2.9.1之后它就消失了。

1 个答案:

答案 0 :(得分:1)

  

当我编译新软件时,我遇到了一堆错误

不,你没有。您在链接时遇到错误,这与编译不同。

  

链接器应该在对象中寻找符号

UNIX链接器还在库中查找符号(存档和共享)。

  

LIBXML2_2.6.1是库名

不,不是。它是符号版本,恰好反映了定义该符号的库。

  

那么这个错误究竟意味着什么

此错误表示:链接libstreamanalyzer.so.0时,它链接到提供版本化符号libxml2.so等的库(很可能是xmlSAXUserParseMemory@LIBXML2_2.4.30)。

您现在将二进制文件与libxml2的其他版本链接起来,提供这些符号,并且您的二进制文件将无效。