上一篇 我們演示了了如何創建自己的靜態庫,最終生成多個.a文件,根據需要引用工程就可以直接使用靜態庫了,但是有個很麻煩的問題,模擬器用的庫和真機的不是同一個,當我們切換的時候需要更換靜態庫,有兩種方式可以改善這個問題
一、合並靜態庫
lipo –create Release-iphoneos/libsqlcipher.a Release-iphonesimulator/libsqlcipher.a –output libsqlcipher.a
合並后的.a庫就可以通用了
二、配置工程庫路徑
配置路徑和編譯參數后xcode會自動找到路徑下的庫引入到項目
1、創建工程CalculatorTest,我們把編譯好的靜態庫賦值到工程目錄下
2、設置Library Search Path,添加下面兩個參數
$(SRCROOT)/Libs/Debug$(EFFECTIVE_PLATFORM_NAME) $(SRCROOT)/Libs/Release$(EFFECTIVE_PLATFORM_NAME)
$(SRCROOT):表示當前工程的根路徑,可以在右邊看到實際對應的路徑
$(EFFECTIVE_PLATFORM_NAME):代表當前配置是OS,如果是模擬器則為-iphonesimulator,真機則為-iphoneos
一般第三方庫只提供Release版本,如果只有Release版,則兩個都設置Release即可
3、設置編譯參數
Build Settings -> Linking -> Other Linker Flags
添加:-lCalculator
編譯靜態庫的時候,xcode默認會自動把庫名加上lib前綴
注:
1、前面加橫杠'-',lib改為l
2、如果靜態庫中有category,那么需要添加 -ObjC 參數標識,否則可能會報:unrecognized selector sent to instance
3、參數說明(引用自: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需要指定要進行全部加載的庫文件的路徑,這樣的話,你就只是完全加載了一個庫文件,不影響其余庫文件的按需加載
4、編譯方式(引用自: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++"
4、配置完成,添加頭文件到工程
5、編譯測試,調用靜態庫內部方法
調用成功
6、Demo
http://files.cnblogs.com/files/bomo/CompileStaticLibrary2.zip