0

Box2D、Cocos2d-iPhone、iPhone ワックスを統合する必要があるこのプロジェクトがあります。最初に cocos2d-iphone と box2d を一緒にすると、次のエラー メッセージが表示されます。

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

そして、検索したところ、box2d は c++ で記述されており、box2d を参照するすべてのソース ファイルを *.mm に設定する必要があるため、Apple コンパイラが object-c++ としてコンパイルできることがわかりました。

したがって、すべてのソースファイルを *.mm に変更しただけで機能しました。

そして、iPhoneワックスを入れてみました。iPhone Wax は 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)

もう一度検索すると、予想されるライブラリが存在しないことが原因であることがわかりました。そして、リストごとにチェックしますが、すべての設定が正しいと確信しており、問題を見つけることができませんでした.

だから私はいくつかのテストをしました。これらのテンプレートの 1 つから新しいサンプル プロジェクトを作成し、そこに iPhone ワックスを入れると、問題なく動作します。そして、main.m ファイルを main.mm に変更すると、上記のようなエラーが発生します。

では、どうすればこれを修正できますか?これは、object-C++ が object-c および c フレームワークをインポートできないためですか? フレームワークを再作成して、すべての名前を *.mm に変更する必要がありますか? または、ソース ファイルを *.mm に変更したときに間違ったことをしたので、それを解決するためのより良い方法があるはずですか?

4

2 に答える 2

0

その関数は実際にはと呼ばれる関数wax_start()です。他のすべてのがらくたは、C++コンパイラによって追加された名前マングリングです。これは、オーバーロードをサポートするために必要です。つまり、他のがらくたは、のパラメータと戻り値のタイプをエンコードしますwax_start()。これを修正する最も簡単な方法は、そのヘッダー内のすべてが純粋なCであることをC++コンパイラに通知することです。

extern "C"
{
 #import "Wax/whatever.h"
}
于 2012-05-25T09:39:31.207 に答える
0

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
于 2012-05-25T11:22:21.750 に答える