簡體   English   中英

我如何為armv6,armv7和i386編譯靜態庫(fat)

[英]How do i compile a static library (fat) for armv6, armv7 and i386

我知道這個問題已多次提出,但我的目標與我在網上搜索的內容略有不同。 具體來說,我已經能夠為iPhone構建一個靜態庫,但我能夠構建的最終胖文件只包含arm和i386架構(我不確定arm指的是:是v6還是v7?)。 我無法專門為armv6和armv7編譯,他們使用lipo合並兩個架構。 lipo工具抱怨armv6和armv7庫中存在相同的架構(arm,而不是armv6或armv7)。

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

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

這是我發現的一個很好的解決方案: 支持iOS 5和Arm64的靜態Libs

編輯:

解決方案是構建不同的體系結構,然后使用lipo使用命令行(或Rakefile)綁定它們。

首先使用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不是有效的拱形”。 要避免這種情況,只需添加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


以下是帖子的鏈接: 支持iOS 5和Arm64的靜態Libs

所有學分都歸Diogo Tridapalli所有。

只需使用libtool將兩個arm6和arm7版本鏈接在一起 - 這就是XCode的功能。 但是,如果您嘗試將這些靜態庫組合到新的超級庫中,則會遇到問題。 如果您需要這樣做,請閱讀此內容

如果你已經這樣做了,那就是為什么lipo抱怨你的“armv6”庫同時包含armv6和armv7。 我的帖子有一個修復程序可能會更容易,因為你不使用XCode,但基本上你使用lipo -extract確保你有一個瘦armv6庫和瘦armv7庫,然后再繼續。

確保將構建設置設置為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 

似乎沒有必要在重新加入之前從胖庫中提取(如jamie的答案中所述)。 我正在使用來自apple的最終4.0 SDK,它似乎默認創建了胖armv6 / armv7庫。

我之前為輸入庫指定了體系結構,如下所示:

$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現在必須能夠檢測胖庫中的架構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM