上一篇 咱們演示了了如何建立本身的靜態庫,最終生成多個.a文件,根據須要引用工程就能夠直接使用靜態庫了,可是有個很麻煩的問題,模擬器用的庫和真機的不是同一個,當咱們切換的時候須要更換靜態庫,有兩種方式能夠改善這個問題html
1、合併靜態庫sql
lipo –create Release-iphoneos/libsqlcipher.a Release-iphonesimulator/libsqlcipher.a –output libsqlcipher.a
合併後的.a庫就能夠通用了xcode
2、配置工程庫路徑iphone
配置路徑和編譯參數後xcode會自動找到路徑下的庫引入到項目測試
一、建立工程CalculatorTest,咱們把編譯好的靜態庫賦值到工程目錄下ui
二、設置Library Search Path,添加下面兩個參數spa
$(SRCROOT)/Libs/Debug$(EFFECTIVE_PLATFORM_NAME) $(SRCROOT)/Libs/Release$(EFFECTIVE_PLATFORM_NAME)
$(SRCROOT):表示當前工程的根路徑,能夠在右邊看到實際對應的路徑.net
$(EFFECTIVE_PLATFORM_NAME):表明當前配置是OS,若是是模擬器則爲-iphonesimulator,真機則爲-iphoneos3d
通常第三方庫只提供Release版本,若是隻有Release版,則兩個都設置Release便可 code
三、設置編譯參數
Build Settings -> Linking -> Other Linker Flags
添加:-lCalculator
編譯靜態庫的時候,xcode默認會自動把庫名加上lib前綴
注:
一、前面加橫槓'-',lib改成l
二、若是靜態庫中有category,那麼須要添加 -ObjC 參數標識,不然可能會報:unrecognized selector sent to instance
三、參數說明(引用自:http://www.cnblogs.com/robinkey/archive/2013/05/27/3101095.html)
-ObjC:加了這個參數後,連接器就會把靜態庫中全部的Objective-C類和分類都加載到最後的可執行文件中
-all_load:會讓連接器把全部找到的目標文件都加載到可執行文件中,可是千萬不要隨便使用這個參數!假如你使用了不止一個靜態庫文件,而後又使用了這個參數,那麼你頗有可能會遇到ld: duplicate symbol錯誤,由於不一樣的庫文件裏面可能會有相同的目標文件,因此建議在遇到-ObjC失效的狀況下使用-force_load參數。
-force_load:所作的事情跟-all_load實際上是同樣的,可是-force_load須要指定要進行所有加載的庫文件的路徑,這樣的話,你就只是徹底加載了一個庫文件,不影響其他庫文件的按需加載
四、編譯方式(引用自:http://blog.csdn.net/zhangkongzhongyun/article/details/8047500)
靜態庫中採用ObjectC++實現,所以須要您保證您工程中至少有一個.mm後綴的源文件(您能夠將任意一個.m後綴的文件更名爲.mm),或者在工程屬性中指定編譯方式,即將XCode的Project -> Edit Active Target -> Build -> GCC4.2 - Language -> Compile Sources As設置爲"Objective-C++"
四、配置完成,添加頭文件到工程
五、編譯測試,調用靜態庫內部方法
調用成功
六、Demo
http://files.cnblogs.com/files/bomo/CompileStaticLibrary2.zip