Python 3.1.1启用--enable-shared后无法构建扩展
总结:在 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 个回答
/usr/local/lib 在编译时被添加到了库的包含路径中:
-L/usr/local/lib -L.
在编译的时候,通常会在多个“常见”的路径中查找库文件,比如 /usr/lib、/usr/local/lib、./ 等等。此外,它也可能是从环境变量 LD_LIBRARY_PATH 中获取了 /usr/local/lib,并把它加到了构建命令中。
你的构建环境出现了问题。它从 /usr/local/lib
这个地方找到了一个叫 libpython3.1.a 的库,这让错误信息变得很混乱。它试图用这个库来链接,但链接失败了——其实它根本不应该尝试这样做,因为它应该使用刚刚构建的 libpython。建议你把 /usr/local
里的 Python 3.1 安装文件先移开。
你没有在输出中显示是否在构建过程中创建了 libpython3.1.so.1.0;这很重要,我们需要知道它是否存在、是怎么链接的,以及它导出了哪些符号。