问题描述
我尝试使用 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
>