c – 带有.mm测试文件的OCMock 3.0.2链接器错误

c – 带有.mm测试文件的OCMock 3.0.2链接器错误,第1张

概述我正在使用OCMock 3.0.2,我通过 cocoapods安装了我的测试目标: platform :ios, '7.0'xcodeproj 'myProject.xcodeproj'target :myTestTarget do pod 'OCMock', '~> 3.0.2'endlink_with "myTestTarget" 在我的测试文件(myTest.mm)中,我已经 我正在使用Ocmock 3.0.2,我通过 cocoapods安装了我的测试目标:

platform :ios,'7.0'xcodeproj 'myProject.xcodeproj'target :myTestTarget do  pod 'Ocmock','~> 3.0.2'endlink_with "myTestTarget"

在我的测试文件(myTest.mm)中,我已经包含了Ocmock并希望尝试新的就地验证策略,如下所示:

- (voID) test_myTest{    MyObject *obj = [MyObject new];    ID robotMock = OCMPartialMock(obj);    [obj testMethod];    // some asserts    OCMVerify([obj _internalMethodToBeCalled]);}

到目前为止似乎正常.但是,当我尝试运行此特定测试用例时,我收到链接错误

Undefined symbols for architecture i386:  "OCMMakeLocation(objc_object*,char const*,int)",referenced from:      -[MyTests test_myTest] in MyTests.old: symbol(s) not found for architecture i386clang: error: linker command Failed with exit code 1 (use -v to see invocation)

我确认已正确引入Ocmock并且也引用了OCMLocation.h / m文件.我看到OCMMakeLocation似乎是一个外部函数,但.m文件作为我的pods构建目标中的依赖项目存在,但不知何故它没有被链接.我必须让我的测试成为.mm,因为我包含了一些c文件.为什么这会成为Ocmock的问题?

解决方法 OCMMakeLocation是这样声明的

OCMLocation.h:

extern OCMLocation *OCMMakeLocation(ID testCase,const char *file,int line);

OCMLocation.m:

OCMLocation *OCMMakeLocation(ID testCase,const char *fileCString,int line){    return [OCMLocation locationWithTestCase:testCase file:[Nsstring stringWithUTF8String:fileCString] line:line];}

它是在Objective-C接口之外定义的直接C函数.关于编译器实际上做了什么(或许其他人可以更好地解释),我不够了解,但据我所知,这就是正在发生的事情:你的测试文件是一个Objective-C文件,所以它正在变得越来越好符合C连接,它确实命名为mangling(see this about name mangling).但是,OCMLocation被编译为Objective-C文件,因此它获得C链接,而不是C链接,因此没有名称重整.因为你的测试符合C链接,它会引入Ocmock.h并假设它也是一个C头,所以它假定编译它的源的结果将是相同的,它不会是.

简而言之,为了解决这个问题,您需要做的就是告诉编译器Ocmock.h是测试文件中的C头:

#ifdef __cplusplusextern "C" {#endif#import <Ocmock/Ocmock.h>#ifdef __cplusplus}#endif
总结

以上是内存溢出为你收集整理的c – 带有.mm测试文件的OCMock 3.0.2链接器错误全部内容,希望文章能够帮你解决c – 带有.mm测试文件的OCMock 3.0.2链接器错误所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1016002.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存