C++ 从外部c+访问静态数据时出现问题+;图书馆

C++ 从外部c+访问静态数据时出现问题+;图书馆,c++,opengl-es,box2d,C++,Opengl Es,Box2d,我正在做一个项目,在这个项目中我有以下几点 项目1 JNIBox2DWorld.h static b2World* world = NULL; #include <Box2D/JNIBox2DWorld.h> ... class b2GLPolygonShape { public: void Draw(); void Draw(b2PolygonShape* s); }; extern b2World* world; JNIBox2DWorld.cpp w

我正在做一个项目,在这个项目中我有以下几点

项目1 JNIBox2DWorld.h

static b2World* world = NULL;
#include <Box2D/JNIBox2DWorld.h>
...
class b2GLPolygonShape 
{
  public:
    void Draw();
    void Draw(b2PolygonShape* s);
};
extern b2World* world;
JNIBox2DWorld.cpp

world = new b2World(gravity);
#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");
}
}
b2World* world = new b2World(gravity);
#include <example.h>

void foo() {
  world->whatever();
} 
现在,这似乎很好,但我想添加一个OpenGL渲染器,所以我创建了一个新项目,并引用了旧的头文件

项目2 b2GLPolygonShape.h

static b2World* world = NULL;
#include <Box2D/JNIBox2DWorld.h>
...
class b2GLPolygonShape 
{
  public:
    void Draw();
    void Draw(b2PolygonShape* s);
};
extern b2World* world;
我看到这个世界在Box2D库中工作,但当我试图通过我的新代码访问它时,它是空的

D/本地(14119):绘制中

D/Native(14119):由于某种原因,世界并没有被设定


为什么当我从新库调用它时,它显示为null,但从旧库调用时效果很好?既然它是静态的,那么它不应该同时使用这两种功能吗?

我想你可能对静态的功能有点困惑。当您在编译单元(通常是cpp文件)中声明全局静态变量时,这意味着该变量是编译单元的本地变量,不能在其他地方看到

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

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

示例.h

static b2World* world = NULL;
#include <Box2D/JNIBox2DWorld.h>
...
class b2GLPolygonShape 
{
  public:
    void Draw();
    void Draw(b2PolygonShape* s);
};
extern b2World* world;
在一个但只有一个(!)中,cpp文件创建对象:

示例.cpp

world = new b2World(gravity);
#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");
}
}
b2World* world = new b2World(gravity);
#include <example.h>

void foo() {
  world->whatever();
} 
在另一个cpp文件中,您可以使用以下对象:

测试.cpp

world = new b2World(gravity);
#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");
}
}
b2World* world = new b2World(gravity);
#include <example.h>

void foo() {
  world->whatever();
} 
#包括
void foo(){
世界->随便什么();
} 
至少链接器应该是正常的

然而,以这种方式使用全局变量会带来各种各样的麻烦(例如,初始化的顺序,仅举最明显的一个例子),因此您通常应该寻找全局变量
实现你想要的其他方法。你已经被警告了。祝你好运:-)

谢谢,我想这就是我作为一名Java程序员所得到的:-)我会尝试一下,看看是否能解决它。我想可能会有不同的问题,因为事实上(正如我所说的)cpp文件在不同的库中。当我按照描述做的时候,它似乎无法理解这个世界。。。“b2GLPolygonShape.cpp:6:错误:未定义对“world”的引用”如果需要,我可以发布我的代码。这可能是由于链接问题,因为我可能没有链接。所以只使用标题。让我查一下