Мои тесты модулей приложений строят и тестируют при запуске в симуляторе, но при создании и тестировании на устройство не удается выполнить ошибку компоновщика.
В моей целевой программе я установил следующие параметры сборки:
DEPLOYMENT_POSTPROCESSING = NO
GCC_SYMBOLS_PRIVATE_EXTERN = NO
На моем unit test я установил следующие настройки сборки:
BUNDLE_LOADER = $(BUILT_PRODUCTS_DIR)/<app name>.app/<app>
TEST_HOST = $(BUNDLE_LOADER)
Ошибка компоновщика:
Undefined symbols for architecture armv7s:
"_<An NSString * const>", referenced from:
-[UnitTestClassA setUp] in UnitTestClassA.o
"_<Another NSString * const>", referenced from:
-[UnitTestClassB helperMethod:] in UnitTestClassB.o
-[UnitTestClassB anotherHelperMethod:] in UnitTestClassB.o
ld: symbol(s) not found for architecture armv7s
clang: error: linker command failed with exit code 1 (use -v to see invocation)
... У меня есть "продолжить после ошибок построения", включенных в настройках Xcode, но я не получаю тонну ошибок компоновщика, жалующихся на NSString * const. Если я делаю что-то не так, тогда ожидаем больше ошибок ссылок, чем кучка, которую я получаю, поскольку я использую строковые константы во всем производственном коде.
Я создаю свои строковые константы следующим образом:
.h файл...
extern NSString * const ReallyGoodString;
.m file...
NSString * const ReallyGoodString = @"This string is great!";
....m файл - это производственный код и часть моего целевого объекта приложения, поэтому мне не нужно связывать его с пакетом unit test.
Итак, что здесь происходит? Почему это отлично работает в симуляторе, а не на устройстве?
Я отправил в Github проект который иллюстрирует проблему. Вы можете увидеть в примере проекта, что эта проблема несовместима: некоторые символы ссылаются только на то, что другие не делают.