在尝试在OS X El Capitan上安装PyCrypto时发生致命错误。
在尝试在OS X El Capitan上安装PyCrypto时发生致命错误。
我正在尝试在OS X 10.11.3(El Capitan)上安装PyCrypto。我正在使用Python 3.5.1。我从https://pypi.python.org/pypi/pycrypto下载了gzip文件并解压缩了它。然后我运行了python setup.py build
,像说明中说的那样,它似乎做了一些事情,然后产生了以下输出:
/usr/bin/clang -fno-strict-aliasing -fno-common -dynamic -isysroot /Developer/SDKs/MacOSX10.6.sdk -arch i386 -arch x86_64 -fwrapv -Wall -Wstrict-prototypes -std=c99 -O3 -fomit-frame-pointer -Isrc/ -I/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c src/MD2.c -o build/temp.macosx-10.6-intel-2.7/src/MD2.o src/MD2.c:30:10: fatal error: 'string.h' file not found #include^ 1 error generated. error: command '/usr/bin/clang' failed with exit status 1
我尝试了python3 setup.py build
,得到了类似的输出:
/usr/bin/clang -fno-strict-aliasing -Wsign-compare -Wunreachable-code -fno-common -dynamic -fwrapv -Wall -Wstrict-prototypes -arch i386 -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.6.sdk -std=c99 -O3 -fomit-frame-pointer -Isrc/ -I/Library/Frameworks/Python.framework/Versions/3.5/include/python3.5m -c src/MD2.c -o build/temp.macosx-10.6-intel-3.5/src/MD2.o src/MD2.c:30:10: fatal error: 'string.h' file not found #include^ 1 error generated. error: command '/usr/bin/clang' failed with exit status 1
我试着通过谷歌搜索找出解决方法,但没有找到有用的内容。我该如何安装PyCrypto?
编辑:我还尝试了一些其他方法,如pip install pycrypto
和sudo pip3 install pycrypto
,但它们都没有成功。@l'L'l帮助我通过一些奇怪而复杂的方法使其工作,这些方法我自己从未想过。它们在下面的答案中总结。
在尝试安装PyCrypto时出现致命错误的原因可能是因为它引用了OS X 10.6 SDK,这可能是因为你没有这个SDK,而且在大部分情况下已经过时了。此外,SDK现在存储在一个完全不同的位置,与10.6 SDK的黄金时期相比。
不存在/过时的SDK:
由于在构建PyCrypto时它引用了“MacOSX10.6.sdk”,所以有几件事需要考虑:
1. 为什么它引用了一个过时的SDK
2. 它引用的SDK设置在哪里
3. 应该如何解决这个问题
除非我们仔细审查源代码,否则我们可能不知道错误标志位被设置在哪里,但我们可以尽力根据我们拥有的信息来解决问题。从错误中,我们可以看到10.6 SDK的名称在几个地方出现:
/usr/bin/clang -fno-strict-aliasing -fno-common -dynamic -isysroot /Developer/SDKs/MacOSX10.6.sdk -arch i386 -arch x86_64 -fwrapv -Wall -Wstrict-prototypes -std=c99 -O3 -fomit-frame-pointer -Isrc/ -I/Library
从源码分析中,我们可以看到PyCrypto的MD2.c文件尝试使用标志“-isysroot /Developer/SDKs/MacOSX10.6.sdk”来构建。可能值得尝试使用pip:
使用pip安装:
...
fatal error: 'string.h' file not found #include <string.h>
...
相同的错误;我们可能要找出系统中是否存在“
测试C头文件:
$ echo "#include <string.h>
#include <stdio.h>
int main() { printf(\"TEST\n\"); return 0; }" > t.c
$ clang t.c -o t
$ ./t
TEST
从测试结果可以看出,这个头文件确实存在,因为测试工作正常。这告诉我们问题更可能与10.6 SDK直接相关(在系统中似乎不存在)。
将(不存在的)10.6 SDK链接到10.11 SDK:
由于我们还没有确定SDK实际上被设置在哪里,所以我们将尝试创建符号链接,以便任何旧10.6 SDK的引用都链接到最新的SDK(目前是10.11):
$ cd /Developer/SDKs
$ sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk MacOSX10.6.sdk
我们可以通过以下命令验证符号链接:
$ ls -lat
total 8
drwxr-xr-x 3 root wheel 102 Feb 21 15:54 .
lrwxr-xr-x 1 root wheel 99 Feb 21 15:54 MacOSX10.6.sdk -> /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk
drwxr-xr-x 3 root wheel 102 Feb 21 15:52 ..
既然我们成功创建了符号链接,让我们再次尝试使用pip安装PyCrypto:
$ sudo pip install pycrypto
Collecting pycrypto
Downloading pycrypto-2.6.1.tar.gz (446kB)
100% |████████████████████████████████| 446kB 1.2GB/s
Installing collected packages: pycrypto
Running setup.py install for pycrypto ... done
Successfully installed pycrypto-2.6.1
没有错误!看起来我们的问题解决了!嗯,几乎解决了...
我们仍然需要弄清楚是什么导致构建过程中设置了错误的(10.6)SDK。让我们使用xcrun工具查看默认设置是什么:
$xcrun --show-sdk-version
10.11
系统默认的SDK设置为10.11,所以它肯定是被Python、PyCrypto或其他一些我们可能没有考虑到的异常设置成了10.6。
更新:
经过一些调查发现,Python 3似乎是使用OS X 10.6 SDK构建的。此外,它还将SDK设置为10.6,并在Python_Framework的多个地方设置了(过时)路径。这里有很多引用,我就不一一列举了,不过这里有一个例子:
Python_Framework Folder/Versions/3.5/lib/python3.5/config-3.5m/Makefile:79:CONFIGURE_CFLAGS= -arch i386 -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.6.sdk
我只能假设开发人员试图尽可能向后兼容,然而,不幸的是,这同时破坏了向前兼容性。
备注:
使用pip安装Python包可以在许多方面简化生活(包管理、更新、卸载等)。例如,安装PyCrypto只需要执行以下命令:
$ sudo pip install pycrypto
如果你有多个Python版本,你可以使用版本号相应地安装:
$ sudo pip3.5 install pycrypto
↳ https://pip.pypa.io/en/stable/installing/
如果你遇到问题,尝试重新下载苹果的命令行工具,然后安装它们:
http://adcdownload.apple.com/Developer_Tools/Command_Line_Tools_OS_X_10.11_for_Xcode_7.2/Command_Line_Tools_OS_X_10.11_for_Xcode_7.2.dmg
(你可能需要登录才能下载)。如果事情在这之后还不能正常工作,那么可能存在一个仍需要解决的路径问题。
你也可以通过Xcode安装:
https://developer.apple.com/library/prerelease/mac/recipes/xcode_help-locations_preferences/SpecifyingCommandLineTools/SpecifyingCommandLineTools.html#//apple_ref/doc/uid/TP40010523-CH7-SW1
你肯定有Xcode/系统组件完全丢失的问题(我认为主要是与Xcode有关)。我建议彻底删除Xcode并重新下载安装。我们没有更改你的PATH,所以你提到的问题很可能是由可能删除整个开发者文件夹的同一问题引起的。如果你继续遇到问题,那么考虑重新安装操作系统可能是一个值得考虑的选择,以恢复所有神秘消失的东西。
我即将删除、重新下载和重新安装XCode。重新安装操作系统听起来很麻烦,所以除非有什么无法解决的问题,否则我可能不会这样做。
我重新安装了XCode,现在我可以再次运行git。
谢谢你!在它能正常工作之前,我必须删除/重命名现有的MacOSX10.6.sdk。使用ls -lat验证链接对我来说很关键。谢谢你的指导!