【问题标题】:Python 3.1.1 with --enable-shared : will not build any extensions带有 --enable-shared 的 Python 3.1.1:不会构建任何扩展
【发布时间】:2009-10-10 07:37:29
【问题描述】:

总结:在 RHEL 5.3 64 位上使用 --enable-shared 构建 Python 3.1 无法编译所有扩展。构建“正常”可以正常工作,没有任何问题。

请注意,这个问题似乎模糊了编程和系统管理之间的界限。但是,我相信因为它必须直接处理获得语言支持,并且与支持编程过程有很大关系,所以我会在这里交叉发布。也在:https://serverfault.com/questions/73196/python-3-1-1-with-enable-shared-will-not-build-any-extensions。谢谢!

问题:

使用--enable-shared 在 RHEL 5.3 64 位上构建 Python 3.1 无法编译所有扩展。构建“正常”可以正常工作,没有任何问题。

我可以很好地构建 python 3.1,但是当构建为共享库时,它会发出许多警告(见下文),并拒绝构建任何基于 c 的模块。尽管失败了,我仍然可以针对它构建 mod_wsgi 3.0c5,并在 apache 下运行它。不用说,Python的功能大大减少了……

有趣的是,Python 3.2a0(来自 svn)使用 --enable-shared 可以很好地编译,而 mod_wsgi 可以很好地针对它进行编译。但是在启动 apache 时,我得到:

Cannot load /etc/httpd/modules/mod_wsgi.so into server: /etc/httpd/modules/mod_wsgi.so: undefined symbol: PyCObject_FromVoidPtr

这是一个长期项目,所以如果需要,我可以使用 Alpha 质量软件。以下是有关该问题的更多详细信息。

主持人:

  • 戴尔 PowerEdge
  • 英特尔氙气
  • RHEL 5.3 64 位
  • 没什么特别的

构建:

  • Python 3.1.1 源代码分发
  • ./configure 配合得很好
  • 不适用于./configure --enable-shared

export CFLAGS="-fPIC"已完成)

制作输出


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


building 'bz2' extension 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): relocation R_X86_64_32 against 'a local symbol' can not be used when making a shared object; recompile with -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

【问题讨论】:

    标签: python compilation python-3.x mod-wsgi


    【解决方案1】:

    您的构建环境有问题。它正在从/usr/local/lib 获取一个 libpython3.1.a;这会混淆错误消息。它尝试与该库链接,但失败了 - 但是,它不应该首先尝试这样做,因为它应该使用它刚刚构建的 libpython。我建议不要妨碍/usr/local 中的 Python 3.1 安装。

    您没有在输出中显示是否在构建树中创建了 libpython3.1.so.1.0;找出它是否存在、它是如何链接的以及它导出了哪些符号非常重要。

    【讨论】:

    • 嗨,马丁,我想评论一下,这 100% 解决了我遇到的问题。谢谢!你知道为什么它会在 /usr/local 而不是 /home/build/RPMBUILD/BUILD/... 中查找吗?
    • 重新阅读链接器行,很清楚:-L/usr/local/lib-L. 之前
    • 对我来说,这是指向另一个版本的 python 的 PATH 变量的问题。
    【解决方案2】:

    /usr/local/lib 已在编译时添加到库包含路径:

    -L/usr/local/lib -L.

    在编译时查看库(/usr/lib、/usr/local/lib、./ 等)的多个“公共”路径是很常见的,但它也可能从 /usr/local/lib 中获取环境变量 LD_LIBRARY_PATH 并将其附加到构建命令中。

    【讨论】:

    • 有趣...你将如何指示它在“.”中查找首先,在其他任何地方之前?
    • LD_LIBRARY_PATH 变量不应该以这种方式使用,因此如果它使用 LD_LIBRARY_PATH 中的目录添加到编译器标志,它可能会被破坏。
    猜你喜欢
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 2019-04-27
    • 2016-09-12
    • 1970-01-01
    相关资源
    最近更新 更多