由于加载错误的 libpython

问题描述

我尝试使用 pip install mod-wsgi 使用 python3.6 的标准 CentOS 安装来安装 mod-wsgi。我收到一条错误消息,说我需要使用 --enable-shared 作为 ./configure 的标志重新编译 python。

因此,我从这里下载并提取了 python 3.7 源代码https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz

然后我运行 ./configure --enable-shared --enable-optimizations LDFLAGS="-Wl,-rpath /path/containing/lib"(rpath 是 libpython3.7m.so 的父目录),然后是 make

此时,我不想运行 make install,因为我不想污染系统可执行路径,因为我的 $PATH 中已经有一个 python3 可执行文件。但是,我可以运行构建的 python 可执行文件。然后我想继续使用 ./python -m pip install mod-wsgi 并被一堆错误猛烈抨击,如下所示:

/bin/ld: /usr/local/lib/libpython3.7m.a(bytes_methods.o): relocation R_X86_64_32S against symbol '_Py_Nonestruct' can not be used when making a shared object; recompile with -fPIC

在以下 gcc 行之后:

gcc -pthread -shared -Wl,-rpath /etc/httpd/IDvpython \
build/temp.linux-x86_64-3.7/src/server/wsgi_thread.o \
build/temp.linux-x86_64-3.7/src/server/mod_wsgi.o \
build/temp.linux-x86_64-3.7/src/server/wsgi_buckets.o \
build/temp.linux-x86_64-3.7/src/server/wsgi_memory.o \
build/temp.linux-x86_64-3.7/src/server/wsgi_interp.o \
build/temp.linux-x86_64-3.7/src/server/wsgi_restrict.o \
build/temp.linux-x86_64-3.7/src/server/wsgi_logger.o \
build/temp.linux-x86_64-3.7/src/server/wsgi_server.o \
build/temp.linux-x86_64-3.7/src/server/wsgi_convert.o \
build/temp.linux-x86_64-3.7/src/server/wsgi_metrics.o \
build/temp.linux-x86_64-3.7/src/server/wsgi_validate.o \
build/temp.linux-x86_64-3.7/src/server/wsgi_daemon.o \
build/temp.linux-x86_64-3.7/src/server/wsgi_apache.o \
build/temp.linux-x86_64-3.7/src/server/wsgi_stream.o \
-L. \
-lpython3.7m \
-o build/lib.linux-x86_64-3.7/mod_wsgi/server/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so \
-L/usr/local/lib \
-L/usr/local/lib/python3.7/config-3.7m-linux \
-lpython3.7m

这意味着 pip install 是从 /usr/local/lib/libpython3.7m.a 而不是从 /path/containing/lib/libpython3.7m.so

如何使 pip install 引用正确的共享库?


编辑:

ldd ./python 确认 python 应该使用所需的共享库:

    linux-vdso.so.1 =>  (0x00007ffea0bfe000)
    libpython3.7m.so.1.0 => /etc/httpd/IDvpython/libpython3.7m.so.1.0 (0x00002acb63080000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00002acb635b9000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00002acb637d5000)
    libutil.so.1 => /lib64/libutil.so.1 (0x00002acb639d9000)
    libm.so.6 => /lib64/libm.so.6 (0x00002acb63bdc000)
    libc.so.6 => /lib64/libc.so.6 (0x00002acb63ede000)
    /lib64/ld-linux-x86-64.so.2 (0x00002acb62e5c000)

解决方法

最后,我只是重命名了 /usr/local/lib/libpython3.7m.a 文件,这样当 pip 调用 gcc 时,它就找不到这个文件并将 libpython3.7m.so 从我的 python 安装复制到 /usr/local/lib>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...