如何在从源代码构建Python时忽略本地Python

13

当我尝试使用以下方法构建自己的 Python 版本时:

./configure --enable-shared --prefix=/app/vendor/python-dev && make && make install

安装过程中出现错误:

/usr/bin/ld: /usr/local/lib/libpython2.7.a(abstract.o): relocation R_X86_64_32 对“.rodata.str1.8”的重定位不能用于生成共享对象;重新编译时使用-fPIC /usr/local/lib/libpython2.7.a: 无法读取符号:坏的值

问题出在链接器尝试使用/usr/local/lib/libpython2.7.a而不是新编译的库。

如何防止链接器(configure/make)使用系统上安装的Python库?


对我来说,./configure --enable-shared --prefix=/app/vendor/python-dev && make && make install(来自于Ubuntu 13.04上的Python-2.7.5 tarball)是有效的。如果错误发生在make部分,则必须包括完整的make输出。 - Aya
这是唯一的错误。它也会在其他模块中简单地重复出现。我正在使用2.7.4版本的tarball。但是我在我的机器上有2.7.4版本,静态编译(我猜没有使用-fPIC)。 - Xyand
当然可以,但是错误的原因很可能早在构建过程中发生了,所以需要更多信息才能诊断。请查看这个链接和其后续回复。我不确定是否是同样的问题,但如果没有看到make的输出,我也无法做更多事情。 - Aya
这里是日志http://pastebin.com/ZBUp2cnd。是的,帖子提到了同样的问题。但没有解决方案。 - Xyand
我的解决方案是否有效? - Aya
3个回答

13

这似乎是setup.py脚本的缺陷,它总是在make构建目标sharedmods时将/usr/local包含在搜索路径中。

您需要手动修改setup.py,因此请...

./configure --enable-shared --prefix=/app/vendor/python-dev

...首先编辑setup.py文件,找到442、443和444行,这些行应该是这样的...

if not cross_compiling:
    add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
    add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')

...并将它们注释掉,使它们看起来像这样...

# if not cross_compiling
    # add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
    # add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')

如果一切正常,make 命令应该可以正常工作。


2
if语句也需要被注释掉。否则解析器会期望一个缩进块,而这两个add_dir_to_list行不是。仅供参考。 - Xephon
我在尝试重新编译并重新安装Python到/usr/local/lib时遇到了这个问题。在这种情况下,你必须再次使用--prefix=/usr/local/lib,并且编辑setup.py就像这个答案建议的那样是无效的。为了解决这个问题,我不得不删除现有的/usr/local/lib/libpython2.7.a文件和/usr/local/lib/python2.7/目录(也许后者不需要)。 - user920391

5

我使用了这个脚本解决了问题

# Python 2.7.6: 
wget http://python.org/ftp/python/2.7.6/Python-2.7.6.tar.xz
tar xf Python-2.7.6.tar.xz
cd Python-2.7.6
./configure --prefix=/usr/local --enable-unicode=ucs4 --enable-shared       LDFLAGS="-Wl,-rpath /usr/local/lib"
make && make altinstall

0

我刚刚把 /usr/local/lib/libpython2.7.a 移动到了 /tmp


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接