天天看點

dylib java_将dylib庫嵌入macOS應用的方法

dylib java_将dylib庫嵌入macOS應用的方法

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

标題的問題其實以前碰到過,不過當時在iOS,是以随手處理了沒有重視。

而這次是在macOS,所使用的庫,本身已經用brew安裝過,是以本機調試沒有發現這個問題。

等到拷貝到使用者的機器上,突然發現程式無法啟動,檢視log才發現庫沒有找到。而實際上當時,我已經很确認的将dylib庫檔案打包到了app中。

随後發現macOS的dylib采取了比較特殊的機制,每個檔案都内置有完整的路徑名,如果不把dylib檔案放置到這個路徑上去,應用調用dylib的時候就會報錯找不到庫檔案。

官方推薦的解決的方法是将庫檔案及頭檔案打包編譯為Frameworks,随後引入到項目中。不過對于很多gnu的跨平台程式員,肯定不希望單獨為macOS來寫一個Xcode工程。

是以我建議還是使用内置的工具來修改這個執行路徑,步驟如下:

假設我們的庫檔案名為libabc.0.dylib,通常是放置在/usr/local/lib檔案夾中,為了不影響macOS下面其它應用對這個庫的調用,我們首先把這個檔案拷貝出來到我們的開發工作目錄。

使用otool -L libabc.0.dylib指令來檢視這個庫内置的路徑名,沒有意外的話,應當是/usr/local/lib/libabc.0.dylib。

修改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應用就能正确的調用自己包中的庫檔案了。