尝试使用 Box2D 时未定义的引用 b2Body::SetUserData(void*)

Undefined reference when trying to use Box2D's b2Body::SetUserData(void*)

下面是重现问题的一些简单代码:

#include <box2d/box2d.h>

int main()
{
    b2World world(b2Vec2_zero);
    b2BodyDef bdef;
    b2Body* body = world.CreateBody(&bdef);
    body->SetUserData(body);
    return 0;
}

这应该根据我读过的所有内容进行编译,并且(对于学究)我猜它在技术上确实 编译,但是当我尝试(使用 g++ test.cpp -lbox2d ) 我收到链接器错误:

/usr/bin/ld: /tmp/ccgHfvqv.o: in function `main':
test.cpp:(.text+0x75): undefined reference to `b2Body::SetUserData(void*)'
collect2: error: ld returned 1 exit status

我尝试 Google 搜索 "undefined reference to b2Body::SetUserData(void*)",但没有找到任何结果。

我也尝试通过 b2BodyDef 来设置它,但是该结构中的 userData 成员似乎工作方式不同,指向具有单个 [=18] 的 b2BodyUserData 结构=] 成员,它似乎不是为了保存用户数据指针而设计的,因为在那里设置地址会导致 Box2D 稍后写入该地址,从而破坏数据。 (我使用 GDB 观察点来检查这一点。)

原来 SetUserData 最近在 Box2D 2.4.1 中被删除了。我还注意到我的一些使用 b2BodyDef 方法的旧代码(我忘记了我过去使用过它)将不再编译;以前它只是一个直接的 void* 指针,没有我提到的问题。

而不是foo->SetUserData(bar),现在看来正确的方法是foo->GetUserData().pointer = bar。 (Source)