2010-05-08 92 views
15

我知道這個問題已經提出了幾次,但是我的目標與我在網上搜索的內容略有不同。具體來說,我已經能夠爲iPhone構建一個靜態庫,但是我能夠構建的最終的fat文件僅包含arm和i386體系結構(我不確定哪些手臂指的是v6或v7?)。我無法專門爲armv6和armv7編譯,並且他們使用lipo合併了兩種架構。 lipo tool抱怨armv6和armv7庫中都存在相同的體系結構(arm,而不是armv6或armv7)。我如何爲armv6,armv7和i386編譯一個靜態庫(fat)

有人可以解釋如何爲armv6和armv7構建,並且他們使用lipo將這些庫合併成一個胖文件?

編輯:我需要構建不使用Xcode,而是直接編譯傳統的unix庫。

回答

7

只需使用libtool兩個ARM6和ARM7版本聯繫在一起 - 它是什麼做的XCode。但是,如果您嘗試將這些靜態庫合併到一個新的超級庫中,則會遇到問題。如果您需要這樣做,請閱讀this

如果你已經這麼做了,那就是爲什麼lipo抱怨你的「armv6」庫包含armv6和armv7。由於您不使用XCode,因此我的帖子中有一個修補程序可能會更容易一些,但基本上,您可以使用lipo -extract來確保您擁有一個薄的armv6庫和一個薄的armv7庫,然後再繼續操作。

2

確保將您的構建設置設置爲Valid Architectures: armv6 armv7Architectures: Optimized (armv6 armv7)。這應該會導致針對v6 & v7優化的二進制文件。如果您不確定是否成功,只需設置Architectures: Standard (armv6)並比較文件大小。優化應該產生兩倍的大小(當我記得沒錯的時候)。

您也可以在您的二進制文件上始終使用lipo -info查看所有包含的架構。

我的應用程序的分佈構建運行它給了我:

ullrich ~/Code/.../build/Distribution-iphoneos/My.app (streaming)$ lipo -info My 
Architectures in the fat file: My are: armv6 armv7 
+0

對不起,我忘了提及,我需要建立這不使用Xcode,但直接編譯一個傳統的UNIX庫。我正在編輯我的答案以反映這一事實。 – 2010-05-08 09:42:04

2

在重新加入之前,似乎沒有必要從胖子庫中提取(如jamie的回答中所述)。我使用的是蘋果公司最終的4.0 SDK,默認情況下它會創建fat armv6/armv7庫。

我先前指定的架構對輸入的lib像這樣:

$DEVROOT/usr/bin/lipo -arch arm $PROJECT_DIR/buildlib/Release-iphoneos/lib.a -arch i386 $PROJECT_DIR/buildlib/Release-iphonesimulator/lib.a -create -output $PROJECT_DIR/buildlib/lib.a 

這個失敗對後來的SDK,但是除去了(現在的脂肪)的ARM架構的lib正常工作:

$DEVROOT/usr/bin/lipo $PROJECT_DIR/buildlib/Release-iphoneos/lib.a -arch i386 $PROJECT_DIR/buildlib/Release-iphonesimulator/lib.a -create -output $PROJECT_DIR/buildlib/lib.a 

Lipo現在必須能夠檢測胖庫中的體系結構。

10

這裏是一個很好的解決方案,我發現:Static Libs With Support to iOS 5 and Arm64

被修改:

的解決方案是構建使用脂,然後分離結合他們不同的體系結構,通過使用命令行(或Rake文件)。

首先使用xcodebuild聯編構建與ARM二進制:

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphoneos7.0' clean build ARCHS='armv7 armv7s' IPHONEOS_DEPLOYMENT_TARGET='5.0' TARGET_BUILD_DIR='./build-arm' BUILT_PRODUCTS_DIR='./build-arm' 

請注意,您必須設置IPHONEOS_DEPLOYMENT_TARGET =「5.0」和ARCHS =「的ARMv7 armv7s」,建議設置構建和產品迪爾斯做的事更清楚的,看看構建設置參考瞭解更多細節這個標誌的含義。

下一頁構建arm64:

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphoneos7.0' clean build ARCHS='arm64' IPHONEOS_DEPLOYMENT_TARGET='7.0' TARGET_BUILD_DIR='./build-arm64' BUILT_PRODUCTS_DIR='./build-arm64' 

註上ARCHS和IPHONEOS_DEPLOYMENT_TARGET的差異。我們還需要建立模擬器,在這種情況下,我們必須改變SDK來iphonesimulator7.0並首先在兩個步驟建立i386的:

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphonesimulator7.0' clean build ARCHS='i386' IPHONEOS_DEPLOYMENT_TARGET='5.0' TARGET_BUILD_DIR='./build-i386' BUILT_PRODUCTS_DIR='./build-i386' 

現在棘手的問題!如果您只是根據您的Xcode設置將ARCHS更改爲x86_86,則會出現如下錯誤:「x86_64不是有效的arch」。爲了避免這個只需添加VALID_ARCHS =「x86_64的」:

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphonesimulator7.0' clean build ARCHS='x86_64' VALID_ARCHS='x86_64' IPHONEOS_DEPLOYMENT_TARGET='7.0' TARGET_BUILD_DIR='./build-x86_64' BUILT_PRODUCTS_DIR='./build-x86_64' 

最後,我們只需要創建一個胖二進制的所有5層架構:

lipo -create './build-arm/libStaticLibDemo.a' './build-arm64/libStaticLibDemo.a' './build-i386/libStaticLibDemo.a' './build-x86_64/libStaticLibDemo.a' -output 'libStaticLibDemo.a' 

作者創造的這個工作的例子,你可以得到它:https://github.com/diogot/StaticLibDemo


這裏是鏈接到後:Static Libs With Support to iOS 5 and Arm64

所有積分都來Diogo Tridapalli。

+0

謝謝你告訴我! @kleopatra – Yang 2013-12-11 18:46:24

+0

感謝信用@yang! – 2014-07-23 14:24:27