13

環境: XCode 7.0.1 モジュール: Objective-C バンドル タイプ: フレームワーク

こんにちは、armv7、armv7s、arm64、i386、および x86_64 をサポートするフレームワークを作成しようとしています。ファット ライブラリを作成するために集計を使用しています。集約スクリプト内で、2 つの xcodebuild コマンドを実行しています。また、ターゲット ビルド設定で Enable Bitcode=YES と Other C Flags=-fembed-bitcode を設定しました。予防措置として、私は ENABLE_BITCODE=YES および OTHER_CFLAGS="-fembed-bitcode" オプションを xcodebuild コマンドに追加しています

私のxcodeビルドコマンドは次のとおりです-

#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}"

私が直面している問題は、リポが作成された後です。ビットコード対応アプリケーションで使用できません。を実行した後otool -l framework_binary | grep -LLVM、ビットコードが有効なフラグまたは __LLVM が表示されません。

Lipo は、ファット バイナリからビットコードを削除します。lipo コマンドの実行中にビットコードを保持する方法はありますか?

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

4

4 に答える 4

8

これは奇妙なことです。これを行うためのドキュメントはあまりありません。最後に次のコマンドを使用します。

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

BITCODE_GENERATION_MODE=bitcode フラグを xcodebuild コマンドに追加します

于 2016-03-29T22:36:23.370 に答える
1

ビルドの代わりに腕のスライスにアーカイブを使用してみてください

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と動作するはずです。

于 2016-06-22T20:14:51.013 に答える
0

Xcode 7.0.1 のバグのようです。同じ問題があり、Xcode をバージョン 7 にダウングレードすると修正されました。

更新: 実際には、7.0.1 で修正された Xcode 7 のバグである可能性があります。この SO の回答で問題が解決しました。

于 2015-10-18T06:19:25.107 に答える