Ошибка связи при построении целевого объекта 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"
Что я делаю неправильно?
Ответы
Ответ 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"
. Ну, если вы не сделали что-то странное с помощью путей поиска заголовков.