尝试在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 <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通过做一些我自己永远不会有的奇怪,复杂的事情来帮助我让它工作。它们总结在下面的答案中。

概述:

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

新开发工具包位置:

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

旧 SDK 位置:

/Developer/SDKs/

不存在/过时的软件开发工具包:

由于在尝试构建 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

从源代码构建:

/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>
...

同样的错误;我们可能应该找出系统上是否存在<string.h>标头 — 让我们C应用程序进行快速测试以找出:

测试 C 标头:

$ echo "#include <string.h>
#include <stdio.h>
int main() { printf("TESTn"); 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,则可以相应地使用版本号为该 Python 安装:

$ sudo pip3.5 install pycrypto

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

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

相关内容

  • 没有找到相关文章

最新更新