Ошибка связи при создании цели модульного теста - PullRequest
52 голосов
/ 26 апреля 2011

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

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"

Что я делаю не так?

Ответы [ 4 ]

165 голосов
/ 08 июля 2011

Следуйте инструкциям здесь .Вам не нужно добавлять какие-либо файлы для компиляции исходников.

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

У меня все равно получилось (тм).

22 голосов
/ 26 апреля 2011

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

Xcode 4:

Project Navigator -> "[Имя проекта]" ->В разделе «Цели» выберите цель для юнит-теста -> Этапы сборки -> Разверните источники компиляции -> Нажмите «+» в нижней части источников компиляции и добавьте правильный исходный файл.

7 голосов
/ 30 июля 2013

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

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

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

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

Исправление:

  1. отключите «Удаление мертвого кода» для сборки отладки приложения. * И
  2. убедитесь, что ваши модульные тесты используют Debug, а неВыпуск, в настройках Схемы.

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

1 голос
/ 26 апреля 2011

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

...