3

そのため、cocos2d + box2d プロジェクトで Box2D (C++) ポインターを他の Objective-C++ クラスに公開したいと考えています。C++ クラス b2World を参照し、Box2D.h をインポートするインターフェイスでメソッド「getWorld」を宣言します。プロジェクト内のすべてのファイルの拡張子は .mm で、次のコンパイル エラーが発生します。

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 ファイルから始まります。

アップデート:

ログには、World.mm (以前にコンパイルされたもの) が客観的な 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 と表示されます

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

どちらのファイルもデフォルトとして設定されています - Objective-C++ ソース。何を与える..?

4

6 に答える 6

19

これは Xcode4 の重大なバグのようで、コンパイラの設定とは関係ありません - Xcode の内部だけです。


アップデート:

私は最終的に根本的な原因を見つけました。はい、Xcode/LLVM のバグです。ファイルを間違った順序でコンパイルしてから、自身の設定を上書きし、自身を破壊します。Apple の技術サポートはあまりにも無能すぎて問題を理解することさえできなかったので、彼らがすぐにバグを修正するとは思えません。

(注:このセクションをスキップして、私の元の回答については、以下を参照してください。これにより、BRUTE FORCEが得られますが、非常に迅速な解決策が得られます)

何が起こるかというと... コンパイラが C クラスの処理中に C++ ヘッダーを「見た」場合、(内部的に) そのヘッダーを "C" としてマークします (これが文字通り不可能な場合でも)。

後で、そのヘッダーに戻って C++ でコンパイルしようとすると、ヘッダーが "C" であることを既に自分自身に伝えていることがわかります (信じられないほどばかげているため) ...そしてすぐにクラッシュします。

正しい解決策 (多くの時間と労力を必要とする) は、プロジェクト内のすべての C ファイルを調べて、すべてのヘッダー ファイルへのすべての参照を (Xcode はひどいので手動で) チェックし、それぞれについて、すべてのヘッダー ファイルをチェックすることです。輸入品・・・など

(これには数時間かかる場合があります)

...CファイルがC++ヘッダーを「見る」ことにつながるインポートのチェーンが見つかるまで。

これはすべて自動化する必要があります (ただし、そうではありません)。また、根本的な問題は発生しないはずです (Xcode が正しく記述されていれば)。


私はWeb上の他の場所にリストされているすべてを試しましたが、ほとんどの解決策は「ファイルを削除/追加し続けると、運が良ければ最終的にXcodeが自動的に修正されます」.

私は運が悪かった。機能した唯一のことは次のとおりです。

  1. プロジェクトのビルド設定に移動します
  2. 「ソースを次の形式でコンパイル」設定を見つけます
  3. 「Objective-C++」に設定します
  4. 再構築

実際の名前/値は次のとおりです: "GCC_INPUT_FILETYPE = sourcecode.cpp.objcpp" - 私の推測では、これは Xcode の (壊れた!) 内部ロジックを回避します。

于 2012-08-24T06:15:28.580 に答える
1

Cocos2D/Box2D プロジェクトでこれに問題がありました.m。プロジェクト内のすべてのファイル (もちろん Cocos2D のファイルを除く) の名前を変更.mmして、Objective-C++ としてコンパイルするまで解決されませんでした。

@Adamのソリューションも機能すると思いますが、コンパイル設定を「ファイルタイプに応じて」のままにしておくことを好み、すっきりと感じます。

于 2012-11-16T14:28:51.833 に答える
0

実際に正しい解決策は、コードを次の場所に取り込むことです。

#if __cplusplus

// … your code … 

#endif // __cplusplus
于 2013-09-04T22:17:51.697 に答える
0

プロジェクトから DebugDrawLayer を削除してから再度追加すると、問題が解決しました。ビルド段階の設定で、ファイルにいくつかの奇妙なコンパイラ設定があった可能性がありますが、それらをチェックしたことはありません。

于 2012-08-22T12:16:27.380 に答える
0

を持っているときにこの問題が発生し#import "Box2D.h"ましたPrefix.pch#import "Box2D.h"代わりに、それを使用する各ファイルにあるように変更しました。

于 2013-10-23T17:44:11.467 に答える