加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ios – Xcode单元测试 – 仅在设备构建时链接错误

发布时间:2020-12-15 01:41:18 所属栏目:百科 来源:网络整理
导读:我的应用程序单元在模拟器中运行时测试构建和测试,但在构建和测试设备时出现链接器错误. 在我的应用程序目标中,我设置了以下构建设置: DEPLOYMENT_POSTPROCESSING = NOGCC_SYMBOLS_PRIVATE_EXTERN = NO 在我的单元测试中我设置了以下构建设置: BUNDLE_LOAD
我的应用程序单元在模拟器中运行时测试构建和测试,但在构建和测试设备时出现链接器错误.

在我的应用程序目标中,我设置了以下构建设置:

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文件是生产代码,也是我的应用程序目标的一部分,所以我不必将其链接到单元测试包中.

那么这里发生了什么呢?为什么在模拟器中工作正常,而不是在设备上工作?

我发布了一个说明问题的sample project to Github.您可以在示例项目中看到这个问题不一致:一些符号链接很好,别人没有.

解决方法

当链接器创建链接器错误可执行文件时,它会丢弃FHKViewControllerThisSymbolWontLink,因为可执行文件中没有任何内容.链接器不知道它应该保持单元测试捆绑(由运行时动态加载)使用的符号.

您可以告诉链接器不要使用used属性标记未使用的符号,如下所示:

NSString * const FHKViewControllerThisSymbolWontLink __attribute__((used)) = @"name";

您将需要为您定义的每个不被主要可执行文件使用但被测试套件使用的符号执行此操作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读