Python distutils未使用正确版本的gcc

Python distutils未使用正确版本的gcc,python,gcc,distutils,Python,Gcc,Distutils,我试图在MacOSX10.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。结果是代码被编译,但生成的.s

我试图在MacOSX10.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

您可以调整distutils.cfg(请参阅),也可以将命令行参数作为--compiler=gcc42传递(不确定最后一个参数)。

要强制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'

您没有说您使用的是哪种版本的Python,但您使用的机器上的默认Python可能不是苹果提供的Python 2.6.1,更可能是从Python.org安装的。尝试使用
/usr/bin/python2.6
运行构建脚本,该脚本应该是苹果提供的Python 2.6;这确实使用了
gcc-4.2

当您使用Python的Distutils时(通常通过运行
setup.py
脚本或使用
easy\u install
),Distutils会尝试确保您正在安装的包中的任何C扩展模块都将使用相同的编译器版本和兼容的编译选项(CPU ARCH、ABI等)进行编译as被用来构建Python本身。传统上,大多数用于OS X的python.org安装程序都提供了一种通用python,可在多个版本的OS X和多CPU ARCH上运行。这就是为什么它们是用gcc-4.0构建的。如果您需要将gcc-4.2用于其他库,那么最安全的方法是使用使用gcc-4.2构建的Python。苹果在OSX10.6上提供的系统python就是这样构建的。另外,对于Python的最新版本(2.7.1和3.2),Python.org为OS X 10.6提供了第二个OS X安装程序变体,它也是使用gcc-4.2构建的。但是,如果您没有对您的机器的管理员访问权限,那无论如何都不是一个选项

您可以通过以下方式查看默认情况下使用的python:

which python

您是否尝试过设置自定义CC环境变量

CC=gcc-4.2 python setup.py build

这似乎不起作用。有效的编译器只是“gcc”。抛出版本不起作用-它抛出一个错误,表示它不知道如何使用gcc42进行构建。应该是
--compiler=gcc-4.2
,不幸的是,这仍然没有帮助。如果您检查distutils.ccompiler,可用的选项是“unix”或“minwg”。它似乎没有注意到版本之类的内容。