51 votes

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

J'ai un projet XCode4 / iOS avec une cible standard et une cible de test unitaire. Tout fonctionne bien, sauf lorsque j'essaie # d'importer l'une de mes classes dans ma classe de test et d'essayer de l'utiliser. Si j'essaie de construire 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 la manière suivante:

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

Qu'est-ce que je fais mal?

165voto

Martin Wickman Points 9628

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

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

Cela a fonctionné pour moi quand même (tm).

22voto

Joe Points 37343

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

XCode 4:

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

7voto

Kalle Points 6804

Un autre piège que vous pouvez frapper, c'est si votre unité de test à l'aide de fonctions C (ou similaire) qui ne sont pas utilisés dans l'application.

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

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

Mon unité de test utilisé quelques unes des fonctions C qui n'ont pas été utilisés n'importe où ailleurs, et ces derniers ont été exclus de l'application binaire (PAS le sous-projet .un fichier).

La solution est d'

  1. désactiver le "Code Mort Stripping" pour l'application de Débogage de construire.* et
  2. assurez-vous que vos tests unitaires sont l'utilisation de Débogage et ne libère pas, dans les paramètres de jeu.

(* ne faites pas cela à la libération configs comme ça va gonfler l'application avec un code qui n'est jamais appelé).

1voto

Jano Points 37593

Vous ne devez faire référence à un dossier dans votre importation que si votre fichier est dans une structure. Sinon, une fois que vous avez ajouté votre fichier au projet, faites simplement #import "FRRCategory.h" . Eh bien, à moins que vous ne fassiez quelque chose de bizarre avec vos chemins de recherche d’en-têtes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X