1

デモ プロジェクトを使用して、オープン ソースの 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

  1. 静的ライブラリ プロジェクトを作成し、すべてを正しく実行しました
  2. デモ プロジェクトを作成し、ライブラリ プロジェクトをそこにドラッグして、自分のライブラリを "Target Dependencies" に含め、すべてを正しく実行しました
  3. Xcode はヘッダー ファイルを認識し、ライブ デバッガーはエラーを表示しません。
  4. ビルド時にundefined symbols for architectureclangエラーがポップアップする
  5. ビルドした libMyLibrary.a ファイルを調べたところ、シンボル定義がそこにあることがわかりました。
4

1 に答える 1