我是Xcode的初学者...... 我正在尝试使用openCV c ++和Scenekit =>制作AR场景。 好吧,我太乐观了。
1 /我开始使用游戏的默认XCode模板。=>作品!
2 / openCV without scenekit =>作品
3 /混合......
我在gameviewController文件中导入了一些c ++标题(基本上是一个带有scenekit的UIViewController)。
如果我这样做,我会收到编译器错误(cstddef未定义)。很公平,它是C ++所以,从我读到的,我只需要将.m重命名为.mm 但是,在这种情况下,我得到了链接器错误的完整列表,例如架构arm64的未定义符号: “_OBJC_CLASS _ $ _ SCNAction”,引自:
=>我想将目标C和C ++混合起来比较简单,但是在一个更简单的项目中,没有Scenekit但是代码非常相似,它运行得很好。
混合它们的任何线索或指南?我应该使用swift吗?
非常感谢,
迈克尔
答案 0 :(得分:4)
答案 1 :(得分:1)
这里的问题相同。我有一个纯粹的Objective-C类,简单地命名为" GameViewController.m"。要将其转换为Obj-C ++类,请更改" .m"到" .mm"。
但是,只需更改扩展名,链接器就会回显13个未定义的符号....
"_OBJC_CLASS_$_SCNTransaction", referenced from: ...
"_OBJC_CLASS_$_SCNFloor", referenced from: ...
"_OBJC_CLASS_$_SCNMaterial", referenced from: ...
etc...
要解决这个问题,只需创建一个扩展名为.mm的不同(新)Obj-C ++类,并将C ++代码放在该类中。 现在,您可以从包含SceneKit调用的类中实例化该新类,并调用新的Obj-C ++类中的方法。
在GameViewcontroller.m类中:
...
scene = [SCNScene sceneNamed:@"art.scnassets/grid.dae"];
kinematics = [[KinematicScene alloc] init];
[kinematics setupCharacters];
...
在新的Obj-C ++类(KinematicsScene.mm)中
@implementation KinematicScene
{
AI::Location *location;
}
-(id) init
{
self = [super init];
if( self )
{
AI::KinematicSeek* seek = new AI::KinematicSeek[2];
location = new AI::Location[2];
}
return self;
}
-(void) setupCharacters
{
.....
}
... etc ....
@end
答案 2 :(得分:0)
这对我有用:
禁用模块支持[CLANG_ENABLE_MODULES,-fmodules]。这有用户体验的缺点。在禁用它之前,请阅读此设置的在线帮助,同时请注意,如果禁用它,您将负责搜索需要链接的库和框架,如果您不是老手,这可能会很乏味。
构建和(尝试)链接。添加解决链接错误所需的框架和库。我建议在项目中创建一个组并将其指向SDK,然后添加相对于该SDK的框架和库。