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

fla*_*006 1 c++ linker undefined-reference box2d

这是一些重现该问题的简单代码:

#include <box2d/box2d.h>

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

这应该根据我读过的所有内容进行编译,并且(对于学究来说)我猜它在技术上确实可以编译,但是当我尝试(使用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
Run Code Online (Sandbox Code Playgroud)

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

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

fla*_*006 5

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

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