2015-10-13 7 views
8

環境:XCodeの7.0.1 モジュール:Objective-Cの バンドルタイプ:フレームワークビットコードオプションを使用して太いフレームワークを作成するにはどうすればよいですか?

こんにちは、私はi386とx86_64版のARMv7、armv7s、arm64をサポートするフレームワークを作成しようとしています。私は太いライブラリを作るために集合体を使用しています。集約スクリプトの中で、私は2つのxcodebuildコマンドを実行しています。1. armv7、armv7s、arm64、および2. i386とx86_64アーキテクチャ用。また、ターゲットビルドの設定でEnable Bitcode = YESと他のCフラグ= -fembed-bitcodeを設定しました。予防mesasureとして、私は追加していENABLE_BITCODE = YESとOTHER_CFLAGS =「 - fembed-ビットコード」

私のXcodeはコマンド構築xcodebuildコマンドのオプションあり、次のように -

#Build The framework Target for iPhoneOS 
xcodebuild -project "${PROJECT_FILE_PATH}" -target "${AN_TARGET}" 
ONLY_ACTIVE_ARCH=NO -configuration "${CONFIGURATION}" -sdk iphoneos 
BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}" 
CONFIGURATION_BUILD_DIR="${IPHONE_DEVICE_BUILD_DIR}" SYMROOT="${SYMROOT}" 
ARCHS="armv7 armv7s arm64" ENABLE_BITCODE=YES OTHER_CFLAGS="-fembed-bitcode" $ACTION 

#Build The framework Target for iPhoneSimulator 
xcodebuild -project "${PROJECT_FILE_PATH}" -target "${AN_TARGET}" 
ONLY_ACTIVE_ARCH=NO -configuration "${CONFIGURATION}" -sdk iphonesimulator 
BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}" 
CONFIGURATION_BUILD_DIR="${IPHONE_SIMULATOR_BUILD_DIR}" SYMROOT="${SYMROOT}" 
ARCHS="i386 x86_64" ENABLE_BITCODE=YES OTHER_CFLAGS="-fembed-bitcode" $ACTION 

を上記の2つのコマンドを実行した後、私はこれらの2つが結合していますがリポが作成された後

# create a fat Framework 
lipo -create 
"${IPHONE_DEVICE_BUILD_DIR}/${PROJECT_NAME}.framework/${PROJECT_NAME}" 
"${IPHONE_SIMULATOR_BUILD_DIR}/${PROJECT_NAME}.framework/${PROJECT_NAME}" - 
output "${FRAMEWORK_FOLDER}/${AN_END_USER_FRAMEWORK_NAME}" 

問題IAM向いている以下のコマンドを使用して、脂肪のフレームワークバイナリを作るために構築し、私はビットコード対応アプリケーションでそれを使用することができません。 otool -l framework_binary | grep -LLVMを実行した後、ビットコードを有効にしたフラグや__LLVMが表示されません。

Lipoは、脂肪のバイナリからビットコードを削除します。 lipoコマンドを実行しているときにビットコードを保持できる方法はありますか?

修正:Nestorからの返信に基づいて、私はotool -l -arch armv7 framework_binary | grep LLVMというotoolコマンドを実行しました。驚いたことに、segname __LLVM clangを見ることができました。しかし、私は同じ脂肪のフレームワークのバイナリをプロジェクトに統合すると、シミュレータ上で正常に構築されますが、デバイス上で実行されている間に次のエラーがスローされます - ld: 'MyBinary'にビットコードが含まれていません。ビットコードを有効にして(Xcode設定ENABLE_BITCODE)再構築するか、ベンダから更新されたライブラリを入手するか、このターゲットのビットコードを無効にする必要があります。アーキテクチャのためのarmv7

+1

「grep -LLVM」ではなく「grep LLVM」でなければなりませんか? – l00phole

+0

ここで同じ問題があります。 * .aにはlipoの前にビットコードが含まれますが、後には含まれません。 – Nestor

+0

iphoneosのバイナリ(つまりlipoで統合される前のデバイス)がビットコードを持っているかどうか確認しましたか?それがなければ、ビットコードセクションを削除するのはlipoではありません。 –

答えて

5

幸いにもそれはちょうどotoolの報告の問題です。lipoではありません。あなたは-archパラメータを追加する必要があります。

otool -arch arm64 -l myLipoOutput.a 

出典:http://www.openradar.me/radar?id=6301306440384512

+0

それを試してみました。残念ながら、fatバイナリにはビットコードフラグが含まれていないようです。私はそれをシミュレータ上で実行するとき、それはうまく構築されますが、アプリケーションターゲットビルドの設定の下でEnable Bitcode = YESでデバイス用にビルドすると、エラーコードld: 'myBinary'にビットコードが含まれません。ビットコードを有効にして(Xcode設定ENABLE_BITCODE)再構築するか、ベンダから更新されたライブラリを入手するか、このターゲットのビットコードを無効にする必要があります。 –

+0

申し訳ありません。あなたはそれが脂肪を取り除いていると確信していますか? – Nestor

+0

私は、問題はここでは少し異なると思います。 -arch armv7でコマンドotoolを実行し、armv7sでarm64を取得すると、segname __LLVMが表示されますが、ビットコードのバイナリを持つデバイス用のアプリケーションをビルドすると、次のエラーが発生します。 'MyBinary'にビットコードが含まれていません。ビットコードを有効にして(Xcode設定ENABLE_BITCODE)再構築するか、ベンダから更新されたライブラリを入手するか、このターゲットのビットコードを無効にする必要があります。アーキテクチャarmv7 –

0

それは、Xcodeの7.0.1のバグのように見えます。私は同じ問題を抱えていて、Xcodeをバージョン7にダウングレードしてそれを修正しました。

更新: 実際には7.0.1で修正されましたXcodeの7のバグかもしれ - this SO answer私のために問題を解決しました。

+0

ありがとう@silyevsk、それを試してみましょう。 –

+0

@DeepakBadiger - http://stackoverflow.com/a/31346742/390928のように見えます。 – silyevsk

+0

Thanks @silyevsk。既に成功していないURLをたどっています。また、アーカイブ/プロダクションビルド専用のビットコードを作成すると言われているように、$ Actionを使って動作させる必要があるのは何ですか? –

6

これは奇妙なもので、これを行うために多くのドキュメントは最後に、私は、このコマンドを使用し、そこではありません。

xcodebuild -project ${PROJECT_NAME}.xcodeproj -target ${FRAMEWORK_NAME} ONLY_ACTIVE_ARCH=NO BITCODE_GENERATION_MODE=bitcode FRAMEWORK_SEARCH_PATHS="${FRAMEWORK_SEARCH_PARTH} ${SRCROOT}/**" -sdk ${SIMULATOR_SDK} -configuration ${CONFIGURATION} clean build CONFIGURATION_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-${SIMULATOR_SDK} 2>&1 

xcodebuild -project ${PROJECT_NAME}.xcodeproj -target ${FRAMEWORK_NAME} -sdk ${DEVICE_SDK} ONLY_ACTIVE_ARCH=NO BITCODE_GENERATION_MODE=bitcode FRAMEWORK_SEARCH_PATHS="${FRAMEWORK_SEARCH_PARTH} ${SRCROOT}/**" -configuration ${CONFIGURATION} clean build CONFIGURATION_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-${DEVICE_SDK} 2>&1 

使用してみてくださいxcodebuildコマンドに

+0

これについての詳細:http://stackoverflow.com/questions/34959767/whats-the-difference-between-fembed-bitcode-and-bitcode-generation-mode –

+1

これはどのようにして「lipo」問題を解決しますか? 'lipo'はマージ時に任意のビットコードを取り除きます。 –

+1

終わりに、私はこの問題を解決する現在のコマンドを使用して:クリーンビルド xcodebuild -project $ {} PROJECT_NAME .xcodeproj ONLY_ACTIVE_ARCH = NO ENABLE_BITCODE = YES BITCODE_GENERATION_MODE =ビットコード-sdk $ {} SIMULATOR_SDK -configuration $ {}の設定をCONFIGURATION_BUILD_DIR = $ {BUILD_DIR}/$ {CONFIGURATION} - $ {SIMULATOR_SDK} 2>&1 xcodebuild -project $ {PROJECT_NAME} .xcodeproj -sdk $ {DEVICE_SDK} ONLY_ACTIVE_ARCH = NO ENABLE_BITCODE = YES BITCODE_GENERATION_MODE =ビットコード立体配置$ {CONFIGURATION}クリーンビルドCONFIGURATION_BUILD_DIR = $ {BUILD_DIR}/$ {CONFIGURATION} - $ {DEVICE_SDK} 2>&1 –

1

をBITCODE_GENERATION_MODE =ビットコードフラグを追加します。

xcodebuild -scheme "${SCHEME}" -workspace "${WORKSPACE}" -configuration "${CONFIGURATION}" -sdk iphoneos ARCHS="arm64 armv7 armv7s" CONFIGURATION_BUILD_DIR="${CONFIGURATION_BUILD_DIR}/arm" CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO ONLY_ACTIVE_ARCH=NO archive 

その後、シミュレータとアームをマージするためにlipoを実行します。

その後、otool -arch arm64 -l myLipoOutput.aを実行するとうまくいくはずです。

関連する問題