macOS Sierra 上安裝 mysqlclient 問題

99.9% 的人不需要看這篇文章。我是說真的。

寫在前面

好久沒有寫這種類型的文章了,記錄遇到的具體問題。

隨著搜索水平的提高,特別是英文搜索水平的提高,這種類型的文章感覺越來越?jīng)]有價(jià)值,因?yàn)橐凰阉骶驼业搅舜鸢?。難怪大家說,現(xiàn)在的程序員 = 搜索引擎 + Ctrl+C + Ctrl+V 。

今天寫這個(gè)文章是因?yàn)榛顺阅痰牧馊匀凰阉鞑坏酱鸢?,最后還是靠經(jīng)驗(yàn)和基礎(chǔ)知識(shí)解決。問題是這樣,在 macOS Sierra 上使用 pip 安裝 mysqlclient 時(shí)遇到錯(cuò)誤,無法鏈接到 libssl 庫,系統(tǒng)上明明安裝了 openssl 可是就是鏈接不到。

看到這里,99% 的讀者可以關(guān)掉這個(gè)頁面走人了。

問題現(xiàn)象

系統(tǒng)安裝了 mysql ,使用 pip install mysqlclient 時(shí)出錯(cuò),錯(cuò)誤信息如下:

building '_mysql' extension
creating build/temp.macosx-10.6-intel-3.5
/usr/bin/clang -fno-strict-aliasing -Wsign-compare -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -arch i386 -arch x86_64 -g -Dversion_info=(1,3,9,'final',1) -D__version__=1.3.9 -I/usr/local/Cellar/mysql/5.7.16/include/mysql -I/Library/Frameworks/Python.framework/Versions/3.5/include/python3.5m -c _mysql.c -o build/temp.macosx-10.6-intel-3.5/_mysql.o -fno-omit-frame-pointer
/usr/bin/clang -bundle -undefined dynamic_lookup -arch i386 -arch x86_64 -g build/temp.macosx-10.6-intel-3.5/_mysql.o -L/usr/local/Cellar/mysql/5.7.16/lib -lmysqlclient -lssl -lcrypto -o build/lib.macosx-10.6-intel-3.5/_mysql.cpython-35m-darwin.so
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
error: command '/usr/bin/clang' failed with exit status 1

錯(cuò)誤出現(xiàn)的系統(tǒng)是 macOS Sierra, 在 EI Capitan 上安裝沒有遇到這個(gè)問題。

問題分析

系統(tǒng)上明明裝了 openssl 庫,可是為什么找不到 libssl 呢?找了一堆答案都是教大家用 brew link --force openssl ,可是這個(gè)方法對 macOS Sierra 無效。原因是蘋果現(xiàn)在不用 openssl 了,而是使用自己維護(hù)的加密算法庫。為什么要這樣做,不得而知,或許是被 openssl 經(jīng)常爆出的滴血漏洞傷透了心吧。

所以,要在 mac 上鏈接 ssl 庫,需要指定庫的路徑,即加上 -L/usr/local/opt/openssl,把這個(gè)目錄加進(jìn)庫的搜索路徑即可。

細(xì)心的人在用 brew install openssl 時(shí)會(huì)注意到下面的信息:

This formula is keg-only, which means it was not symlinked into /usr/local.

Apple has deprecated use of OpenSSL in favor of its own TLS and crypto libraries

Generally there are no consequences of this for you. If you build your
own software and it requires this formula, you’ll need to add to your
build variables:

LDFLAGS: -L/usr/local/opt/openssl/lib
CPPFLAGS: -I/usr/local/opt/openssl/include
PKG_CONFIG_PATH: /usr/local/opt/openssl/lib/pkgconfig

解決方案

  1. 從 Github 上下載 mysqlclient 源碼
  2. 進(jìn)入項(xiàng)目的 virtualenv 環(huán)境。為什么要這一步,因?yàn)槲覀兿M?mysqlclient 安裝到項(xiàng)目所在的 python 運(yùn)行環(huán)境中
  3. 運(yùn)行 python setup.py install,這個(gè)時(shí)候肯定還是報(bào)錯(cuò)的
  4. 拷貝命令臺(tái)上的最后一個(gè)報(bào)錯(cuò)的命令,在 -L/usr/local/Cellar/mysql/5.7.16/lib 后面增加如下內(nèi)容 -L/usr/local/opt/openssl,然后回車再執(zhí)行一遍這個(gè)命令
  5. 再次運(yùn)行 python setup.py install 即可成功安裝

當(dāng)然,這個(gè)做法是偷懶的做法。真正優(yōu)雅一點(diǎn)的是修改 mysqlclient 的編譯腳本,直接把 ssl 庫增加進(jìn)去。或許還可以向開發(fā)者提個(gè) PR 來解決這個(gè)問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容