Подтвердить что ты не робот

Ошибка связи при построении целевого объекта unit test

У меня есть проект XCode4/iOS с обычной целью и unit test. Все работает отлично, за исключением случаев, когда я пытаюсь #import один из моих классов в моем тестовом классе и пытаюсь использовать его. Если я попытаюсь создать цель unit test, я получаю следующую ошибку ссылки:

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"

Что я делаю неправильно?

4b9b3361

Ответ 1

Убедитесь, что исходный файл FRRCategory добавлен в ваши источники компиляции для вашей цели unit test.

Xcode 4:

Навигатор проекта → "[Название проекта]" → В разделе "Цели" выберите цель unit test → Фазы сборки → Развернуть источники компиляции → Нажмите + внизу источников компиляции и добавьте правильный исходный файл.

Ответ 2

Следуйте инструкциям здесь. Это не требует, чтобы вы добавляли файлы для компиляции источников.

Я сначала пропустил, что "Символы, скрытые по умолчанию = НЕТ" должны быть для вашей цели приложения, а не для проверки цели.

Он работал у меня в любом случае (tm).

Ответ 3

Еще одна проблема, которую вы можете нанести, - это если ваш unit test использует функции C (или похожие), которые не используются в реальном приложении.

Это может быть ограничено наличием подпроекта. В моем случае

  • App
    • подпроекта
      • Встроенная библиотека C (т.е. файлы c и .h, скомпилированные непосредственно внутри)

My unit test использовал несколько функций C, которые нигде не использовались, и они были удалены из двоичного файла приложения (НЕ из файла sub project.a).

Исправление составляет

  • отключите "Снятие мертвого кода" для приложения Debug build. * и
  • убедитесь, что ваши модульные тесты используют Debug, а не Release, в настройках схемы.

(* не делайте этого с конфигурациями релиза, так как он будет раздувать приложение с помощью кода, который никогда не вызывается).

Ответ 4

Вы должны ссылаться только на папку внутри вашего импорта, если ваш файл находится внутри рамки. В противном случае, как только вы добавили свой файл в проект, просто сделайте #import "FRRCategory.h". Ну, если вы не сделали что-то странное с помощью путей поиска заголовков.