web-dev-qa-db-fra.com

Erreur de liaison lors de la construction d'une cible de test unitaire

J'ai un projet XCode4/iOS avec une cible régulière et une cible de test unitaire. Tout fonctionne bien, sauf lorsque j'essaie # d'importer une de mes classes dans ma classe de test et d'essayer de l'utiliser. Si j'essaie de créer la cible de test unitaire, j'obtiens l'erreur de lien suivante:

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

Dans CategoryTests.m, j'importe le fichier d'en-tête de cette façon:

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

Qu'est-ce que je fais mal?

52
cfischer

Assurez-vous que le fichier source FRRCategory a été ajouté à vos sources de compilation pour votre cible de test unitaire.

Xcode 4:

Navigateur du projet -> "[Nom du projet]" -> Sous Cibles, sélectionnez votre cible de test unitaire -> Phases de construction -> Développez les sources de compilation -> Cliquez sur + en bas des sources de compilation et ajoutez le fichier source correct.

22
Joe

Suivez les instructions ici . Il ne vous oblige pas à ajouter de fichiers pour compiler les sources.

J'ai d'abord manqué que "Symboles cachés par défaut = NON" devrait être pour votre cible d'application , pas la cible de test.

Cela a fonctionné pour moi de toute façon (tm).

165
Martin Wickman

Un autre problème que vous pouvez rencontrer est si votre test unitaire utilise des fonctions C (ou similaires) qui ne sont pas utilisées dans l'application réelle.

Cela peut se limiter à avoir un sous-projet. Dans mon cas

  • App
    • Sous-projet
      • Une bibliothèque C intégrée (c'est-à-dire des fichiers .c et .h compilés directement à l'intérieur)

Mon test unitaire a utilisé quelques-unes des fonctions C qui n'ont été utilisées nulle part ailleurs, et celles-ci ont été supprimées du binaire de l'application (PAS du fichier .a du sous-projet).

La solution consiste à

  1. désactiver "Dead Code Stripping" pour la version Debug de l'application. * et
  2. assurez-vous que vos tests unitaires utilisent Debug et non Release, dans les paramètres du schéma.

(* ne faites pas cela dans les configurations de version car cela gonflera l'application avec du code qui n'est jamais appelé).

7
Kalle

Vous ne devez vous référer à un dossier à l'intérieur de votre importation que si votre fichier se trouve dans un framework. Sinon, une fois que vous avez ajouté votre fichier au projet, faites simplement #import "FRRCategory.h". Eh bien, sauf si vous avez fait quelque chose de bizarre avec vos chemins de recherche d'en-tête.

1
Jano