Python 3.1.1启用--enable-shared后无法构建扩展

7 投票
2 回答
4217 浏览
提问于 2025-04-15 14:58

总结:在 RHEL 5.3 64 位系统上构建 Python 3.1 时,如果使用 --enable-shared 选项,所有扩展模块都无法编译成功。而正常构建则没有任何问题。

请注意,这个问题可能在编程和系统管理之间有些模糊。不过,我认为因为它直接关系到语言支持的设置,并且与编程过程的支持密切相关,所以我决定在这里也发帖。同时也在:https://serverfault.com/questions/73196/python-3-1-1-with-enable-shared-will-not-build-any-extensions。谢谢!

问题:

在 RHEL 5.3 64 位系统上构建 Python 3.1 时,如果使用 --enable-shared 选项,所有扩展模块都无法编译成功。而正常构建则没有任何问题。

我可以顺利构建 Python 3.1,但当它作为共享库构建时,会发出许多警告(见下文),并且拒绝构建任何基于 c 的模块。尽管如此,我仍然可以在其上构建 mod_wsgi 3.0c5,并在 Apache 下运行。可以说,Python 的功能大大减少了……

有趣的是,Python 3.2a0(来自 svn)使用 --enable-shared 选项可以正常编译,并且 mod_wsgi 也可以正常构建。但当我启动 Apache 时,出现了:

无法将 /etc/httpd/modules/mod_wsgi.so 加载到服务器中:/etc/httpd/modules/mod_wsgi.so:未定义符号:PyCObject_FromVoidPtr

这个项目是一个长期项目,所以如果需要,我可以接受 alpha 版本的软件。以下是关于问题的更多细节。

主机:

  • Dell PowerEdge
  • Intel Xenon
  • RHEL 5.3 64位
  • 没有什么“特别”的

构建:

  • Python 3.1.1 源代码分发
  • 使用 ./configure 正常工作
  • 使用 ./configure --enable-shared 时不正常

(已经执行了 export CFLAGS="-fPIC")

make 输出


gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I. -IInclude -I./Include -fPIC -DPy_BUILD_CORE -c ./Modules/_weakref.c -o Modules/_weakref.o


正在构建 'bz2' 扩展 gcc -pthread -fPIC -fno-strict-aliasing -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I. -I./Include -I/usr/local/include -IInclude -I/home/build/RPMBUILD/BUILD/Python-3.1.1 -c /home/build/RPMBUILD/BUILD/Python-3.1.1/Modules/bz2module.c -o build/temp.linux-x86_64-3.1/home/build/RPMBUILD/BUILD/Python-3.1.1/Modules/bz2module.o gcc -pthread -shared -fno-strict-aliasing -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes build/temp.linux-x86_64-3.1/home/build/RPMBUILD/BUILD/Python-3.1.1/Modules/bz2module.o -L/usr/local/lib -L. -lbz2 -lpython3.1 -o build/lib.linux-x86_64-3.1/bz2.so /usr/bin/ld: /usr/local/lib/libpython3.1.a(abstract.o): 重新定位 R_X86_64_32 针对 '本地符号' 不能在创建共享对象时使用;请使用 -fPIC 重新编译


Failed to build these modules:
_bisect            _codecs_cn         _codecs_hk
_codecs_iso2022    _codecs_jp         _codecs_kr
_codecs_tw         _collections       _csv
_ctypes            _ctypes_test       _curses
_curses_panel      _dbm               _elementtree
_gdbm              _hashlib           _heapq
_json              _lsprof            _multibytecodec
_multiprocessing   _pickle            _random
_socket            _sqlite3           _ssl
_struct            _testcapi          array
atexit             audioop            binascii
bz2                cmath              crypt
datetime           fcntl              grp
itertools          math               mmap
nis                operator           ossaudiodev
parser             pyexpat            readline
resource           select             spwd
syslog             termios            time
unicodedata        zlib

2 个回答

0

/usr/local/lib 在编译时被添加到了库的包含路径中:

-L/usr/local/lib -L.

在编译的时候,通常会在多个“常见”的路径中查找库文件,比如 /usr/lib、/usr/local/lib、./ 等等。此外,它也可能是从环境变量 LD_LIBRARY_PATH 中获取了 /usr/local/lib,并把它加到了构建命令中。

7

你的构建环境出现了问题。它从 /usr/local/lib 这个地方找到了一个叫 libpython3.1.a 的库,这让错误信息变得很混乱。它试图用这个库来链接,但链接失败了——其实它根本不应该尝试这样做,因为它应该使用刚刚构建的 libpython。建议你把 /usr/local 里的 Python 3.1 安装文件先移开。

你没有在输出中显示是否在构建过程中创建了 libpython3.1.so.1.0;这很重要,我们需要知道它是否存在、是怎么链接的,以及它导出了哪些符号。

撰写回答