web-dev-qa-db-ja.com

ビットコードを有効にしてiOSライブラリをコンパイルする

ビットコードが有効になっているフレームワークをリリースする必要がありますが、これは面倒です。プロジェクトの設定で「ビットコードを有効にする」を「はい」に設定すると、実際のデバイスとシミュレーターの両方でクリーンにビルドされます。

ライブラリをテストしたかったので、この目的のために作成した新しいアプリにライブラリを統合しましたが、現在はシミュレーター用にのみビルドされています。実際のデバイス用にビルドしようとすると、次のようになります。

ld: '/path/to/Framework.framework/Company(File.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

私が言ったように、私はビットコードを有効にしてビルドしたので、なぜこれが起こるのかわかりません。

何か案は?ありがとう

10
Yotam

AFAIK、Xcodeを使用してアプリをビルドすると、アーカイブを作成するときにのみビットコードが含まれます。その理由は、アプリ/ライブラリをデバッグまたはテストするだけの場合にコンパイル時間を短縮することです。

Xcodeが各ビルドでビットコードを発行するようにするには、-fembed-bitcodeフラグをOther C flagsおよびOther linker flagsに追加します。

enter image description here

enter image description here

また、バイナリにビットコードが含まれているかどうかを確認する最も簡単な方法は、otoolgrepを使用することです。

otool -l binary_name | grep __LLVM

ビットコードがある場合は1つ以上のsegname __LLVMエントリが表示され、ない場合は空の出力が表示されます。

21
AlexDenisov

Xcodebuildコマンドを使用してビットコードを有効にするには、追加する必要があります

BITCODE_GENERATION_MODE=bitcode.

以下のコマンドを見つけてください

xcodebuild BITCODE_GENERATION_MODE=bitcode -target TARGETNAME ONLY_ACTIVE_Arch=NO -configuration Release -sdk iphoneos  BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"
1
SnehaK

RunScriptコードを使用した別の方法:(ビルド設定-ビルドフェーズRunScript) enter image description here

# define output folder environment variable
UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal

# Step 1. Build Device and Simulator versions
xcodebuild -target TARGETNAME ONLY_ACTIVE_Arch=NO -configuration Release -sdk iphoneos  BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"
xcodebuild -target TARGETNAME -configuration Release -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"

# make sure the output directory exists
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"

# Step 2. Create universal binary file using lipo
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/lib${PROJECT_NAME}.a" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/lib${PROJECT_NAME}.a" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/lib${PROJECT_NAME}.a"

# Last touch. copy the header files. Just for convenience
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/include" "${UNIVERSAL_OUTPUTFOLDER}/"
0
shujucn