關於iOS上的靜態庫,iOS上靜態庫
最近再進行項目的真機調試,然後發現了一個天坑。就此研究了一些iOS上的靜態庫的使用:
首先我們是直接拿一個可以啟動並執行項目來製作靜態庫的,網上大部分都是先建立靜態庫然後再寫內容,看看我的方法。
1.把子項目匯入到總項目工程裡面,然後刪除子項目的運行檔案,然後再裡面建立一個靜態庫!!!(不要建立framework那個,非常坑。我給坑了好久具體下面在說吧)建立一個.a的靜態庫。名字沒有什麼影響自己喜歡就可以,我一般是按照原來的名字來的。
2.然後在總項目工程裡面添加連結 Build Phases ->Target Dependencies 和 Link Binary With Libraries 裡面添加上我們自己建立的那個靜態庫。
3.我們還需要在子項目裡面進行一些配置 選擇子項目,然後TARGETS 裡面選擇自己建立的靜態庫 Build Phases ->Compile Sources 這個裡面把自己需要的實現檔案添加進去(.m檔案) 如果檔案很多的話其實還有一種偷懶的方法就是先建立靜態庫然後把這些檔案從原來的項目裡面拖過來,Xcode會自動添加這些實現檔案。(我曾經自己添加100多個檔案,有點煩。)
4.這樣就剩最後一步了,在主專案裡面 TARGETS -> Build Settings -> User Header Search Paths 裡面設定檔案的位置。是檔案夾的位置例: ../PKQ/PKQ ../是上級目錄的意思。然後這個選項裡面有一個選擇recursive 的意思是遍曆整個檔案(有時候用的時候不好用。。)
5.這樣我們就可以在其他地方調用我們的靜態庫了0v0
然後接下來的就是一些注意點:
1.靜態庫裡面不能有 這種庫 libsqlite3.tbd 這些檔案。直接加到主專案裡就可以了,那個bundle檔案也加到主專案裡面就可以了。
2.如果靜態庫裡面有分類 xcode是不能正常載入這些檔案的 找到主工程的 Target -> Build Setting ->Linking 更改其 Other Linker Flags 為: -all_load 或 -force_load 即可。 -all_load的意思是把全部項目都載入進去,一般情況都可以添加這個不過首先會影響運行速度然後有時候其他檔案就莫名其妙的報錯了。我之前做的項目就遇見了這個問題,之前的項目是C++混編的然後使用-all_load 就會出現很多錯誤。這種時候就需要-force_load這個標籤了, $(SRCROOT)/../Vendors/build/Debug-iphonesimulator/libVendors.a 路徑就直接把靜態庫拉過去然後刪除了""然後和-force_load 空一格就可以了。
然後要提的是上面之前說的framework xcode內建建立出來的預設是動態庫,不能真機不能上架.然後你雖然可以改成靜態庫的。Target ->Mach-O Type 裡面設定成Static Library就變成靜態庫了。但是這個靜態庫是.framework是不能使用-force_load這個標籤!!!(我最後有刪除這個建立一個.a的靜態庫重新拉了實現檔案= =)
3.不知道還有什麼注意了。就剩下靜態庫的合成了,因為經常要改路徑很麻煩。那我們把真機和模擬器的合成成一個.a檔案。 這個我們要在終端裡面來完成 cd 然後目標路徑 有2個操作 1.lipo -info 靜態庫檔案 這樣就知道靜態庫支援那個模式了 這個是大概看一下,不過基本上沒有什麼用 2. lipo -create Debug-iphoneos/libVendors.a Debug-iphonesimulator/libVendors.a -output libVendors.a 這個是把2個路徑的靜態庫合成成一個靜態庫的指令。合成成功後把新的靜態庫拖到原來的路徑上覆蓋就可以了。
如果我上面說的有什麼問題請告訴,我也是個新手。希望能協助到你