web-dev-qa-db-ja.com

Xcode 5への更新後-ld:アーキテクチャarmv7またはarmv7sリンカーエラーのシンボルが見つかりません

IPhone 4SソフトウェアをiOS 7 Beta 2に更新したばかりで、新しいアプリ(Phonegap)の最終調整を行っている最中です。

それが終わった後、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)

携帯電話で機能させるために、アーキテクチャを変更する必要があるアイデアはありますか? (エミュレータで正常に動作しています)

69
barney

短い答え:

  • すべての静的ライブラリのプロジェクトビルド設定からアクティブなアーキテクチャのみをビルド(ビルド設定パラメーターキーは 'ONLY_ACTIVE_Arch')を削除するか、以下のスクリーンショットのように 'NO'で上書きします。 Overwrite 'Build Active Architecture Only' to 'NO' or delete it's entry completely to fallback to iOS Default

詳細な回答:

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

おそらく、これらの変更が実際に何であるかを読み取ることなく、Xcodeに静的ライブラリプロジェクトのすべての推奨される変更を実行させたのでしょう。今まで、Xcodeの新しいバージョンに切り替えたとき、私は自分の話では、その情報ダイアログ(下のスクリーンショット)を詳しく見ることを気にしませんでした。 enter image description here

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

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

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

104
Tafkadasoh

プロジェクトがCordova 2.xおよびXcode 4.xを使用してビルドされていて、OPで言及されたエラーを受け取っている場合、このソリューションは私にとってはうまくいきました。 (Cordova 2.5とXcode 5でエラーが発生していました)。

https://issues.Apache.org/jira/browse/CB-3768

Cordovaプロジェクトに移動します

ルートフォルダー-> CordovaLib-> CordovaLib.xcodeprojを右クリック->パッケージの内容を表示-> project.pbxprojを開く

(4つあった)のすべての出現箇所を置換する

buildSettings = {
    ALWAYS_SEARCH_USER_PATHS = NO;//in 2 out of 4 occurrences
    "ARCHS[sdk=iphoneos*]" = armv7;
    "ARCHS[sdk=iphoneos6.*]" = (
        armv7,
        armv7s,
    );
        /* other settings here */
};

これで

buildSettings = {
    ALWAYS_SEARCH_USER_PATHS = NO;//in 2 out of 4 occurrences
    "ARCHS[sdk=iphoneos*]" = armv7;
    "ARCHS[sdk=iphoneos7.*]" = (
        armv7,
        armv7s,
    );
    "ARCHS[sdk=iphoneos6.*]" = (
        armv7,
        armv7s,
    );
    /* other settings here */
};

これで、プロジェクトが正常にビルドされます!

75
njtman

armv7sセクションからvalid architecturesを削除しましたが、うまくいきました。

ビルド設定->アーキテクチャ->有効なアーキテクチャ

Xcode Build Settings

13
Harikrishnan

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

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

enter image description here

11
Malloc

私のlib.aはarmv7専用であるため

私がしたことは

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

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

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

それが役に立てば幸い

4
ruzticgirlz

njtmanには正しい答えがありました。コメントする担当者がいないため、詳細を追加しています。

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

私のプロジェクトのデフォルトは(armv7)で、armv7sは含まれていません。

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

3
njfrost

ビルド設定で...

Strip Debug Symbols During  Copy: 

Debug: No

Release: No
0
Cam Tullos