简体   繁体   English

在OS X上使用错误版本的GCC构建Python

[英]Python build using wrong version of GCC on OS X

I am attempting to build the python package pycrypto. 我正在尝试构建python包pycrypto。 OS X has gcc-4.2 installed and not gcc-4.0, but python continues to attempt to use gcc-4.0. OS X安装了gcc-4.2而不是gcc-4.0,但是python继续尝试使用gcc-4.0。 How can I get it to use gcc-4.2? 如何才能使用gcc-4.2? Or should I go about this a different way. 或者我应该采取不同的方式。

I am getting the following error: 我收到以下错误:

bash-3.2$ 
bash-3.2$ sudo python setup.py build
running build
running build_py
running build_ext
warning: GMP library not found; Not building Crypto.PublicKey._fastmath.
building 'Crypto.Hash.MD2' extension
gcc-4.0 -fno-strict-aliasing -fno-common -dynamic -arch ppc -arch i386 -std=c99 -O3 -fomit-frame-pointer -Isrc/ -I/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6 -c src/MD2.c -o build/temp.macosx-10.3-fat-2.6/src/MD2.o
unable to execute gcc-4.0: No such file or directory
error: command 'gcc-4.0' failed with exit status 1
bash-3.2$ 
bash-3.2$ 
bash-3.2$ 

I am using Mac OS X 10.6.7 with python 2.6.6 and XCode is installed. 我正在使用带有python 2.6.6的Mac OS X 10.6.7并安装了XCode。

EDIT: If I add CC=gcc-4.2, then I still get the error: 编辑:如果我添加CC = gcc-4.2,那么我仍然得到错误:

bash-3.2$ 
bash-3.2$ export CC=gcc-4.2
bash-3.2$ python setup.py build
running build
running build_py
running build_ext
warning: GMP library not found; Not building Crypto.PublicKey._fastmath.
building 'Crypto.Hash.MD2' extension
gcc-4.2 -fno-strict-aliasing -fno-common -dynamic -std=c99 -O3 -fomit-frame-pointer -arch i386 -arch x86_64 -Isrc/ -I/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6 -c src/MD2.c -o build/temp.macosx-10.3-intel-2.6/src/MD2.o
gcc-4.0 -g -bundle -undefined dynamic_lookup -arch i386 -arch x86_64 build/temp.macosx-10.3-intel-2.6/src/MD2.o -o build/lib.macosx-10.3-intel-2.6/Crypto/Hash/MD2.so
unable to execute gcc-4.0: No such file or directory
error: command 'gcc-4.0' failed with exit status 1
bash-3.2$ 

EDIT: It seems that using sudo makes a difference here. 编辑:似乎使用sudo在这里有所作为。

I tried using both CC and CXX as suggest by Adam, and I get the following error without sudo: 我尝试使用CC和CXX作为Adam的建议,没有sudo我得到以下错误:

bash-3.2$ python setup.py build
running build
running build_py
creating build/lib.macosx-10.3-fat-2.6
creating build/lib.macosx-10.3-fat-2.6/Crypto
copying lib/Crypto/__init__.py -> build/lib.macosx-10.3-fat-2.6/Crypto
copying lib/Crypto/pct_warnings.py -> build/lib.macosx-10.3-fat-2.6/Crypto
...
warning: GMP library not found; Not building Crypto.PublicKey._fastmath.
building 'Crypto.Hash.MD2' extension
creating build/temp.macosx-10.3-fat-2.6
creating build/temp.macosx-10.3-fat-2.6/src
gcc-4.2 -fno-strict-aliasing -fno-common -dynamic -arch ppc -arch i386 -std=c99 -O3 -fomit-frame-pointer -Isrc/ -I/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6 -c src/MD2.c -o build/temp.macosx-10.3-fat-2.6/src/MD2.o
/usr/libexec/gcc/powerpc-apple-darwin10/4.2.1/as: assembler (/usr/bin/../libexec/gcc/darwin/ppc/as or /usr/bin/../local/libexec/gcc/darwin/ppc/as) for architecture ppc not installed
Installed assemblers are:
/usr/bin/../libexec/gcc/darwin/x86_64/as for architecture x86_64
/usr/bin/../libexec/gcc/darwin/i386/as for architecture i386
lipo: can't open input file: /var/tmp//ccxan625.out (No such file or directory)
error: command 'gcc-4.2' failed with exit status 1

If I use sudo, I get the following error where it tries to use 4.0: 如果我使用sudo,我会尝试使用4.0时出现以下错误:

bash-3.2$ sudo python setup.py build
Password:
running build
running build_py
running build_ext
warning: GMP library not found; Not building Crypto.PublicKey._fastmath.
building 'Crypto.Hash.MD2' extension
gcc-4.0 -fno-strict-aliasing -fno-common -dynamic -arch ppc -arch i386 -std=c99 -O3 -fomit-frame-pointer -Isrc/ -I/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6 -c src/MD2.c -o build/temp.macosx-10.3-fat-2.6/src/MD2.o
unable to execute gcc-4.0: No such file or directory
error: command 'gcc-4.0' failed with exit status 1
bash-3.2$ 
bash-3.2$ 

Does this extra info make it more obvious what is going on and how to fix it? 这些额外的信息是否使得更明显的是什么以及如何解决它? Any idea why the call without sudo is getting that other error? 知道为什么没有sudo的调用会得到其他错误吗?

Based on the path shown ( /Library/Frameworks/Python.framework/Versions/2.6 ), it appears you have installed a 32-bit-only Python 2.6, perhaps using a python.org installer. 根据显示的路径( /Library/Frameworks/Python.framework/Versions/2.6 ),您可能已经安装了一个32位的Python 2.6,可能使用的是python.org安装程序。 When you build a Python package that includes a C extension module, the Python Distutils included with that Python instance will attempt to use the same version of gcc and the same CPU architectures that that Python was built with. 当您构建包含C扩展模块的Python包时,该Python实例中包含的Python Distutils将尝试使用相同版本的gcc以及与之构建Python相同的CPU体系结构。 Apparently you have installed the new cutting-edge Xcode 4 which no longer includes gcc-4.0 or ppc support. 显然你已经安装了新的尖端Xcode 4,它不再包含gcc-4.0或ppc支持。 The Python versions you are using was built with the Xcode 3 tools included with Mac OS X 10.6. 您使用的Python版本是使用Mac OS X 10.6附带的Xcode 3工具构建的。 You may be able to work around it by overriding the compiler choice with: 可以通过覆盖编译器选项来解决它:

export CC=gcc-4.2
python setup.py build
sudo python setup.py install

EDIT: 编辑:

It looks like that is not going to work for pycrypto ; 看起来这对pycrypto ; its build is too compex. 它的构建过于复杂。 If you don't mind using the Apple-supplied Python 2.6 in OS X 10.6, this should work: 如果您不介意在OS X 10.6中使用Apple提供的Python 2.6,这应该可以:

export ARCHFLAGS='-arch i386 -arch x86_64'
/usr/bin/python2.6 setup.py build

Another option would be to install the 64-bit/32-bit Python 2.7 installer from python.org . 另一种选择是从python.org安装64位/ 32位Python 2.7安装程序 That is built with gcc-4.2 and is Intel-only so there shouldn't be any problems when using it with Xcode 4. 它是用gcc-4.2构建的,并且仅支持Intel,因此在与Xcode 4一起使用时应该没有任何问题。

UPDATE: 更新:

Here are the exact steps I used with Xcode 3. They should work as well with Xcode 4 installed: 以下是我与Xcode 3一起使用的确切步骤。它们应该与安装Xcode 4一起使用:

$ mkdir p
$ cd p
$ curl -O http://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-2.3.tar.gz
$ tar xf pycrypto-2.3.tar.gz 
$ cd pycrypto-2.3/
$ export ARCHFLAGS='-arch i386 -arch x86_64'
$ /usr/bin/python2.6 setup.py build
running build
running build_py
creating build
creating build/lib.macosx-10.6-universal-2.6
creating build/lib.macosx-10.6-universal-2.6/Crypto
copying lib/Crypto/__init__.py -> build/lib.macosx-10.6-universal-2.6/Crypto
[...]
running build_ext
warning: GMP library not found; Not building Crypto.PublicKey._fastmath.
building 'Crypto.Hash.MD2' extension
creating build/temp.macosx-10.6-universal-2.6
creating build/temp.macosx-10.6-universal-2.6/src
gcc-4.2 -fno-strict-aliasing -fno-common -dynamic -fwrapv -Wall -Wstrict-prototypes -DENABLE_DTRACE -pipe -std=c99 -O3 -fomit-frame-pointer -arch i386 -arch x86_64 -Isrc/ -I/System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6 -c src/MD2.c -o build/temp.macosx-10.6-universal-2.6/src/MD2.o
gcc-4.2 -Wl,-F. -bundle -undefined dynamic_lookup -arch i386 -arch x86_64 build/temp.macosx-10.6-universal-2.6/src/MD2.o -o build/lib.macosx-10.6-universal-2.6/Crypto/Hash/MD2.so
[...]
building 'Crypto.Util._counter' extension
gcc-4.2 -fno-strict-aliasing -fno-common -dynamic -fwrapv -Wall -Wstrict-prototypes -DENABLE_DTRACE -pipe -std=c99 -O3 -fomit-frame-pointer -arch i386 -arch x86_64 -Isrc/ -I/System/Library/Frameworks/Python.framework/Versions/2.6/include/python2.6 -c src/_counter.c -o build/temp.macosx-10.6-universal-2.6/src/_counter.o
gcc-4.2 -Wl,-F. -bundle -undefined dynamic_lookup -arch i386 -arch x86_64 build/temp.macosx-10.6-universal-2.6/src/_counter.o -o build/lib.macosx-10.6-universal-2.6/Crypto/Util/_counter.so
$ /usr/bin/python2.6 setup.py install
running install
running build
running build_py
running build_ext
warning: GMP library not found; Not building Crypto.PublicKey._fastmath.
running install_lib
creating /Library/Python/2.6/site-packages/Crypto
[...]
byte-compiling /Library/Python/2.6/site-packages/Crypto/pct_warnings.py to pct_warnings.pyc
running install_egg_info
Writing /Library/Python/2.6/site-packages/pycrypto-2.3-py2.6.egg-info
$ /usr/bin/python2.6 setup.py test
running test
............................................................................................[...]
----------------------------------------------------------------------
Ran 902 tests in 42.612s

OK
$ cd 
$ /usr/bin/python2.6
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from Crypto.Hash import MD5
>>> m = MD5.new()
>>> m.update('abc')
>>> m.digest()
'\x90\x01P\x98<\xd2O\xb0\xd6\x96?}(\xe1\x7fr'
>>> m.hexdigest()
'900150983cd24fb0d6963f7d28e17f72'
>>> ^D

BTW, this is a distutils problem, Python itself doesn't compile anything. 顺便说一句,这是一个distutils问题,Python本身并没有编译任何东西。

As you've discovered, you can override the compiler with the CC environment variable. 正如您所发现的,您可以使用CC环境变量覆盖编译器。 You can override the linker used with the CXX environment variable. 您可以覆盖与CXX环境变量一起使用的链接器。 I would also like to know why distutils acts this way, but so it does. 我也想知道为什么distutils这样做,但它确实如此。

Focus on this error: 专注于这个错误:

unable to execute gcc-4.0: No such file or directory
error: command 'gcc-4.0' failed with exit status 1

The compiler is telling you EXACTLY what the problem is. 编译器正确地告诉你问题是什么。 gcc-4.0 (and gcc-4.2 ) is not in your PATH . gcc-4.0 (和gcc-4.2 )不在您的PATH HINT: which gcc-4.2 , eg: 提示: which gcc-4.2 ,例如:

% which gcc-4.2
/usr/bin/gcc-4.2

Assuming yours is in the same location, I'm not sure why /usr/bin isn't in your PATH , but there you have it! 假设你的位置在同一个位置,我不确定为什么/usr/bin不在你的PATH ,但是你有它!

Find out what your PATH actually is: 找出你的PATH究竟是什么:

% echo $PATH
/opt/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/bin/X11:/sw/bin:/sw/sbin

Fix your path and you'll be on your path to enlightenment. 修复你的道路,你将走上你的启蒙之路。

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

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