2016-11-30 9 views
1

.dylibファイルから動的なiOSフレームワークを手動で構築しようとしています。バイナリはcmakeとxcodebuildで作成され、2つの.dylibファイル(1つはarmv7,armv7sおよびarm64、もう1つはx86_64およびi386のアーキテクチャを含む)を生成します。ライブラリは-fembed-bitcode parameterでコンパイルされ、すべて成功します。iOS .dylibをlipo breaksのフレームワークにマージするビットコード再コンパイル

MyFramework.framework/MyFramework 

ヘッダとInfo.plistを手動で生成され、に追加されます。

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

Frameworkは、その後にリポコマンドの出力をコピーして作成されます。

は.dylibファイルは、次のコマンドを使用してマージされます枠組み。

このフレームワークは、vendored_frameworkとしてアプリケーションにCocoaPods経由でインストールされます。 CocoaPodsは、App Storeの配布用に、どのバイナリからでもi386/x86_64ライブラリを削除することが知られています。

アプリケーションはApp Storeに正常にビルド、実行、アーカイブ、アップロードを行います。

しかし、ビットコードが有効なので、App Storeは.ipaを処理し、ビットコードで再コンパイルします。これが失敗し、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マッハ-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 

これは、私のコンパイラ/リンカの知識が範囲外になるところです。 質問:

ここで私は間違っていますか?たぶん、ビットコードを別の方法でコンパイルする必要がありますか?または、私はlipoを間違った方法で使用していますか?

ありがとうございました!

答えて

1

作成したfatバイナリのロードコマンドをotool -lコマンドで調べたところ、lipoを使用してもバイナリ内のLC_ID_DYLIBは変更されず、最初に提供されたライブラリのものが再利用されることがわかりました。 install_name_toolを使用してidを変更してフレームワークの1つ(iOSの動的フレームワークの場合は@rpathを含む)を修正し、エラーを修正します。

.frameworkディレクトリと共に、バイナリへのパス全体が含まれていることを確認してください。

関連する問題