舊工程適配iOS 6和iPhone 5之第三方靜態庫

如果你的工程沒有使用第三方的靜態庫或者framework,那麼看完舊工程適配iOS 6iPhone 5的一些故事基本上適配也就結束了,可是像筆者這樣有的工程裏用到第三方庫了,打包的時候還會提示下面的問題:

1
2
 ld: file is universal (3 slices) but does not contain a(n) armv7s slice: /Users/mac4/Desktop/my desktop/My app/MyApp name 20:09:12  /MyApp name/ZBarSDK/libzbar.a for architecture armv7s
clang: error: linker command failed with exit code 1 (use -v to see invocation)

上面的提示就是我使用的libzbar這個庫不支持armv7s。
關於第三方庫,如果是閉源的,像一些廣告的SDK以及合作方提供的SDK就只能等了,人家啥時候更新啥時候算。像我遇到的ZBarSDK,這種第三方開源的SDK,就不要等了,還是自已動手豐衣足食吧。
首先關於閉源的庫,一個臨時的解決辦法就是,先取消對armv7s的支持,這樣就可以不用等第三方的庫就開始測試了,辦法是:
在Xcode裏,點擊相應的Target,然後點Build Settings,找到VALID_ARCHS,然後刪除裏面的arvm7s,就可以了。

ok,上面只是臨時解決辦法,說正事兒。以編譯ZBar爲例:
1.去Zbar的主頁,下載源碼包。
2.解壓以後,進入裏面的iPhone文件夾,刪除裏面的Examples,雙擊zbar.xcodeproj運行工程。
3.Command+B編譯工程(當然了這一步會提醒更新Setting,建議更新完以後再運行)。


4.然後在lib上點右鍵去目錄裏找嘍。

ok,本來故事到這裏應該就結束了,但是上面找到的那個文件,只能在真機用,模擬器用不了,怎麼辦呢?
進入到這個工具的Build目錄,會看到下面這些目錄

1
Debug-iphoneos/          Debug-iphonesimulator/   Release-iphoneos/        Release-iphonesimulator/

自已動手將模擬器的包和真機的包合併一下就好了。

1
2
3
[rainbird@localhost Products]$ pwd
/Users/rainbird/Library/Developer/Xcode/DerivedData/zbar-athgobfbdtwgftgcogpuwegpawlj/Build/Products
[rainbird@localhost Products]$ lipo -create Release-iphoneos/libzbar.a Release-iphonesimulator/libzbar.a -o libzbar.a

解釋一下lipo合併兩個庫的命令:lipo -create 第一個包 第二個包 -o 合併以後的包
這樣的話,得到的libzbar.a就可以同時在模擬器和真機用了。這裏有個小插曲,靜態庫編譯一次,會生成所有的包,而我一上來就用的真機上的包,然後模擬器上用不了,又在真機的位置找了半天,以爲生成不了模擬器的包,哎,思維定勢了。
關於lipo還有一個常用的命令就是查看包的信息-info參數

1
2
[rainbird@localhost Products]$ lipo -info libzbar.a 
Architectures in the fat file: libzbar.a are: armv7 (cputype (12) cpusubtype (11)) i386

感謝開發者Rainbird的分享!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章