如何在不留下未解决的外部问题的情况下在 Box2D 中创建一个世界

How to create a World in Box2D without leaving Unresolved Externals

我一直在研究 2D 物理引擎,然后出现了 Box2D。我一直在阅读它并尝试进行设置,但遇到了问题。

  1. 使用 premake5 创建构建
  2. 开启新的Visual Studio 2019项目
  3. 将附加包含目录设置为 Box2D header 文件夹
  4. 将附加库目录(在链接器下)设置为包含 lib 文件的文件夹 (Box2D.lib)
  5. 将附加依赖项设置为 Box2D.lib

完成所有这些后,我似乎能够毫无问题地调用和创建 Box2d 变量和函数。但是当我试图建立一个世界时,它开始导致错误。

错误

LNK1120 2 unresolved externals          

LNK2019 unresolved external symbol "public: __thiscall b2World::b2World(struct b2Vec2 const &)" (??0b2World@@QAE@ABUb2Vec2@@@Z) referenced in function "public: void __thiscall Game::run(void)" (?run@Game@@QAEXXZ)                

LNK2019 unresolved external symbol "public: __thiscall b2World::~b2World(void)" (??1b2World@@QAE@XZ) referenced in function "public: void __thiscall Game::run(void)" (?run@Game@@QAEXXZ)       

我正在设置的项目是尝试将 SFML 与 Box2d 结合使用。 运行 生成的文件夹中的测试平台有效,但我正在尝试弄清楚如何在需要时将引擎移植到其他项目中。该解决方案按预期工作。但是一旦创建了世界变量,它就会产生错误。

但是创建和设置 b2Vec2 和 b2BodyDef 变量不会导致任何问题。我不太确定是什么原因,我在网上浏览了各种指南,检查了路径是否正确并重新生成了库文件。

我怀疑问题是 Box2D 配置为在 x64 中构建,而我的项目是在 x86 中构建。我想知道是否有人知道在 x86 中使用 运行 Box2D 或类似的方法。

代码

void Game::run()
{
    sf::Clock clock;
    sf::Time timeSinceLastUpdate = sf::Time::Zero;
    sf::Time timePerFrame = sf::seconds(1.f / 60.f); // 60 fps
    b2Vec2 gravity(0.0f, -10.0f);


    b2World myWorld = b2World(gravity); //The errors are cause by this line.

    // Define the ground body.
    b2BodyDef groundBodyDef;
    groundBodyDef.position.Set(0.0f, -10.0f);



    while (m_window.isOpen())
    {
        processEvents(); // as many as possible
        timeSinceLastUpdate += clock.restart();
        while (timeSinceLastUpdate > timePerFrame)
        {
            timeSinceLastUpdate -= timePerFrame;
            processEvents(); // at least 60 fps
            update(timePerFrame); //60 fps
        }
        render(); // as many as possible
    }

}

找到解决方案。

问题是由于x64系统的测试台生成的库文件引起的。在 Win(32) 模式下重新生成一个库文件生成了正确的库文件,它解决了