我的应用程序单元测试在模拟器中运行时构建和测试,但在构建和测试到设备时失败并出现链接器错误。
在我的应用程序目标上,我设置了以下build设置:
DEPLOYMENT_POSTPROCESSING = NO
GCC_SYMBOLS_PRIVATE_EXTERN = NO
在我的单元测试中,我设置了以下build设置:
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 文件是生产代码,也是我的应用程序目标的一部分,因此我不必将它链接到单元测试包中。
那么,这是怎么回事?为什么这在模拟器中工作得很好,但在设备上却不行?
我发布了 sample project to Github这说明了问题。你可以在示例项目中看到这个问题是不一致的:有些符号链接(symbolic link)很好,有些则没有。
最佳答案
当链接器创建 Linker-Error
可执行文件时,它会丢弃 FHKViewControllerThisSymbolWontLink
,因为可执行文件中没有任何内容使用它。链接器不知道它应该保留符号以供单元测试包(在运行时动态加载)使用。
您可以通过使用 used
属性标记它来告诉链接器不要删除未使用的符号,如下所示:
NSString * const FHKViewControllerThisSymbolWontLink __attribute__((used)) = @"name";
您需要为您定义的每个未被主可执行文件使用但被测试套件使用的符号执行此操作。
关于ios - Xcode 单元测试 - 仅为设备构建时出现链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17158101/