web-dev-qa-db-ja.com

単体テストターゲットの構築中のリンクエラー

通常のターゲットと単体テストのターゲットを持つXCode4/iOSプロジェクトがあります。テストクラスでクラスの1つを#importして使用しようとする場合を除き、すべて正常に機能します。単体テストターゲットをビルドしようとすると、次のリンクエラーが発生します。

Undefined symbols for architecture i386:
  "_OBJC_CLASS_$_FRRCategory", referenced from:
      objc-class-ref in CategoryTests.o
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status

CategoryTests.mでは、この方法でヘッダーファイルをインポートしています。

#import "../todoro/FRRCategory.h"

私は何を間違えていますか?

52
cfischer

FRRCategoryソースファイルが、単体テストターゲットのコンパイルソースに追加されていることを確認してください。

Xcode 4:

Project Navigator-> "[プロジェクト名]"->ターゲットでユニットテストターゲットを選択->ビルドフェーズ->コンパイルソースを展開->コンパイルソースの下部にある+をクリックし、正しいソースファイルを追加します。

22
Joe

指示に従ってください こちら 。ソースをコンパイルするためにファイルを追加する必要はありません。

「デフォルトで隠されたシンボル= NO」は、テストターゲットではなく、あなたのappターゲット用であるべきだということを最初に見逃しました。

とにかくうまくいきました(tm)。

165
Martin Wickman

ヒットする可能性がある別の落とし穴は、単体テストで実際のアプリでは使用されていないC関数(または同様の関数)を使用している場合です。

これは、サブプロジェクトを持つことに制限される場合があります。私の場合

  • アプリ
    • サブプロジェクト
      • 埋め込まれたCライブラリ(つまり、内部で直接コンパイルされた.cおよび.hファイル)

私の単体テストでは、他のどこでも使用されていないC関数をいくつか使用しましたが、これらはアプリバイナリから削除されました(サブプロジェクトの.aファイルからではありません)。

修正は

  1. アプリのデバッグビルドの「Dead Code Stripping」をオフにします。*
  2. スキーム設定で、単体テストがリリースではなくデバッグを使用していることを確認してください。

(*決して呼び出されないコードでアプリを膨張させるので、リリース構成にはこれを行わないでください)。

7
Kalle

ファイルがフレームワーク内にある場合のみ、インポート内のフォルダーを参照する必要があります。それ以外の場合、ファイルをプロジェクトに追加したら、#import "FRRCategory.h"。まあ、ヘッダー検索パスで何か変なことをしたのでなければ。

1
Jano