繁体   English   中英

Python distutils没有使用正确版本的gcc

[英]Python distutils not using correct version of gcc

我想在Mac OSX 10.6.5上编译一个包。 包的安装脚本依赖于distutils。 问题是计算机的默认gcc是版本4.2(我通过在终端窗口中运行gcc --version来确定这一点)但是当我运行'python setup.py build'时,我从输出中看到distutils正在选择gcc -4.0而不是4.2这是一个很大的问题,因为我使用的代码需要gcc> = 4.2。 我没有这台机器的管理员权限,所以作为一个workaroud,我创建了一些将gcc-4.0发送到gcc-4.2的符号链接。 结果是代码编译,但生成的.so文件不起作用(当我尝试在python中导入它们时,我得到错误抱怨共享对象中缺少init函数)。

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

有没有人在这里有任何建议?

谢谢,乔希

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

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

CC=gcc-4.2 python setup.py build

你没有说你正在使用哪个版本的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 arch上运行。 这就是为什么它们是用gcc-4.0构建的。 如果你需要将gcc-4.2用于其他库,那么最安全的是使用用gcc-4.2构建的Python。 苹果提供的系统Pythons on OS X 10.6是如此构建的。 此外,对于最新版本的Python(2.7.1和3.2),python.org为OS X 10.6提供了第二个OS X安装程序变体,它也是使用gcc-4.2构建的。 但是,如果您没有管理员访问您的计算机,那么无论如何这都不是一个选项。

您可以通过以下方式查看默认使用哪个python:

which python

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM