如何解决如何在“ mm”文件Objective-C ++中使用Cocos3D静态库中的Objective-C实用程序方法CC3Foundation.m?
我正在构建使用以下内容的Cocos3D应用程序 iOS中的Cocos3D(Objective-C静态库)和Bullet Physics(C ++静态库)。
因此,我的大多数代码文件都是“ .mm”文件(Objective-C ++),可以同时使用Objective-C方法和C ++函数,并且在目标构建选项中带有“ -ObjC -lstdc ++”链接器标志。
问题是:在“ mm”文件中,从Cocos3D静态库的“ CC3Foundation.m”中调用实用程序方法会导致链接错误(“未定义符号”)。在Cocos3D中调用其他Cocos3D的类方法没有任何问题。
Cocos3D中的“ CC3Foundation.m”是可以由其他Objective-C类使用的实用程序方法(不是类成员方法)的文件。它没有任何类声明/实现。
// TestClass.h ("h" header file)
@interface TestClass
...
-(void) testMethod;
...
@end
// TestClass.mm ("mm" file)
#import "CC3Foundation.h"
@implementation TestClass
...
-(void) testMethod{
CC3Vector va[2];
// "NsstringFromCC3Vectors()" from "CC3Foundation.m" in Cocos3D static library.
// Undefined symbol: NsstringFromCC3Vectors(CC3Vector*,unsigned int)
NSLog(@"va: %@",NsstringFromCC3Vectors(va,2)); // link error
}
...
@end
// from cocos3D static library
// CC3Foundation.h
Nsstring* NsstringFromCC3Vectors(CC3Vector* vectors,gluint vectorCount);
// CC3Foundation.m
Nsstring* NsstringFromCC3Vectors(CC3Vector* vectors,gluint vectorCount) {
NSMutableString* desc = [NSMutableString stringWithCapacity: (vectorCount * 8)];
for (gluint vIdx = 0; vIdx < vectorCount; vIdx++)
[desc appendFormat: @"\n\t%@",NsstringFromCC3Vector(vectors[vIdx])];
return desc;
}
在“ m”个文件(Objective-C)中调用此“ NsstringFromCC3Vectors()”实用程序方法根本没有任何问题。该错误仅在“ mm”文件(Objective-C ++)中发生。 我用“ -lstdc ++”选项重建了Cocos3D静态库,但是没有任何变化。 mm文件中的方法仍然具有“未定义符号”链接错误。
据我所知,关于如何混合使用Objective-C和C ++的代码应该是一个小问题,可以很容易地解决(希望如此)。否则,我别无选择,只能将应用程序的体系结构更改为使用“ m”文件而不是“ mm”。 如果能提供任何有用的答案,将不胜感激。谢谢。
配置信息:
Cocos3D v2.2(0x020002),Cocos2D v3.21(0x00030201)
子弹物理引擎:v2.88
Xcode:12.0.1,iOS:12.4.8
//更新(已解决)。
现在可以通过指定外部“ C”链接以根据“ C”而非“ C ++”正确包含头文件“ CC3Foundation.h”来解决此问题。 基本上,“ CC3Foundation.m”是“ C”功能文件,并且编译器和链接器需要知道,因为C和C ++具有不同的符号名称处理机制。因此,在没有外部“ C”链接的情况下,链接器无法从静态库中找到“ CCFoundation.m”中函数的符号名称,因此会发生链接器错误。
// TestClass.mm ("mm" file)
// Use extern "C" linkage to let compiler/linker kNow "CCFoundation.h/m" is "C" function files.
// Must import "CC3Foundation.h" first
// because "CC3Foundation" is also imported in other classes
// and those classes are also imported in this mm file.
extern "C" {
#import "CC3Foundation.h"
}
@implementation TestClass
...
-(void) testMethod{
CC3Vector va[2];
// "NsstringFromCC3Vectors()" from "CC3Foundation.m" in Cocos3D static library.
NSLog(@"va: %@",2)); // no linker error
}
...
@end
Cocos3D中的Objective-C ++文件之一,“ CC3VertexArrayspodextensions.mm”使用“ CC3Foundation.h / m”,并且以相同的方式导入“ CC3Foundation.h”。
关于外部“ C”的有用帖子
What is the effect of extern "C" in C++?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。