【问题标题】:Problems compiling mod_wsgi in virtualenv在 virtualenv 中编译 mod_wsgi 的问题
【发布时间】:2011-09-01 07:10:31
【问题描述】:

我正在尝试在 CentOS 服务器上编译 mod_wsgi(版本 3.3)、Python 2.6 - 但在 virtualenv 下,没有成功。我收到了错误:

/usr/bin/ld: /home/python26/lib/libpython2.6.a(node.o): 针对 `a 重定位 R_X86_64_32 局部符号'不能使用时 制作共享对象;重新编译 -fPIC

/home/python26/lib/libpython2.6.a: 无法读取符号:错误值

根据mod_wsgi Installation Issues docs,可能是libpython2.6.a文件:

  • 不存在
  • 不是用 shared 生成的
  • 是为 32 位机器生成的,而不是 64 位机器。

嗯,文件在正确的位置,并且可读。我尝试使用 --enable-shared 选项重新编译 Python 2.6,但整个编译过程都崩溃了,几乎每个文件都给出了相同的错误,即 libpython2.6.a软管。

我不知道 Python 是为 64 位编译的,但是当我运行它时:

import platform
print platform.platform()
>>>Linux-2.6.18-028stab070.4-x86_64-with-redhat-5.6-Final

由于 Python 认为它在 x86_64 上,我希望它编译为 64 位 - 如果有人有任何方式确认,我将不胜感激。

我尝试使用和不使用 --python=/home/[...]/python2.6 来配置 mod_wsgi Makefile,两种方式都失败了。

我还尝试使用 Python 2.4 编译 virtualenvoutside 的 mod_wsgi,效果很好。不幸的是,如果我要使用virtualenv,这对我没有帮助:)

有谁知道我怎样才能让 mod_wsgi 在virtualenv 下编译?

【问题讨论】:

  • 注意 - 我刚刚尝试在 virtualenv 下编译 not,但仍将 --with-python 指向最新版本,就像在 this article about wsgi 中所做的那样,但这也没有效果。
  • 从新的 Python 源代码树开始,然后使用 --enable-shared 选项再次执行。使用不同的选项重新编译旧源时,您可能没有正确清理旧源。
  • @Graham,谢谢,实际上,我刚刚完成了 - 但一个不同之处在于我将 --enable-shared 选项放在了命令行的 end 中,在 --with-python 之后,它起作用了。此外,当我编译 mod_wsgi 时,它没有出错 - 不幸的是,对 mod_wsgi.so 文件执行 ldd 命令给了我libpython2.6.so.1.0 not found。它看起来在所有正确的地方,但我可能会开始将它链接到随机位置,看看会发生什么。 :)
  • --enable-shared 标志用于配置用于构建 Python 而不是 mod_WSGI。通过 mod_WSGI 站点搜索 LD_RUN_PATH 来解决 mod_WSGI 在运行时找不到共享库的问题。
  • @Graham,叹息...我在编译 Python 时的意思是 --prefix 之前。我怀疑它首先需要前缀。抱歉,我整天盯着这个屏幕,试图让它工作,但输入错误。

标签: python mod-wsgi virtualenv


【解决方案1】:

文档的相关部分是:

http://modwsgi.readthedocs.io/en/develop/user-guides/installation-issues.html#mixing-32-bit-and-64-bit-packages

这里提到了-fPIC问题。

还有:

http://modwsgi.readthedocs.io/en/develop/user-guides/installation-issues.html#unable-to-find-python-shared-library

这里提到当 mod_wsgi 找不到共享库时需要使用 LD_RUN_PATH。

可以在以下位置找到有关共享库问题以及 mod_wsgi 发现错误 Python 安装问题的其他信息:

http://modwsgi.readthedocs.io/en/develop/user-guides/checking-your-installation.html#python-shared-library

【讨论】:

【解决方案2】:

你应该用-fPIC重新编译libpython2.6.a来生成对象。

例如:

gcc -fPIC -g -c -Wall xxx.c

【讨论】:

    【解决方案3】:

    如果您已从源代码构建 Python,请添加 --enable-shared 进行配置。 (它添加了-fPIC)

    【讨论】:

      猜你喜欢
      • 2013-08-11
      • 2012-07-30
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 2011-03-16
      相关资源
      最近更新 更多