【问题标题】:Problems with Object-C++ and FrameworkObject-C++ 和框架的问题
【发布时间】:2012-05-25 08:12:42
【问题描述】:

我有这个项目需要集成 Box2D、Cocos2d-iPhone 和 iPhone 蜡。 一开始我把 cocos2d-iphone 和 box2d 放在一起,它给了我这个错误信息:

    fatal error: 'cassert' file not found
    #include <cassert>
             ^

我查了一下发现是因为box2d是用c++写的,你必须把所有引用box2d的源文件都设置为*.mm,这样苹果编译器才能编译成object-c++。

所以我只是把每个源文件都改成了 *.mm 就可以了。

然后我试着把 iPhone 蜡放进去。 iPhone 蜡是用 object-c 和 c 编写的。他们提供了一个wax.framework。所以我下载它并将它拖到我项目的框架区域中。它给了我这个错误:

     "__Z9wax_startPcPFiP9lua_StateEz", referenced from:
          _main in main_old.o
    ld: symbol(s) not found for architecture armv7
    clang: error: linker command failed with exit code 1 (use -v to see invocation)

所以我再次搜索,我发现这是因为预期的库不存在。 我逐个列表检查,我很确定每个设置都是正确的,我找不到问题。

所以我做了一些测试。 我从其中一个模板创建了一个新的示例项目,并将 iPhone 蜡放入其中,它工作正常。 然后我将 main.m 文件更改为 main.mm,它给出的错误就像上面一样。

那么我该如何解决这个问题? 这是因为 object-C++ 无法导入 object-c 和 c 框架吗? 我是否应该重新创建框架并将其所有名称更改为 *.mm? 还是当我将源文件更改为 *.mm 时我做错了,应该有更好的解决方法?

【问题讨论】:

  • 感谢发布的答案。实际上问题是由 C++ 试图调用 C 函数引起的。我只是痴迷于整个 Object-C++ 的东西,我忘记了它。只需将 extern C 放在进口蜡的地方,一切都已修复。再次感谢您的帮助。
  • 我在发布这个问题几分钟后就发现了这个问题。 StackOverFlow 是这样工作的吗?您发布一个问题,然后您自己找出答案。 :)

标签: objective-c frameworks cocos2d-iphone box2d iphone-wax


【解决方案1】:

该函数实际上是一个名为wax_start() 的函数。所有其他废话都是 C++ 编译器添加的名称修改。这是支持重载所必需的,即其他垃圾编码wax_start() 的参数和返回类型。解决这个问题的最简单方法是告诉 C++ 编译器该头文件中的所有内容都是纯 C,例如

extern "C"
{
 #import "Wax/whatever.h"
}

【讨论】:

    【解决方案2】:

    不要使用 main.mm,而是坚持使用 main.m。无需为 Box2D 重命名 main.m。这是可行的,因为您通常不在 main.m 中包含/导入任何 Box2D (C++) 标头。

    如果将 Box2D (C++) 头文件添加到前缀头文件中,请确保它们仅包含在 C++ (Objective-C++) 文件中,如下所示:

    // C++ header files
    #ifdef __cplusplus
    #import "Box2D.h"
    #endif // __cplusplus
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 2018-07-20
      • 1970-01-01
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      相关资源
      最近更新 更多