尝试在 OS X El Capitan 上安装 PyCrypto 时出现致命错误

Posted

技术标签:

【中文标题】尝试在 OS X El Capitan 上安装 PyCrypto 时出现致命错误【英文标题】:Fatal error when trying to install PyCrypto on OS X El Capitan 【发布时间】:2016-02-18 00:48:25 【问题描述】:

我正在尝试在 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 <string.h>
         ^
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 <string.h>
         ^
1 error generated.
error: command '/usr/bin/clang' failed with exit status 1

我尝试用谷歌搜索找出要做什么,但找不到任何有用的东西。如何安装 PyCrypto?

编辑:我还尝试了其他几种方法,例如 pip install pycryptosudo pip3 install pycrypto,但它们都不起作用。 @l'L'l 通过做一些我自己永远不会做的奇怪、复杂的事情来帮助我让它工作。它们总结在下面的答案中。

【问题讨论】:

您是否安装了 xcode 或命令行工具?您需要它才能使用标准库、llvm 等。 也许创建这个符号链接是可行的,假设 OS X 10.11 和 Xcode 7.x 存在同样的问题? gist.github.com/chrisyip/5b3cdb6a916f55354201#file-stdlib-h-md 事实上,其他人似乎遇到了与解决方案非常相似的问题***.com/questions/13588518/… 你检查ls -al /usr/include了吗?如果看起来不正确,不妨试试sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include /usr/include? 试试unset DYLD_LIBRARY_PATH? 【参考方案1】:

概述:

您尝试的手动构建看起来可能会失败,因为它引用了您可能没有的 OS X 10.6 SDK,而且大部分时间都已过时。此外,与 10.6 SDK 的全盛时期相比,SDK 现在存储在完全不同的位置。

新 SDK 位置:

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/

旧 SDK 位置:

/Developer/SDKs/

不存在/过时的 SDK:

由于在尝试构建 PyCrypto 时似乎引用了 MacOSX10.6.sdk,因此需要考虑几件事:

    为什么引用过时的 SDK 它所引用的 SDK 在哪里设置 应该如何解决这个问题

除非我们仔细审核源代码,否则我们可能无法确切知道错误标志的设置位置,但我们可以尽最大努力使用我们拥有的信息。从报错中我们可以看出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

从源代码构建:

/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 <string.h>
                 ^
1 error generated.
error: command '/usr/bin/clang' failed with exit status 1

分析这一点,我们可以看到 PyCrypto 的 MD2.c 文件正在尝试使用标志 -isysroot /Developer/SDKs/MacOSX10.6.sdk 构建。可能值得尝试pip

使用 pip 安装:

...
fatal error: 'string.h' file not found #include <string.h>
...

同样的错误;我们可能应该找出系统中是否存在&lt;string.h&gt; 标头——让我们快速测试C 应用程序来找出:

测试 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 直接相关(系统上似乎不存在该 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

如果您有multiple Python's,您可以使用相应的版本号为该 Python 安装:

$ sudo pip3.5 install pycrypto

↳https://pip.pypa.io/en/stable/installing/

【讨论】:

啊...我考虑过使用 pip。我没有这样做的唯一原因是因为我找到的文档没有提到它。无论如何,我尝试了pip install pycryptosudo pip install pycryptosudo pip3.5 install pycrypto,但每次都得到同样的fatal error: 'string.h' file not found 错误。 尝试再次从 Apple 下载命令行工具,然后安装它们:adcdownload.apple.com/Developer_Tools/…。 (您可能需要登录才能下载)。如果在那之后一切都不起作用,那么很可能是路径问题需要解决。 也可以通过Xcode安装:developer.apple.com/library/prerelease/mac/recipes/… @I'L'l,第一个链接告诉我“此页面不再存在或您登录的 Apple ID 无权查看此页面。”。 谢谢!!我必须删除/重命名现有的 MacOSX10.6.sdk 才能工作。验证与ls -lat 的链接对我来说很关键。感谢您的精彩指导!【参考方案2】:

当我运行pip install pycrypto 时,我遇到了可能与 OSX El Capitan 相关的问题。我看到RuntimeError: autoconf error。我所要做的就是在查看许可协议后运行sudo xcodebuild -license 并输入agree。之后我就可以使用 pip 安装 pycrypto 了。

【讨论】:

以上是关于尝试在 OS X El Capitan 上安装 PyCrypto 时出现致命错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Mac OS X 10.11.6 El Capitan 上安装 ffmpeg 时出现问题 [关闭]

在 Mac OS X El Capitan 10.11.4 上安装 MySQL 5.7

使用 OS X El Capitan 安装 xcode 命令行工具

sh 在OS X El Capitan上安装Autoconf和Automake

安装 OS X El Capitan 后,Apache 无法正常工作

制作 Mac OS X El Capitan 的U盘引导安装