【问题标题】:What does this linking error mean?这个链接错误是什么意思?
【发布时间】:2013-12-29 06:14:15
【问题描述】:

当我在编译一个新软件时,我遇到了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后就没了。

【问题讨论】:

    标签: linker ld shared-libraries


    【解决方案1】:

    我在编译一个新软件的时候,遇到一堆错误

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

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

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

    LIBXML2_2.6.1 是库名

    不,不是。这是一个符号version,恰好反映了定义该符号的库。

    那么这个错误的真正含义是什么

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

    您现在正在将您的二进制文件与libxml2 的其他版本链接,一个提供这些符号的版本,您的二进制文件将无法工作。

    【讨论】:

    • 好的。所以这是 GNU 的“特性”,不是标准 CC++ 的一部分。
    • 标准CC++ 没有源文件、目标文件或库的概念。但是是的:版本符号是 POSIX 的 GNU 扩展。
    • C 和 C++ 标准都有一个叫做 Standard Library afaik 的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    相关资源
    最近更新 更多