我的应用程序单元测试在模拟器中运行时构建和测试,但在构建和测试设备时失败并出现链接器错误。
在我的应用程序目标上,我设置了以下构建设置:
DEPLOYMENT_POSTPROCESSING = NO
GCC_SYMBOLS_PRIVATE_EXTERN = NO
在我的单元测试中,我设置了以下构建设置:
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 文件...
NSString * const ReallyGoodString = @"This string is great!";
... .m 文件是生产代码,是我的应用程序目标的一部分,因此我不必将它链接到单元测试包中。
那么,这里发生了什么?为什么这在模拟器上工作得很好,而不是在设备上?
我已经在Github上发布了一个示例项目来说明这个问题。您可以在示例项目中看到这个问题是不一致的:有些符号链接得很好,有些则没有。