问题描述
我正在构建使用以下内容的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 (将#修改为@)