【问题标题】:Failed to linked symbol in .so file while the symbol exists符号存在时无法链接 .so 文件中的符号
【发布时间】:2014-12-16 19:14:33
【问题描述】:

我想在我的 unix 系统中安装 lxml 模块,但它不起作用。问题是引用符号失败:

Python 2.6.4 (r264:75706, Sep 12 2010, 18:46:30) [C] on sunos5
Type "help", "copyright", "credits" or "license" for more information.
>>> from lxml import etree
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: ld.so.1: isapython2.6: fatal: relocation error: file lxml/etree.so: symbol __xmlStructuredErrorContext: referenced symbol not found

但是,ldd 命令的输出是:

$ ldd lxml/etree.so
        libxslt.so.1 =>  /usr/lib/libxslt.so.1
        libexslt.so.0 =>         /usr/lib/libexslt.so.0
        libxml2.so.2 =>  /lib/libxml2.so.2
        libz.so.1 =>     /lib/libz.so.1
        libm.so.2 =>     /lib/libm.so.2
        libpython2.6.so.1.0 =>   /usr/lib/libpython2.6.so.1.0
        libgcc_s.so.1 =>         /usr/sfw/lib/libgcc_s.so.1
        libpthread.so.1 =>       /lib/libpthread.so.1
        libsocket.so.1 =>        /lib/libsocket.so.1
        libnsl.so.1 =>   /lib/libnsl.so.1
        libc.so.1 =>     /lib/libc.so.1
        libdl.so.1 =>    /lib/libdl.so.1
        libmp.so.2 =>    /lib/libmp.so.2
        libmd.so.1 =>    /lib/libmd.so.1

发现了:

$ nm /lib/libxml2.so.2 | grep __xmlStructuredErrorContext
000a99e8 t __xmlStructuredErrorContext

这让我恶心。那里有一个符号为什么它无法链接?我缺什么吗?

【问题讨论】:

    标签: unix dynamic-linking shared-libraries


    【解决方案1】:

    好的。这个问题是很久以前的了。我发现这是为什么:

    注意:

    $ nm /lib/libxml2.so.2 | grep __xmlStructuredErrorContext
    000a99e8 t __xmlStructuredErrorContext
    

    这个符号有t的属性,是本地的,不会被导出。这是因为图书馆太旧了。

    但不幸的是,如果您正在使用solaris 系统,如果您尝试通过从源代码编译来更新libxml2,它将失败,因为编译器或源代码中的错误。进一步参考:http://blog.gmane.org/gmane.comp.gnome.lib.xslt/month=20110201

    其实有一个捷径可以使用openCSW安装带有预编译包的lxml

    pkgadd -d http://get.opencsw.org/now
    /opt/csw/bin/pkgutil -U
    /opt/csw/bin/pkgutil -y -i python27 py_lxml
    

    它会起作用的。

    【讨论】:

      【解决方案2】:

      在 Solaris Sparc (5.11) 上使用 Python3 时遇到了同样的问题。 OpenCSW 版本的 lxml 仅适用于 Python 2,因此必须执行以下操作:

      • 从 OpenCSW 获取 libxml2 和 libz1(在我的情况下,这些是 libz1-1.2.8,REV=2013.09.23-SunOS5.10-sparc-CSW 和 libxml2_2-2.9.3,REV=2016.02.16-SunOS5.10 -sparc-CSW,从openCSW下载:https://mirror.opencsw.org/opencsw/)
      • 从这些包中提取相应的 SO 文件(不是 sparcv9 版本)
      • 创建符号链接
      libxml2.so.2 -> libxml2.so.2.9.3
      libxml2.so.2.9.3
      libz.so.1 -> libz.so.1.2.8
      libz.so.1.2.8
      
      • 在 .bashrc 的 LD_LIBRARY_PATH 变量中添加此文件夹的路径

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-18
        • 2012-12-14
        相关资源
        最近更新 更多