<tfoot id='lbagH'></tfoot>
    <bdo id='lbagH'></bdo><ul id='lbagH'></ul>

      <i id='lbagH'><tr id='lbagH'><dt id='lbagH'><q id='lbagH'><span id='lbagH'><b id='lbagH'><form id='lbagH'><ins id='lbagH'></ins><ul id='lbagH'></ul><sub id='lbagH'></sub></form><legend id='lbagH'></legend><bdo id='lbagH'><pre id='lbagH'><center id='lbagH'></center></pre></bdo></b><th id='lbagH'></th></span></q></dt></tr></i><div id='lbagH'><tfoot id='lbagH'></tfoot><dl id='lbagH'><fieldset id='lbagH'></fieldset></dl></div>

    1. <small id='lbagH'></small><noframes id='lbagH'>

        <legend id='lbagH'><style id='lbagH'><dir id='lbagH'><q id='lbagH'></q></dir></style></legend>
      1. Objective-C++ 导入 C++ 类失败,未找到 cassert

        时间:2024-08-12
          <i id='tF8oc'><tr id='tF8oc'><dt id='tF8oc'><q id='tF8oc'><span id='tF8oc'><b id='tF8oc'><form id='tF8oc'><ins id='tF8oc'></ins><ul id='tF8oc'></ul><sub id='tF8oc'></sub></form><legend id='tF8oc'></legend><bdo id='tF8oc'><pre id='tF8oc'><center id='tF8oc'></center></pre></bdo></b><th id='tF8oc'></th></span></q></dt></tr></i><div id='tF8oc'><tfoot id='tF8oc'></tfoot><dl id='tF8oc'><fieldset id='tF8oc'></fieldset></dl></div>

              <bdo id='tF8oc'></bdo><ul id='tF8oc'></ul>
                <tbody id='tF8oc'></tbody>

                <small id='tF8oc'></small><noframes id='tF8oc'>

                <tfoot id='tF8oc'></tfoot>

                • <legend id='tF8oc'><style id='tF8oc'><dir id='tF8oc'><q id='tF8oc'></q></dir></style></legend>

                  本文介绍了Objective-C++ 导入 C++ 类失败,未找到 cassert的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  所以我想在我的 cocos2d + box2d 项目中公开一个 Box2D (C++) 指向其他 Objective-C++ 类的指针.我在我的接口中声明了一个方法getWorld",它引用了 C++ 类 b2World 并导入了 Box2D.h.我项目中的所有文件都是 .mm 扩展名,我得到以下编译错误:

                  So I want to publicly expose a Box2D (C++) pointer to other Objective-C++ classes in my cocos2d + box2d project. I declare a method "getWorld" in my interface which references C++ class b2World and imports Box2D.h. All the files in my project are .mm extension, and I get the following compile error:

                  In file included from DebugDrawLayer.mm:2:
                  In file included from World.h:10:
                  In file included from external/Box2d/Box2D/Box2D.h:34:
                  external/Box2d/Box2D/Common/b2Settings.h:22:10: fatal error: 'cassert' file not found
                  #include <cassert>
                  

                  我猜 Box2D.h 不知何故被编译为 C 而不是 C++,但我不明白这是怎么发生的.根据日志,包含链显然是从 .mm 文件开始的.

                  I guess Box2D.h is somehow compiled as C instead of C++, but I fail to understand how this happens. According to the log the include chain clearly starts from a .mm file.

                  更新:

                  日志显示 World.mm(之前编译)清楚地编译为 Objective-c++

                  The log says for World.mm (compiled earlier) that it clearly compiles as objective-c++

                  CompileC Objects-normal/i386/World.o World.mm normal i386 objective-c++ com.apple.compilers.llvm.clang.1_0.compiler 
                  

                  但是对于 DebugDrawLayer.mm 它说的是objective-c

                  but for DebugDrawLayer.mm it says objective-c

                  CompileC Objects-normal/i386/DebugDrawLayer.o DebugDrawLayer.mm normal i386 objective-c com.apple.compilers.llvm.clang.1_0.compiler
                  

                  这两个文件都设置为默认值 - Objective-C++ 源代码.什么给了..?

                  Both files are set as default - Objective-C++ source. What gives..?

                  推荐答案

                  这似乎是 Xcode4 中的一个主要错误,与编译器设置无关 - 只是 Xcode 内部.

                  This appears to be a MAJOR bug in Xcode4, nothing to do with compiler settings - just Xcode internals.

                  更新:

                  我最终找到了根本原因.是的,这是 Xcode/LLVM 中的一个错误.它以错误的顺序编译文件,然后覆盖自己的设置,并自行中断.苹果的技术支持太无能,甚至无法理解这个问题,所以我怀疑他们很快就会修复这个错误.

                  I eventually found the root cause. Yes, it's a bug in Xcode/LLVM. It compiles files in the wrong order, and then overrides its own settings, and breaks itself. Apple's tech support was too incompetent to even understand the problem, so I doubt they'll be fixing the bug anytime soon.

                  (注意:跳过此部分,并在下面查看我的原始答案,这给出了一个蛮力但非常快速的解决方案)

                  (NB: Skip this section, and see below, for my original answer, that gives a BRUTE FORCE but VERY QUICK TO DO solution)

                  会发生什么......如果编译器看到"一个 C++ 头文件在处理一个 C 类......然后它(内部)将该头文件标记为C"(即使这是几乎不可能).

                  What happens is ... if the compiler "sees" a C++ header while processing a C class ... it then marks that header (internally) as "C" (even when this is literally impossible).

                  稍后,当它回到那个头文件,尝试用 C++ 编译它时,它发现它已经告诉自己头文件是C"(因为它非常愚蠢)......并且立即崩溃.

                  Later on, when it comes back to that header, trying to compile it with C++, it finds it has already told-itself that the header is "C" (because it's incredibly stupid) ... and promptly crashes.

                  正确解决方案(需要大量时间和精力)是检查项目中的每个 C 文件,并检查(手动,因为 Xcode 很烂)对每个头文件的每个引用 --并且,对于每一个,它导入的每个头文件......等等.

                  The correct solution (which requires lots of time and effort) is to go through EVERY C FILE in your project, and check (manually, because Xcode sucks) EVERY reference to EVERY header file -- and, for each one, EVERY header file it imports ... etc.

                  (这可能需要几个小时)

                  (this can take hours)

                  ...直到找到导致 C 文件看到"C++ 标头的导入链.

                  ...until you find the chain of imports that leads to a C file "seeing" a C++ header.

                  所有这些都应该是自动化的(但不是).并且根本问题不应该发生(如果 Xcode 编写正确的话).

                  All of this should be automated (but isn't). And the root problem shouldn't happen (if Xcode were correctly written).

                  我尝试了网络上其他地方列出的所有方法,大多数解决方案都是不断删除/添加文件,如果幸运的话,Xcode 最终会自行修复".

                  I tried everything listed elsewhere on the web, most of the solutions are "keep removing/adding the file, and eventually Xcode will fix itself if you're lucky".

                  我不走运.唯一有效的是:

                  I wasn't lucky. The only thing that worked was:

                  1. 转到为您的项目构建设置
                  2. 找到将源编译为"设置
                  3. 将其设置为Objective-C++"
                  4. 重新构建

                  实际的名称/值是:GCC_INPUT_FILETYPE = sourcecode.cpp.objcpp" - 所以我的猜测是这回避了 Xcode(坏了!)的内部逻辑.

                  The actual name/value is: "GCC_INPUT_FILETYPE = sourcecode.cpp.objcpp" - so my guess is that this sidesteps Xcode's (broken!) internal logic.

                  这篇关于Objective-C++ 导入 C++ 类失败,未找到 cassert的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  上一篇:[CALayer 保留]:消息发送到解除分配的实例? 下一篇:如何开启 Cocos2D CCLOG Debug 模式?

                  相关文章

                  <small id='gytrj'></small><noframes id='gytrj'>

                  <legend id='gytrj'><style id='gytrj'><dir id='gytrj'><q id='gytrj'></q></dir></style></legend>
                  1. <tfoot id='gytrj'></tfoot>
                  2. <i id='gytrj'><tr id='gytrj'><dt id='gytrj'><q id='gytrj'><span id='gytrj'><b id='gytrj'><form id='gytrj'><ins id='gytrj'></ins><ul id='gytrj'></ul><sub id='gytrj'></sub></form><legend id='gytrj'></legend><bdo id='gytrj'><pre id='gytrj'><center id='gytrj'></center></pre></bdo></b><th id='gytrj'></th></span></q></dt></tr></i><div id='gytrj'><tfoot id='gytrj'></tfoot><dl id='gytrj'><fieldset id='gytrj'></fieldset></dl></div>

                        <bdo id='gytrj'></bdo><ul id='gytrj'></ul>