1

ヘッダー ファイル (.m ファイルなし) もある静的ライブラリ (.a) を使用しようとしていますが、ライブラリをターゲットに追加すると (プロジェクト コードでライブラリを参照/インポートすることさえせずに)、Undefined symbols for architecture armv7コンパイル時にリンク エラーが発生します。リンカーは、ライブラリの最新バージョンには存在しないと思われるクラスについて不平を言っており、キャッシュされたデータを使用している可能性がありますか? この疑いは、空のプロジェクトを作成し、プロジェクトに追加したのとまったく同じ方法でライブラリを追加すると、新しいプロジェクトが問題なくコンパイルされるという発見によって裏付けられます。しかし、別の注意として、リンカーが不平を言っているクラス/ivarのファイルシステムをgrepすると、静的ライブラリファイルと私のファイルで一致が得られますxcuserdataワークスペース フォルダー。問題が自分のプロジェクトにあるのか、インポートしようとしているライブラリにあるのか、それともライブラリをプロジェクトに追加しようとしている方法にあるのか疑問に思っています。また、コードからライブラリをインポート/呼び出しさえしていないのに、リンカー エラーが発生するのはなぜですか? を使用してXCode 4.6.1います。

リンクエラーは次のとおりです。

Undefined symbols for architecture armv7:
"_OBJC_IVAR_$_GenericPopupView.delegateTheme", referenced from:
  -[MyListView setDelegateTheme:] in myLib.a(MyListView.o)
  -[MyListView tableView:cellForRowAtIndexPath:] in myLib.a(MyListView.o)
"_OBJC_CLASS_$_SampleMarkView", referenced from:
  objc-class-ref in myLib.a(MyListView.o)
"_OBJC_CLASS_$_CheckMarkView", referenced from:
  objc-class-ref in myLib.a(MyListView.o)
"_OBJC_METACLASS_$_GenericPopupView", referenced from:
  _OBJC_METACLASS_$_MyListView in myLib.a(MyListView.o)
"_OBJC_CLASS_$_GenericPopupView", referenced from:
  _OBJC_CLASS_$_MyListView in myLib.a(MyListView.o)
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

次の手順を実行して、ライブラリをターゲットに追加しました。

  1. 私のプロジェクトを右クリック
  2. 選択する'Add Files to "My Project"'
  3. ポップアップ Finder ウィンドウから .a ファイルを見つけます。
  4. ライブラリ パスが my にあることを確認しますTarget -> Build Settings -> Library Search Paths(手順 3 を完了すると自動的に追加されます) 。
  5. ヘッダー ディレクトリを追加します。Target -> Build Settings -> Header Search Paths
  6. ライブラリがリストされていることを確認しますTarget -> Build Phases -> Link Binary With Libraries
  7. ライブラリが, , &armv7経由でコンパイルされていることを確認します(ライブラリには も含まれていると聞きましたが、3 つのコマンドをいつ使用したかわかりませんでした)fileotoollipoarmv6sarmv6

    $ file myLib.a
    myLib.a: Mach-O universal binary with 2 architectures
    myLib.a (for architecture armv7):   current ar archive random library
    myLib.a (for architecture cputype (12) cpusubtype (11)): current ar archive random library
    
    $ otool -L myLib.a
    Archive : myLib.a (architecture cputype (12) cpusubtype (11))
    …
    
    $ lipo -info myLib.a
    Architectures in the fat file: myLib.a are: armv7 (cputype (12) cpusubtype (11)) 
    

成功せずに各コンパイル試行の間に試したことは次のとおりです。

  • (apple)+shift+k でプロジェクトをクリーンアップします
  • DerivedData(apple)+alt+shift+k でビルド ディレクトリ ( ) を消去します。
  • DerivedDataコマンドラインからすべてのディレクトリを削除します
  • ライブラリとそのヘッダーを削除してプロジェクトに再度追加する
  • ヘッダーなしでライブラリを追加します
  • 私のプロジェクトではなく、ターゲットの依存関係であるプロジェクトにライブラリを直接配置します
    • ライブラリをTarget Dependencyinとして追加できないことに注意してくださいBuild Settings。できるはずですか?
    • ライブラリをターゲットに追加することもできませんBuild Scheme(XCode メニューの を使用Product -> Scheme -> Edit Scheme... -> Build -> +) 。
  • iOS Deployment Targetin 経由でiOS の最小バージョンを確認しますBuild Settings。ターゲットとライブラリの両方が iOS 6.0 です。
  • 以下に示すように、新しいライブラリを使用せずにプロジェクトをビルドするために必要なものを除くすべてのターゲット検索パスを削除しました (最も重要なのDerivedDataは、リンカー パスから を削除したことです)。プロジェクト全体のビルド設定 (ターゲットのビルド設定ではない) に他の検索パスが含まれていない

    ヘッダー検索パス

    $(BUILT_PRODUCTS_DIR)/usr/local/include
    $(SRCROOT)/../MyLibDirectory/headers
    

    ライブラリ検索パス

    $(inherited)
    $(SRCROOT)/../TargetDependencyDirectory
    $(SRCROOT)/../openssl/lib
    $(SRCROOT)/../MyLibDirectory
    
  • 私のマシン上のライブラリの他のすべてのインスタンスを削除しました(古いバージョン)

  • ユーザー定義のビルド設定を設定するUSE_HEADERMAP = NO
  • 新しいプロジェクト チェックアウトを使用して新しくイメージ化されたマシンにインストールし、上記のすべての手順を繰り返します。
  • –ObjC++他のリンカー フラグに追加します (-ObjC既にリンカー フラグになっています)。
  • armv6s単独で使用し、ターゲットとターゲットの依存関係armv6Valid Architecture下で使用しますBuild Settings
  • Build Active Architecture Onlyに設定Yes
  • プロジェクト グループにライブラリを追加するか、親プロジェクト グループ レベルにライブラリを追加するかを切り替えました。
  • プロジェクト コードにライブラリからのオブジェクトのインポートとインスタンス化を追加する
  • ライブラリが選択されているときに XCode の右側のウィンドウのLocationIdentity and Typeにあるライブラリのさまざまな設定で遊んだUtilities
  • thenBuild Phases -> Link Binary With Librariesを介してライブラリをターゲットに追加します+Add Other...

これらの投稿や他の投稿で推奨される手順を既に試しました (実際の手順があるのは、リストされている最後の 2 つだけです)。

すべてのファイルを .mm に変更しようとしたことはありませんが (このライブラリの以前のバージョンでは変更する必要はありませんでした)、すべてを変更すると破損する可能性があると思われる .m ファイルがたくさんあります...

どんな助けや成功も大歓迎です!この新しいバージョンのライブラリが問題を引き起こしている理由を理解するのに本当に苦労しています。

4

1 に答える 1

0

私は自分の問題を解決しました。というか、問題は私が含めていたライブラリのブラック ボックスにありました。コマンド ラインから、ターミナル ウィンドウで次のコマンドを実行します。

grep SampleMarkView myLib.a

その結果:

Binary File:myLib.a matches

ライブラリの作成者と話をしたところ、問題を引き起こさなかった更新バージョンが送られてきました。コードに古い参照が含まれていたと思います。少なくとも、この記事が、ライブラリ参照の問題を抱えている場合に試してみるべきさまざまなことのリストを提供することを願っています!

于 2013-09-10T00:16:44.093 に答える