web-dev-qa-db-ja.com

arm64ビルドをサポートするために静的ライブラリアーキテクチャを更新するにはどうすればよいですか?

数日前、私はstatic-library(Universal)を作成し、_Xcode5.0 SDK7_でうまく機能します。 _Xcode5.1_で_SDK7.1_を更新した後、シミュレータiPhone Retina(4-inch 64-bit)を選択すると機能しません。次に、Bellowの設定を変更してlibを更新します。

enter image description here

私は3つのターゲットに対して同じことをします:-

enter image description here

スポーツシミュレータとデバイスの両方で、ユニバーサルライブラリを配置し、これにスクリプトを実行します。 enter image description here

この後、私は再度ビルドし、プロジェクトの前に行ったように使用します。しかし、iPhone Retina(4-inch 64-bit) _Undefined symbols for architecture x86_64:_でも同じ問題が発生します


だから、私の質問は、libを arm64 に更新するために必要な追加の変更があるか、または上記の手順で何か間違いを犯したかです。私が間違っている場合は、私に電流を流してください。

_64Bit architecture_をサポートするために静的ライブラリを更新するために必要な変更

注:

自分で作成したライブラリの更新をお願いしています。サードパーティのライブラリを使用していません。 更新

この_lipo -info testingLibImport/libLibNSlog.a_コマンドをターミナルで使用すると、出力は次のようになります。

_Architectures in the fat file: testingLibImport/libLibNSlog.a are: armv7 armv7s i386 arm64 
_
19
Nitin Gohel

たくさんのことの後、私は解決策を得ました。一部のxcodeは自動表示Standard architectures (including 64-bit) (armv7,armv7s,arm64)があることを知りませんが、私の場合はStatic Library Projectにオプションがありません。だから私はこれを手動で追加します:-

enter image description here

このオプションを選択します:-

enter image description here

この後、静的ライブラリを再構築し、プロジェクトで使用して、現在は正常に機能しています。そして私はまた、出力が別のものになるターミナルにlipコマンドでチェックしました:-

testingLibImport/libLibNSlog.a are:armv7 armv7s i386 x86_64 arm64

9
Nitin Gohel

XCode 6.4で見つけた別の解決策は、ONLY_ACTIVE_Arch = NOを追加し、アーキテクチャを指定しないことです。そう

xcodebuild -target TargetName ONLY_ACTIVE_Arch=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"

ライブラリにi386およびx86_64アーキテクチャを構築します。


これが、すべてのアーキテクチャを構築するための完全なユニバーサルlib実行スクリプトです。

# 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 ${CONFIGURATION} -sdk iphoneos  BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"
xcodebuild -target TargetName ONLY_ACTIVE_Arch=NO -configuration ${CONFIGURATION} -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}/"
14
dwxw

私も昨日同じ問題に出くわし、グーグルでいろいろな解決策を試した後、私は諦めて自分で試しました。提供されたさまざまなソリューションから理解できたのは、「lipo -info library.a」を実行したときに、x86_64アーキテクチャ用にビルドされていないということだけでした。そのため、集計アプローチをあきらめて、簡単な試みを行いました。

  1. この投稿でアドバイスされているように、armv7、armv7s、およびarm64をアーキテクチャに追加しました。
  2. iphoneシミュレーター(32ビット)で静的ライブラリプロジェクトをビルドする
  3. iphoneシミュレーター(64ビット)で静的ライブラリプロジェクトをビルドする
  4. iOSデバイスで静的ライブラリプロジェクトをビルドする
  5. ビルドパスに移動(派生データの下)
  6. シミュレータとデバイスの両方の出力を共通フォルダにコピーしました
  7. 端末ウィンドウでlipoコマンドを使用してユニバーサルライブラリを作成しました

lipoコマンド:lipo -create -output newlibraryname.a Simulatorlibraryname.a devicelibraryname.a

新しく作成されたユニバーサルスタティックライブラリを統合して動作しました!!!

10
Deepak Badiger

別の解決策を投稿しすぎてすみません。ユニバーサルライブラリをビルドする必要があるたびに、lipoコマンドを使用してユニバーサルライブラリを作成する手作業から私を救うソリューションを見つけようとしたときに、ずっと前にこのソリューションを見つけました。

だから、ここに別のアプローチがあります、総称アプローチを使用してユニバーサルライブラリを構築する人のためです

シミュレーターがユニバーサルライブラリを構築するための集約スクリプトで、下記のように1つの小さな変更を加えるだけです-

xcodebuild -target ProductName -configuration $ {CONFIGURATION} -sdk iphonesimulator ARCHS = "i386 x86_64" BUILD_DIR = "$ {BUILD_DIR } "BUILD_ROOT =" $ {BUILD_ROOT} "SYMROOT =" $ {SYMROOT} "

単一のアーキテクチャアプローチを使用する代わりに、複数のアーキテクチャを含めることを確認してください-

xcodebuild -target ProductName -configuration $ {CONFIGURATION} -sdk iphonesimulator -Arch i386 BUILD_DIR = "$ {BUILD_DIR}" BUILD_ROOT = "$ {BUILD_ROOT}" SYMROOT = "$ {SYMROOT}"

ただARCHS = "i386 x86_64"が魔法をかけてくれます。

これは、次の脂肪コマンドlipo -info newLibraryName.aを使用して確認できます。

これが私のような他の多くの人のための時間を節約することを願っています!!!

4
Deepak Badiger