2016-11-30 249 views
1

我試圖從.dylib文件手動構建一個動態iOS框架。使用cmake和xcodebuild創建二進制文件,並生成兩個.dylib文件,一個文件包含armv7,armv7sarm64,另一個x86_64i386體系結構。庫編譯爲-fembed-bitcode parameter,一切都成功了。將iOS .dylib合併到lipo中重新編碼bitcode

MyFramework.framework/MyFramework 

頁眉和Info.plist是手動生成的,並添加到:

lipo -create lib_arm.dylib lib_i386.dylib -output MyFramework 

框架然後,通過從脂命令的輸出複製到創建的:

名爲.dylib文件然後與下一個命令合併該框架。

然後通過CocoaPods將該框架作爲vendored_framework安裝到應用程序中。據瞭解,CocoaPods將從任何胖二進制文件中剝離i386/x86_64庫,用於App Store分發。

應用程序構建,運行,歸檔併成功上傳到App Store。

但是,由於啓用了Bitcode,App Store將處理.ipa文件,並用bitcode進行重新編譯,這就是它失敗的地方,我收到來自App Store的電子郵件,它處理失敗。按照說明,我可以通過導出Ad-Hoc Distribution並重新編譯位碼來在本地重現錯誤。我收到的錯誤是這樣的:

ipatool failed with an exception: #<Errno::ENOENT: No such file or directory - /lib_arm.dylib>\n 

重新編譯時那麼明顯,但仍然是lib_arm.dylib參考或地方,即使它被合併成脂肪的一dylib的Mach-O通用二進制(合併後的file輸出dylib二進制):

>> file MyFramework 
MyFramework: Mach-O universal binary with 5 architectures: [x86_64: Mach-O 64-bit dynamically linked shared library x86_64] [i386] [arm_v7] [arm_v7s] [arm64] 
MyFramework (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64 
MyFramework (for architecture i386): Mach-O dynamically linked shared library i386 
MyFramework (for architecture armv7): Mach-O dynamically linked shared library arm_v7 
MyFramework (for architecture armv7s): Mach-O dynamically linked shared library arm_v7s 
MyFramework (for architecture arm64): Mach-O 64-bit dynamically linked shared library arm64 

這是我的編譯器/鏈接器知識超出範圍的地方。 所以我的問題是:

我在哪裏出錯了?也許bitcode應該以不同的方式編譯?或者,也許我錯誤地使用了lipo

謝謝!

回答

1

檢查所創建的脂肪二進制的裝載命令與otool -l命令後,我意識到,使用lipo本身不發生變化的二進制LC_ID_DYLIB,它會重複使用一個從所述第一提供庫。使用install_name_tool更改id以更正其中一個框架(包括適用於iOS動態框架的@rpath)可修復該錯誤。

install_name_tool -id @rpath/MyFramework.framework/MyFramework MyFramework 

請確保包含二進制文件的整個路徑以及.framework目錄。