Xcode:无法在Scenekit中使用c ++?

时间:2015-03-17 11:30:35

标签: c++ objective-c opencv scenekit

我是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吗?

非常感谢,

迈克尔

3 个答案:

答案 0 :(得分:4)

我只需要添加" SceneKit.framework"到Link Binary With LibrariesLink Binary wit

答案 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)

这对我有用:

  1. 禁用模块支持[CLANG_ENABLE_MODULES,-fmodules]。这有用户体验的缺点。在禁用它之前,请阅读此设置的在线帮助,同时请注意,如果禁用它,您将负责搜索需要链接的库和框架,如果您不是老手,这可能会很乏味。

  2. 构建和(尝试)链接。添加解决链接错误所需的框架和库。我建议在项目中创建一个组并将其指向SDK,然后添加相对于该SDK的框架和库。