数日前、私はstatic-library(Universal)を作成し、_Xcode5.0 SDK7
_でうまく機能します。 _Xcode5.1
_で_SDK7.1
_を更新した後、シミュレータiPhone Retina(4-inch 64-bit)
を選択すると機能しません。次に、Bellowの設定を変更してlibを更新します。
私は3つのターゲットに対して同じことをします:-
スポーツシミュレータとデバイスの両方で、ユニバーサルライブラリを配置し、これにスクリプトを実行します。
この後、私は再度ビルドし、プロジェクトの前に行ったように使用します。しかし、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
_
たくさんのことの後、私は解決策を得ました。一部のxcodeは自動表示Standard architectures (including 64-bit) (armv7,armv7s,arm64)
があることを知りませんが、私の場合はStatic Library Projectにオプションがありません。だから私はこれを手動で追加します:-
このオプションを選択します:-
この後、静的ライブラリを再構築し、プロジェクトで使用して、現在は正常に機能しています。そして私はまた、出力が別のものになるターミナルにlipコマンドでチェックしました:-
testingLibImport/libLibNSlog.a are:armv7 armv7s i386 x86_64 arm64
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}/"
私も昨日同じ問題に出くわし、グーグルでいろいろな解決策を試した後、私は諦めて自分で試しました。提供されたさまざまなソリューションから理解できたのは、「lipo -info library.a」を実行したときに、x86_64アーキテクチャ用にビルドされていないということだけでした。そのため、集計アプローチをあきらめて、簡単な試みを行いました。
lipoコマンド:lipo -create -output newlibraryname.a Simulatorlibraryname.a devicelibraryname.a
新しく作成されたユニバーサルスタティックライブラリを統合して動作しました!!!
別の解決策を投稿しすぎてすみません。ユニバーサルライブラリをビルドする必要があるたびに、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を使用して確認できます。
これが私のような他の多くの人のための時間を節約することを願っています!!!