ヘッダー ファイル (.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)
次の手順を実行して、ライブラリをターゲットに追加しました。
- 私のプロジェクトを右クリック
- 選択する
'Add Files to "My Project"'
- ポップアップ Finder ウィンドウから .a ファイルを見つけます。
- ライブラリ パスが my にあることを確認します
Target -> Build Settings -> Library Search Paths
(手順 3 を完了すると自動的に追加されます) 。 - ヘッダー ディレクトリを追加します。
Target -> Build Settings -> Header Search Paths
- ライブラリがリストされていることを確認します
Target -> Build Phases -> Link Binary With Libraries
ライブラリが, , &
armv7
経由でコンパイルされていることを確認します(ライブラリには も含まれていると聞きましたが、3 つのコマンドをいつ使用したかわかりませんでした)file
otool
lipo
armv6s
armv6
$ 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 Dependency
inとして追加できないことに注意してくださいBuild Settings
。できるはずですか? - ライブラリをターゲットに追加することもできません
Build Scheme
(XCode メニューの を使用Product -> Scheme -> Edit Scheme... -> Build -> +
) 。
- ライブラリを
iOS Deployment Target
in 経由で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
単独で使用し、ターゲットとターゲットの依存関係armv6
のValid Architecture
下で使用しますBuild Settings
Build Active Architecture Only
に設定Yes
- プロジェクト グループにライブラリを追加するか、親プロジェクト グループ レベルにライブラリを追加するかを切り替えました。
- プロジェクト コードにライブラリからのオブジェクトのインポートとインスタンス化を追加する
- ライブラリが選択されているときに XCode の右側のウィンドウの
Location
下Identity and Type
にあるライブラリのさまざまな設定で遊んだUtilities
- then
Build Phases -> Link Binary With Libraries
を介してライブラリをターゲットに追加します+
Add Other...
これらの投稿や他の投稿で推奨される手順を既に試しました (実際の手順があるのは、リストされている最後の 2 つだけです)。
すべてのファイルを .mm に変更しようとしたことはありませんが (このライブラリの以前のバージョンでは変更する必要はありませんでした)、すべてを変更すると破損する可能性があると思われる .m ファイルがたくさんあります...
どんな助けや成功も大歓迎です!この新しいバージョンのライブラリが問題を引き起こしている理由を理解するのに本当に苦労しています。