XCode 動態庫未簽名問題的解決

遇到的問題:

最近在嘗試使用動態庫,編譯沒有問題,但運行時報錯,這對於第一次使用動態庫來說,簡直是個巨大的打擊。開始一直以爲動態庫沒能加載是路徑選擇錯誤,浪費的大把時間。仔細看日誌後,發現動態庫居然要簽名,不簽名就不讓用,好像是從maxOS 10.14開始搞的事情:

dyld: Library not loaded: /usr/local/opt/opencv/lib/libopencv_flann.4.1.dylib
Referenced from: /Users/xxx/Library/Developer/Xcode/DerivedData/OpenCV-frdcgrfkxsvbyahjaonnyllerinn/Build/Products/Debug/OpenCV
Reason: no suitable image found. Did find:
/usr/local/opt/opencv/lib/libopencv_flann.4.1.dylib: code signature in (/usr/local/opt/opencv/lib/libopencv_flann.4.1.dylib) not valid for use in process using Library Validation: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.
/usr/local/lib/libopencv_flann.4.1.dylib: code signature in (/usr/local/lib/libopencv_flann.4.1.dylib) not valid for use in process using Library Validation: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.
/usr/local/Cellar/opencv/4.1.1_2/lib/libopencv_flann.4.1.1.dylib: code signature in (/usr/local/Cellar/opencv/4.1.1_2/lib/libopencv_flann.4.1.1.dylib) not valid for use in process using Library Validation: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.

關鍵錯誤信息是:code signature in (*.dylib) not valid for use in process using Library Validation: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.
運行時錯誤

安裝錯誤提示,需要對dylib進行簽名。

簽名步驟:

1. 複製證書名稱

先打開keychain Access.app (中文名是:鑰匙串訪問),選擇你的證書,複製證書名稱。
你的證書

2. 簽名命令如下:

codesign -f -s "Mac Developer: 你的開發者郵箱" xxx.dylib

當你對報錯的dylib進行簽名後,會發現還要你對別的dylib也簽名,於是就陷入了簽名的死循環裏,不停的簽名。

3. 解決簽名的循環坑:

直接將系統的全部dylib都進行簽名:

codesign -f -s "Mac Developer: 你的開發者郵箱" /usr/local/opt/*/lib/*.dylib

該命令將目錄/usr/local/opt下的全面dylib都進行了簽名,也就是說,XCode編譯代碼時依賴的系統庫,全部都被簽名了。如果你還依賴了別的動態庫,需要再單獨進行簽名。

總結:

動態庫引入簽名,本意是好的,但是強制要求籤名,還是挺坑人的。

關於簽名的其他命令操作:

  1. 清除動態庫的簽名:
codesign --remove-signature xxx.dylib
  1. 查看簽名:
codesign -v xxx.dylib
  1. 重新簽名:
    codesign的-f參數就是強制簽名的意思,本文使用的codesign -f -s就能直接重新簽名。如果不想覆蓋原來的簽名,可以把-f參數去掉。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章