代码之家  ›  专栏  ›  技术社区  ›  ognian

gcc链接器错误:找不到符号的版本节点

  •  4
  • ognian  · 技术社区  · 16 年前

    我正在尝试构建共享库,但出现以下错误:

    libavformat.so:未找到版本节点 对于符号 av_dup_packet@LIBAVFORMAT_52

    身份证号码: 错误的值

    有人知道这个错误是什么意思吗?主机是i586 linux目标是arm linux

    编辑: 已解决,请参阅注释

    4 回复  |  直到 16 年前
        1
  •  3
  •   ognian    16 年前

    它是由内联汇编指令引起的 .symver . 我的解决方案是手动修改生成的config.h以禁用版本节点符号。

    internal.h

        2
  •  2
  •   Digital Trauma    9 年前

    我在构建时遇到了这个错误 libsctp

    解释了符号版本控制 here 一个链接器脚本可以用来控制它。在我的例子中,通过添加到特定于目标的LDFLAGS makefile变量,我能够拉入现有的版本链接器脚本:

    $(LIB_PATH)/libsctp.so: LDFLAGS += \
        -Xlinker --version-script=$(MODULE_PATH)/src/lib/Versions.map
    
        3
  •  1
  •   Alex Cohn    14 年前

    哦,功能 was moved in April 2009 libavformat/util.c 到中的新文件 libavcodec/avpacket.c . 这个 comment in internal.h 明确指出:

    如果函数从一个库移动到另一个库,包装器必须保留在原始位置以保持二进制兼容性。

    但当函数在库之间移动时,不可能保持二进制兼容性。

    请注意,此错误是在中报告的 Chromium project 一年多以前。

    顺便说一下,不需要编辑 config.h ./configure --disable-symver .

        4
  •  0
  •   Nathan Stocks    14 年前

    这是别人给我指出的,所以我想我不妨把它放在这里,这样像我这样的人就可以理解奥尼亚的答案:

    这就转化为编辑 config.h ./configure 以及制造 SYMVER -相关条目设置为0。如下所示:

    #define HAVE_SYMVER 0
    #define HAVE_SYMVER_GNU_ASM 0
    #define HAVE_SYMVER_ASM_LABEL 0