Python distutils未使用正确版本的gcc

8
我正在尝试在Mac OSX 10.6.5上编译一个软件包,该软件包的安装脚本依赖于distutils。问题是电脑默认的gcc版本是4.2(通过在终端窗口中运行gcc --version命令确定),但是当我运行'python setup.py build'时,从输出中可以看到distutils选择了gcc-4.0而不是4.2。这是一个大问题,因为我使用的代码要求gcc >= 4.2。由于我没有管理员权限,所以我创建了一些符号链接将gcc-4.0发送到gcc-4.2作为解决方法。结果是代码可以编译,但生成的.so文件无法工作(当我尝试在Python中导入它们时,会出现错误,指示共享对象中缺少init函数)。
我已经尝试在另一台Mac电脑(10.6.6)上编译此代码,并且正常工作:distutils自动选择4.2而无需强制执行,而且我可以毫无问题地导入生成的共享对象。因此,我想在我的电脑上编译代码,而不必进行符号链接技巧…我只希望distutils自动选择4.2,因为它应该这样做。我已经尝试将编译正确的.so文件传输到我的电脑,但由于各种原因失败(它们链接到不在我的电脑上/版本不同于已安装的库),所以并没有成功。
有人能给出建议吗?
谢谢, Josh
4个回答

19

为了强制distutils使用单独的编译器,您可以通过环境重新定义一些变量。首先,找出distutils正在使用什么作为默认值:

>>> from distutils import sysconfig
>>> sysconfig.get_config_var('LDSHARED')
'gcc-4.0 -Wl,-F. -bundle -undefined dynamic_lookup'
>>> sysconfig.get_config_var('CC')
'gcc-4.0'

接下来,您需要重新定义它们,将您想要使用的gcc版本替换进去:

% LDSHARED="gcc-4.2 -Wl,-F. -bundle -undefined dynamic_lookup" CC=gcc-4.2 \
    /usr/bin/python setup.py build_ext

请记住,sysconfig 的默认值是从编译 Python 时使用的 Makefile 中提取的,因此更改它们可能会产生意想不到的结果:

>>> path = sysconfig.get_python_lib(plat_specific=1, standard_lib=1)
>>> os.path.join(path, 'config', 'Makefile')
'/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/config/Makefile'

5

您尝试设置自定义的CC环境变量了吗?


(说明:此句是关于IT技术方面的问题,建议在上下文中使用)
CC=gcc-4.2 python setup.py build

3
您没有说明使用的Python版本,但很有可能机器上默认的Python不是由苹果提供的Python 2.6.1,而是从python.org安装的。请尝试使用/usr/bin/python2.6运行构建脚本,这应该是苹果提供的Python 2.6;它确实使用gcc-4.2
当您使用Python的Distutils(通常通过运行setup.py脚本或使用easy_install)时,Distutils会尝试确保在安装程序包中任何C扩展模块都将使用相同的编译器版本和兼容的编译选项(CPU archs,ABI等)编译,就像编译Python自身一样。传统上,大多数OS X的python.org安装程序都提供了一个通用的Python,可以在多个OS X版本和多个CPU架构上使用。这就是为什么它们使用gcc-4.0进行构建。如果您需要为某个其他库使用gcc-4.2,则最安全的方法是使用使用gcc-4.2构建的Python。在OS X 10.6上,Apple提供的系统Python正是如此构建的。此外,针对最新版本的Python(2.7.1和3.2),python.org还提供了第二个面向OS X 10.6的OS X安装程序变体,也是使用gcc-4.2进行构建的。但是,如果您没有管理员访问权限,则无法使用该选项。
您可以通过以下方式查看默认使用哪个Python:
which python

1

你可以调整你的distutils.cfg文件(参见这里),或者你可以通过命令行参数--compiler=gcc42来传递参数(最后一个不确定)。


这似乎不起作用。有效的编译器只有“gcc”。加入版本号也不起作用 - 它会抛出一个错误,说它不知道如何使用gcc42构建。 - Josh G.
可能应该是 --compiler=gcc-4.2 - cdarke
不幸的是,这仍然没有帮助。如果您检查distutils.ccompiler,可用选项包括“unix”或“minwg”。它似乎没有注意到版本等信息。 - Josh G.

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