1

ファイルから動的 iOS フレームワークを手動で構築しようとしてい.dylibます。バイナリは cmake と xcodebuild で作成され、2 つの.dylibファイル (1 つはとを含みarmv7、もう1 つはとアーキテクチャ) を生成します。ライブラリはコンパイルされ、すべてが成功します。armv7sarm64x86_64i386-fembed-bitcode parameter

.dylib ファイルは、次のコマンドでマージされます。

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

次に、lipo コマンドからの出力を次の場所にコピーして、フレームワークを作成します。

MyFramework.framework/MyFramework

ヘッダーとヘッダーInfo.plistは手動で生成され、フレームワークに追加されます。

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

アプリケーションのビルド、実行、アーカイブ、および App Store へのアップロードが正常に行われます。

ただし、ビットコードが有効になっているため、App Store は .ipa を処理し、ビットコードで再コンパイルします。ここで失敗し、App Store から処理に失敗したというメールを受け取ります。指示に従って、アドホック配布用にエクスポートし、ビットコード用に再コンパイルして、ローカルでエラーを再現できます。私が受け取るエラーはこれです:

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

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

これのどこが間違っているのですか?多分ビットコードは別の方法でコンパイルする必要がありますか? それともlipo、間違った方法で使用していますか?

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

4

1 に答える 1

3

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

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

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

于 2016-12-07T18:10:13.560 に答える