デモ プロジェクトを使用して、オープン ソースの iOS 静的ライブラリを開発しています。「ライブラリ」xcodeprojを作成し、クラスを作成しDKNavigationBar
、含める必要のある場所に含めました。次に、「デモ」xcodeproj を作成し、「ライブラリ」xcodeproj をその中にドラッグしました。「ターゲットの依存関係」セクションに静的ライブラリを含め、 を使用してライブラリを pch ファイルにインポートしました#import <MyLibrary/MyLibrary.h>
。デモ プロジェクトをビルドしましたが、エラーはまったくありませんでした。それから、私DKDAppDelegate.m
が呼んだ[DKNavigationBar class]
- LLDB は私にエラーを与えませんでした。次に、プロジェクトとブームを構築しました。
Undefined symbols for architecture i386:
"_OBJC_CLASS_$_DKNavigationBar", referenced from:
objc-class-ref in DKDAppDelegate.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
一見すると、これは通常の間違いのように思えます。「ああ、ソース ファイルを 'ソースのコンパイル' ビルド フェーズに追加するのを忘れていました」。しかし、深く掘り下げると、すべてが正しく設定されていることに気付きました。いくつかの調査の後、シンボル定義がファイルに存在し.a
、静的ライブラリがアーキテクチャ用に構築されていることに気付きました。
$ cd /path/to/derived/data/product/folder
$ lipo -info libMyLibrary.a
input file libMyLibrary.a is not a fat file
Non-fat file: libMyLibrary.a is architecture: i386
$ otool -MVv libMyLibrary.a
Archive : libMyLibrary.a
libMyLibrary.a(DKNavigationBar.o):
Module table (0 entries)
$ nm libMyLibrary.a
libMyLibrary.a(DKNavigationBar.o):
00000074 S _OBJC_CLASS_$_DKNavigationBar
U _OBJC_CLASS_$_UINavigationBar
00000060 S _OBJC_METACLASS_$_DKNavigationBar
U _OBJC_METACLASS_$_NSObject
U _OBJC_METACLASS_$_UINavigationBar
U __objc_empty_cache
U __objc_empty_vtable
00000038 s l_OBJC_CLASS_RO_$_DKNavigationBar
00000010 s l_OBJC_METACLASS_RO_$_DKNavigationBar
今、何が問題なのかわかりません。どんな助けでも大歓迎です。
TL;DR
- 静的ライブラリ プロジェクトを作成し、すべてを正しく実行しました
- デモ プロジェクトを作成し、ライブラリ プロジェクトをそこにドラッグして、自分のライブラリを "Target Dependencies" に含め、すべてを正しく実行しました
- Xcode はヘッダー ファイルを認識し、ライブ デバッガーはエラーを表示しません。
- ビルド時に
undefined symbols for architecture
clangエラーがポップアップする - ビルドした libMyLibrary.a ファイルを調べたところ、シンボル定義がそこにあることがわかりました。