簡體   English   中英

嘗試在OS X El Capitan上安裝PyCrypto時出現致命錯誤

[英]Fatal error when trying to install PyCrypto on OS X El Capitan

我正在嘗試在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處於最佳狀態時完全不同的位置。

新SDK位置:

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

舊SDK位置:

/Developer/SDKs/

不存在/過時的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

從源頭構建:

/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(\"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 ,則可以使用版本號為該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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM