將dylib庫嵌入macOS應用的方法


寫做是一種習慣,稍微鬆懈,也許失去的就不少。過了一個年,竟然不少天都沒有更新,幸福的代價吧:)程序員

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

隨後發現macOS的dylib採起了比較特殊的機制,每一個文件都內置有完整的路徑名,若是不把dylib文件放置到這個路徑上去,應用調用dylib的時候就會報錯找不到庫文件。
官方推薦的解決的方法是將庫文件及頭文件打包編譯爲Frameworks,隨後引入到項目中。不過對於不少gnu的跨平臺程序員,確定不但願單獨爲macOS來寫一個Xcode工程。
因此我建議仍是使用內置的工具來修改這個執行路徑,步驟以下:app

  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文件,編譯時候會放置到這裏。框架

  1. 隨後在程序中正常引用dylib的頭文件,注意.h頭文件要拷貝到開發目錄或者在工程中設置搜索路徑來引用。
  2. 在工程設置的General->Embedded Binaries中引入所使用的庫文件libabc.0.dylib,這是保證app編譯連接的時候可以正常經過。我記得Xcode7仍是什麼版本中,在這裏銀如意了庫文件,庫文件就會被自動的加入到Frameworks目錄,但也許是否是sdk內置的庫文件,只在這裏引用解決了連接問題,但並不能自動把dylib庫文件打包到app中。
  3. 在工程設置的Build Phases中,點左上角「+」,選擇Embed Libraries,而後在其中選擇Destination爲Frameworks,其它項目保持默認值不變。把libabc.0.dylib文件拖過來到本項目下面的列表中。這樣編譯的時候,纔會把庫文件打包到app的Frameworks文件夾。

作完了以上這些,編譯出來的app應用就能正確的調用本身包中的庫文件了。工具

相關文章
相關標籤/搜索