0

私はプロジェクトに取り組んでいます。このプロジェクトには次のものがあります...

プロジェクト1

JNIBox2DWorld.h

static b2World* world = NULL;

JNIBox2DWorld.cpp

world = new b2World(gravity);

これでうまくいくようですが、OpenGLレンダラーを追加したいので、新しいプロジェクトを作成して古いヘッダーファイルを参照します....

プロジェクト2

b2GLPolygonShape.h

#include <Box2D/JNIBox2DWorld.h>
...
class b2GLPolygonShape 
{
  public:
    void Draw();
    void Draw(b2PolygonShape* s);
};

b2GLPolygonShape.cpp

#include "b2GLPolygonShape.h"
void b2GLPolygonShape::Draw(){
LOGD("in Draw");
if(world == NULL){
    LOGD("World is not set for some reason");
}
else{
    LOGD("World is set");
}
}

Box2D ライブラリ内で世界が機能していることがわかりますが、新しいコードを介してアクセスしようとすると、null になります....

D/Native (14119): 引き分け

D/Native (14119): 何らかの理由でワールドが設定されていません

新しいライブラリから呼び出すと null と表示されるのに、古いライブラリでは問題なく動作するのはなぜですか? 静的なので、両方で動作するべきではありませんか?

4

1 に答える 1

1

static の機能について少し混乱していると思います。コンパイル単位 (通常は cpp ファイル) 内でグローバルな静的変数を宣言する場合、これは、その変数がコンパイル単位に対してローカルであり、他の場所では見られないことを意味します。

2 つの個別の cpp ファイルに含まれるヘッダー ファイル内でグローバルな静的変数を宣言しているため、最終的にはworld. ただし、world内でb2GLPolygonShape.cpp作成された変数は で作成された変数とは何の関係もありませんJNIBox2DWorld.cpp

おそらくやりたいことは、ヘッダー ファイルで外部変数を宣言することです。

たとえば .h

extern b2World* world;

そして、1 つだけ (!) の cpp ファイルでオブジェクトを作成します。

たとえば .cpp

b2World* world = new b2World(gravity);

別の cpp ファイルでは、オブジェクトを使用できます。

test.cpp

#include <example.h>

void foo() {
  world->whatever();
} 

少なくともリンカーは問題ないはずです。

ただし、このようにグローバル変数を使用すると、あらゆる種類の問題が発生するため (たとえば、最も明白な例を挙げると、初期化の順序など)、通常は、目的を達成するための他の方法を探す必要があります。あなたは警告されました。幸運を :-)

于 2013-07-10T14:36:50.733 に答える