2011-05-11 24 views
6

我想在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中导入它们时,出现抱怨共享对象中缺少初始化函数的错误)。Python distutils不使用正确版本的gcc

我试过在不同的mac上编译这段代码(10.6.6),它的工作方式就像一个魅力:distutils选择4.2而不必强迫这样做,我可以导入生成的共享对象,而不会出现问题。所以,我想要做的是在我的电脑上编译代码,而不必执行这种符号链接技巧......我只想让distutils自动选择4.2。我已经尝试过将.so文件正确编译并将它们传输到我的计算机,但由于许多原因(它们与我的计算机上不存在的库链接,是与安装的版本不同的版本)失败。

有没有人有任何建议吗?

感谢, 乔希

回答

1

你可以调整你的distutils.cfg(见here),也可以通过命令行参数--compiler = gcc42(不知道最后一个)。

+0

这似乎并不奏效。有效的编译器只是'gcc'。在版本中投掷不起作用 - 它会抛出一个错误,说它不知道如何使用gcc42进行构建。 – 2011-05-11 16:10:01

+0

应该可能是'--compiler = gcc-4.2' – cdarke 2011-05-11 16:11:44

+0

不幸的是,这仍然没有帮助。如果您检查distutils.ccompiler,可用的选项是“unix”或“minwg”。它似乎没有注意到版本的东西。 – 2011-05-11 16:25:13

16

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

接下来,你需要重新定义的,在海湾合作委员会的版本替换你想使用:

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

记住的是, SYSCONFIG默认值从最初被用来编译蟒蛇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' 
3

你不说,它是由Python你的版本重新使用,但有可能您正在使用的机器上的默认Python不是Apple提供的Python 2.6.1,更有可能是从python.org安装的。尝试使用/usr/bin/python2.6运行构建脚本,该脚本应该是Apple提供的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 archs。这就是为什么他们用gcc-4.0构建的原因。如果您需要将gcc-4.2用于其他库,那么最安全的是使用由gcc-4.2构建的Python。苹果提供的OS X 10.6系统Pythons是如此构建的。另外,对于最新版本的Python(2.7.1和3.2),python.org为OS X 10.6提供了第二个OS X安装程序变体,该变体也由gcc-4.2构建。但是,如果您没有管理员访问您的计算机,那不是一个选项。

你可以看到正在使用的Python默认方式:

which python 
4

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

CC=gcc-4.2 python setup.py build