从外部c ++库访问静态的问题

时间:2013-07-10 14:25:27

标签: c++ opengl-es box2d

我正在研究一个项目,在这个项目中我有以下内容......

项目1

JNIBox2DWorld.h

static b2World* world = NULL;

JNIBox2DWorld.cpp

world = new b2World(gravity);

现在这似乎工作正常,但我想添加一个OpenGL渲染器,所以我创建一个新项目并重新引用旧的头文件....

Project2的

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库中工作但是当我尝试通过我的新代码访问它时它是空的....

  

D / Native(14119):在Draw中

     

D / Native(14119):由于某种原因未设置世界

为什么当我从我的新图书馆调用它时它显示为null但是从旧版本可以正常工作?既然它是静态的,它不应该同时适用于它们吗?

1 个答案:

答案 0 :(得分:1)

我认为你可能会对静态做什么感到困惑。在编译单元(通常是cpp文件)中声明全局静态变量时,这意味着该变量是 local 到编译单元,不能在别处看到。

由于您在头文件中声明了一个包含在两个单独的cpp文件中的全局静态变量,因此最终会导致两个非常不同的(编译单元本地)全局变量名为world。但是,world中创建的b2GLPolygonShape.cpp变量与JNIBox2DWorld.cpp中创建的变量无关。

您可能想要做的是在头文件中声明一个外部变量:

<强> example.h文件

extern b2World* world;

并在一个,但只有一个(!),cpp文件创建对象:

<强> example.cpp

b2World* world = new b2World(gravity);

在另一个cpp文件中,您可以使用该对象:

<强> TEST.CPP

#include <example.h>

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

并且至少链接器应该没问题。

然而,使用全局变量会带来各种麻烦(例如初始化顺序,只是为了说明最明显的),所以你通常应该寻找 其他方式来实现你想要的。你被警告了。祝你好运: - )