將dylib庫嵌入macOS應用的方法



寫作是一種習慣,稍微松懈,也許失去的就很多。過了一個年,居然很多天都沒有更新,幸福的代價吧:)

標題的問題其實以前碰到過,不過當時在iOS,所以隨手處理了沒有重視。
而這次是在macOS,所使用的庫,本身已經用brew安裝過,所以本機調試沒有發現這個問題。
等到拷貝到用戶的機器上,突然發現程序無法啟動,查看log才發現庫沒有找到。而實際上當時,我已經很確認的將dylib庫文件打包到了app中。

隨后發現macOS的dylib采取了比較特殊的機制,每個文件都內置有完整的路徑名,如果不把dylib文件放置到這個路徑上去,應用調用dylib的時候就會報錯找不到庫文件。
官方推薦的解決的方法是將庫文件及頭文件打包編譯為Frameworks,隨后引入到項目中。不過對於很多gnu的跨平台程序員,肯定不希望單獨為macOS來寫一個Xcode工程。
所以我建議還是使用內置的工具來修改這個執行路徑,步驟如下:

  1. 假設我們的庫文件名為libabc.0.dylib,通常是放置在/usr/local/lib文件夾中,為了不影響macOS下面其它應用對這個庫的調用,我們首先把這個文件拷貝出來到我們的開發工作目錄。
  2. 使用otool -L libabc.0.dylib命令來查看這個庫內置的路徑名,沒有意外的話,應當是/usr/local/lib/libabc.0.dylib
  3. 修改dylib文件中保存的文件路徑:
install_name_tool -id @executable_path/../Frameworks/libabc.0.dylib libabc.0.dylib 

注意修改之后的路徑@executable_path/../Frameworks/libabc.0.dylib,這個是app中的Frameworks目錄,許多引用的框架和sdk內置的dylib文件,編譯時候會放置到這里。
4. 隨后在程序中正常引用dylib的頭文件,注意.h頭文件要拷貝到開發目錄或者在工程中設置搜索路徑來引用。
5. 在工程設置的General->Embedded Binaries中引入所使用的庫文件libabc.0.dylib,這是保證app編譯鏈接的時候能夠正常通過。我記得Xcode7還是什么版本中,在這里銀如意了庫文件,庫文件就會被自動的加入到Frameworks目錄,但也許是不是sdk內置的庫文件,只在這里引用解決了鏈接問題,但並不能自動把dylib庫文件打包到app中。
6. 在工程設置的Build Phases中,點左上角“+”,選擇Embed Libraries,然后在其中選擇Destination為Frameworks,其它項目保持默認值不變。把libabc.0.dylib文件拖過來到本項目下面的列表中。這樣編譯的時候,才會把庫文件打包到app的Frameworks文件夾。

做完了以上這些,編譯出來的app應用就能正確的調用自己包中的庫文件了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM