69

新しいアプリ (Phonegap) の最後の仕上げをしている最中に、iPhone 4S ソフトウェアを iOS 7 Beta 2 にアップデートしました。

それが終わった後、Xcode は私の iPhone を検出しなかったので、Xcode 5 ベータ版をインストールしました。いじくり回した後、ついに自分の電話を検出するようになりました。唯一の問題は、使用されているアーキテクチャにエラーがあることです。

生成されるエラーは次のとおりです。

ld: warning: ignoring file /Users/-----------/Library/Developer/Xcode/DerivedData/testtest-bmnbmujiosugcmgeiceofgcfmsec/Build/Products/Debug-iphoneos/libCordova.a, file was built for archive which is not the architecture being linked (armv7s): /Users/--------/Library/Developer/Xcode/DerivedData/testtest-bmnbmujiosugcmgeiceofgcfmsec/Build/Products/Debug-iphoneos/libCordova.a
Undefined symbols for architecture armv7s:
  "_OBJC_METACLASS_$_CDVCommandDelegateImpl", referenced from:
      _OBJC_METACLASS_$_MainCommandDelegate in MainViewController.o
  "_CDVLocalNotification", referenced from:
      -[AppDelegate application:didReceiveLocalNotification:] in AppDelegate.o
  "_OBJC_CLASS_$_CDVCommandDelegateImpl", referenced from:
      _OBJC_CLASS_$_MainCommandDelegate in MainViewController.o
  "_OBJC_CLASS_$_CDVCommandQueue", referenced from:
      _OBJC_CLASS_$_MainCommandQueue in MainViewController.o
  "_OBJC_METACLASS_$_CDVViewController", referenced from:
      _OBJC_METACLASS_$_MainViewController in MainViewController.o
  "_OBJC_METACLASS_$_CDVCommandQueue", referenced from:
      _OBJC_METACLASS_$_MainCommandQueue in MainViewController.o
  "_CDVPluginHandleOpenURLNotification", referenced from:
      -[AppDelegate application:handleOpenURL:] in AppDelegate.o
  "_OBJC_CLASS_$_CDVViewController", referenced from:
      _OBJC_CLASS_$_MainViewController in MainViewController.o
ld: symbol(s) not found for architecture armv7s
clang: error: linker command failed with exit code 1 (use -v to see invocation)

私の携帯電話で動作させるために、アーキテクチャをどのように変更する必要があるかについてのアイデアはありますか? (エミュレータ上では問題なく動作しています)

4

7 に答える 7

105

簡潔な答え:

  • Build Active Architecture Only (ビルド設定パラメーター キーは「ONLY_ACTIVE_ARCH」) をすべての静的ライブラリのプロジェクト ビルド設定から削除するか、以下のスクリーンショットのように「NO」で上書きします 。「Build Active Architecture Only」を「NO」に上書きするか、エントリを完全に削除して iOS デフォルトにフォールバックします。

詳細な回答:

問題は、メイン アプリでリンクしている静的ライブラリ 'libCordova.a' が 1 つのアーキテクチャ (armv7 ではなく armv7s) 用にのみコンパイルされていることです。

おそらく、実際の変更内容を読み取らずに、静的ライブラリ プロジェクトに対して推奨されるすべての変更を Xcode に実行させたことがあります。私自身について言えば、Xcode の新しいバージョンに切り替えたときに、その情報ダイアログ (下のスクリーンショット) を詳しく調べることを気にしたことはありませんでした - 今まで。 ここに画像の説明を入力

問題は、これらの変更を実行すると、 Build Active Architecture Only (ビルド設定パラメーター キーは「ONLY_ACTIVE_ARCH」)と呼ばれる新しい機能がデバッグ ビルド用にアクティブになることです。原則として、これは Xcode の非常に優れた拡張機能です。これを YES に設定すると、ビルド時間が短縮されます。Xcode は、実行ボタンを押したときに、現在上部で選択されている接続デバイスのアーキテクチャのみをコンパイルするためです。

ただし、静的ライブラリでこの新しいパラメーターをやみくもに受け入れると、このバグに遭遇する可能性があります。このバグは、armv7 デバイスを接続した状態でスタティック ライブラリのデバッグ バージョンをビルドし、メイン アプリケーションをデバッグしているときに armv7s デバイスを接続した場合 (またはその逆) に発生します。その後、上記のエラー (または同様のエラー) が表示されます。

したがって、静的ライブラリのすべてのプロジェクト ビルド設定から、 Build Active Architecture Onlyのプロジェクト レベルの値を完全に削除することをお勧めします。iOS のデフォルトを見てみると、NO です。もちろん、設定を「NO」に上書きして、将来デフォルト値が変更された場合でも設定が正しいことを確認することもできます (1 番目のスクリーンショットを参照)。

于 2013-06-26T18:24:29.297 に答える
11

私はXcode 5を使用しているのでiOS SDK 7です。私にとってうまくいった解決策は、単にarm64アーキテクチャを削除することでした。

プロジェクト ターゲット (CordovaLib.xcodeproj ではない) を選択し、[ビルド設定] > [有効なアーキテクチャ] で、arm64 がリストにある場合は削除します。これは、arm64 アーキテクチャを削除した後の私のものです。

ここに画像の説明を入力

于 2014-03-23T22:45:51.003 に答える
4

私のlib.aはarmv7専用なので

私がしたことは

アクティブなアーキテクチャのみ = はい

buildSettings = {
                ALWAYS_SEARCH_USER_PATHS = NO;
                "ARCHS[sdk=iphoneos*]" = (
                    armv7s,
                    armv7,
                );
                "ARCHS[sdk=iphoneos6.*]" = (
                    armv7s,
                    armv7,
                );
                "ARCHS[sdk=iphoneos7.*]" = (
                    armv7,
                    armv7s,
                );

それはビルドされ、正常にアーカイブされました

それが役に立てば幸い

于 2013-10-08T04:36:24.113 に答える
2

njtman が正解でした。コメントする担当者がいないので、詳細を追加します。

標準アーキテクチャ (armv7、armv7s) を使用するには、iOS 7 SDK が必要です。

私のプロジェクトは、armv7s を含まず、(armv7) にデフォルト設定されていました。

これを修正するには、CordovaLib.xcodeproj を開き、Build Settings (一番上の行のメニューの 1 つ、中央揃え) で、アーキテクチャ、アーキテクチャ、デバッグおよびリリースの下で、標準アーキテクチャを使用して iOS 7.0 を追加します。

于 2013-10-04T03:18:29.037 に答える
0

ビルド設定で...

Strip Debug Symbols During  Copy: 

Debug: No

Release: No
于 2013-10-09T06:25:52.523 に答える