Error de enlace al crear un objetivo de prueba unitaria


Tengo un proyecto XCode4 / iOS con un objetivo regular y un objetivo de prueba unitaria. Todo funciona bien, excepto cuando intento #importar una de mis clases en mi clase de prueba y tratar de usarla. Si intento construir el objetivo de prueba unitaria, obtengo el siguiente error de enlace:

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

En las pruebas de categorías.m Estoy importando el archivo de cabecera de esta manera:

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

¿Qué estoy haciendo mal?

Author: cfischer, 2011-04-26

4 answers

Asegúrese de que el archivo fuente FRRCategory ha sido agregado a sus fuentes de compilación para su destino de prueba unitaria.

Xcode 4:

Project Navigator -> "[Nombre del proyecto]" -> En Targets seleccione su destino de prueba de unidad -> Fases de compilación -> Expanda Compile Sources -> Haga clic en + en la parte inferior de Compile sources y agregue el archivo fuente correcto.

 22
Author: Joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-14 17:11:31

Siga las instrucciones aquí. No requiere que agregue ningún archivo para compilar las fuentes.

Primero me perdí que "Símbolos ocultos por defecto=NO" debería ser para su destino app, no objetivo de prueba.

Funcionó para mí de todos modos (tm).

 164
Author: Martin Wickman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-08 12:39:02

Otro gotcha que puede golpear es si su prueba unitaria está utilizando funciones C (o similares) que no se utilizan en la aplicación real.

Esto puede limitarse a tener un subproyecto. En mi caso

  • Aplicación
    • Subproyecto
      • Una biblioteca de C incrustada (es decir .c y .h archivos compilados directamente dentro)

Mi prueba unitaria usó algunas de las funciones de C que no se usaron en ningún otro lugar, y estas se eliminaron del binario de la aplicación (NO del subproyecto .archivo).

La solución es

  1. desactiva "Dead Code Stripping" para la compilación de depuración de la aplicación.* y
  2. asegúrese de que sus pruebas unitarias están utilizando Debug y no Release, en la configuración de Scheme.

(* no haga esto con las configuraciones de lanzamiento, ya que llenará la aplicación con código que nunca se llama).

 7
Author: Kalle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-29 20:18:51

Solo debe referirse a una carpeta dentro de su importación si su archivo está dentro de un marco. De lo contrario, una vez que haya agregado su archivo al proyecto, simplemente haga #import "FRRCategory.h". Bueno, a menos que hayas hecho algo raro con tus Rutas de Búsqueda de Cabecera.

 1
Author: Jano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-25 22:13:02