当我编译新软件时,我遇到了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之后它就消失了。
答案 0 :(得分:1)
当我编译新软件时,我遇到了一堆错误
不,你没有。您在链接时遇到错误,这与编译不同。
链接器应该在对象中寻找符号
UNIX链接器还在库中查找符号(存档和共享)。
LIBXML2_2.6.1是库名
不,不是。它是符号版本,恰好反映了定义该符号的库。
那么这个错误究竟意味着什么
此错误表示:链接libstreamanalyzer.so.0
时,它链接到提供版本化符号libxml2.so
等的库(很可能是xmlSAXUserParseMemory@LIBXML2_2.4.30
)。
您现在将二进制文件与libxml2
的其他版本链接起来,不提供这些符号,并且您的二进制文件将无效。