遇到的問題:
最近在嘗試使用動態庫,編譯沒有問題,但運行時報錯,這對於第一次使用動態庫來說,簡直是個巨大的打擊。開始一直以爲動態庫沒能加載是路徑選擇錯誤,浪費的大把時間。仔細看日誌後,發現動態庫居然要簽名,不簽名就不讓用,好像是從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編譯代碼時依賴的系統庫,全部都被簽名了。如果你還依賴了別的動態庫,需要再單獨進行簽名。
總結:
動態庫引入簽名,本意是好的,但是強制要求籤名,還是挺坑人的。
關於簽名的其他命令操作:
- 清除動態庫的簽名:
codesign --remove-signature xxx.dylib
- 查看簽名:
codesign -v xxx.dylib
- 重新簽名:
codesign的-f參數就是強制簽名的意思,本文使用的codesign -f -s
就能直接重新簽名。如果不想覆蓋原來的簽名,可以把-f
參數去掉。