无法在动态 link 库 sfml-graphics-2.dll 中找到过程入口点 _ZSt24__throw_out_of_range_fmtPKcz

The procedure entry point _ZSt24__throw_out_of_range_fmtPKcz could not be located in the dynamic link library sfml-graphics-2.dll

今天我决定下载、安装并尝试使用 SFML 2.2。我还使用 MinGW 编译器下载了 Code::Blocks。我设置了所有内容并正确安装了所有内容(或者我认为如此)并尝试 运行 示例代码以查看它是否有效:

#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
    sf::CircleShape shape(100.f);
    shape.setFillColor(sf::Color::Green);

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear();
        window.draw(shape);
        window.display();
    }

    return 0;
}

尽管尝试 运行 代码编译正确,但会出现错误消息框 "The procedure entry point _ZSt24__throw_out_of_range_fmtPKcz could not be located in the dynamic link library sfml-graphics-2.dll"。我在网上搜索但没有找到与此问题相关的任何内容,所以我来这里寻求帮助。感谢进一步的回答。

出现此问题的主要原因是 DLL 的导入库是为您正在使用的不同版本的 DLL 创建的。

构建应用程序时,您使用了一个导入库,以便链接器可以找到您的应用程序正在调用的 SFML 函数。但是,DLL 本身不包含导入库具有存根的一个或多个函数。

创建隐式加载 DLL 的应用程序需要 3 个步骤:

  1. 编译代码
  2. 链接代码
  3. 运行代码

编译器只关心程序在语法上是否正确。这工作没有错误。

链接器阶段确定您调用的函数是否实际存在。这是事情变得棘手的地方,因为导入库中存在函数存根,这将满足链接器的要求。导入库告诉链接器,"yes, this function is here in this DLL, so trust me"。这对你也没有错误

(请注意,这在非 DLL 情况下有所不同,链接器实际上会查找函数本身,而不是存根)。

但是,实际函数本身位于不同的模块 (DLL) 中,您的应用程序唯一可以确定它们存在的时间是当您 运行 程序时。这就是您现在遇到的问题。

因此,您首先应该做的是确保您在构建应用程序时使用的导入库与您在 运行 时加载的 DLL 相匹配。如果您仍然遇到错误,请联系您获得 DLL 的位置并询问如何获得正确的导入库。

此外,如果由于某种原因您无法获取导入库,还有一些方法可以从 DLL 创建导入库。我不知道如何为 MingW 手动执行此操作的所有详细信息,但该信息应该可以在某个地方在线获得。

这不是直接的解决方案,但解决方法是尝试静态链接。 SFML 的教程似乎谈到了这一点,它涉及将 SFML_STATIC 添加到 #defines 部分。您的 exe 会更大,但它们也会更独立。

我遇到了同样的问题并且静态链接工作正常,尽管我使用的是 mingw-w64 i686 和 cmake。您将下载 SFML 的源代码,然后在 cmake 设置中,您将:

  • 选择源和构建文件夹
  • 单击 'Configure',对于生成器,select "CodeBlocks - MinGW Makefiles"
  • 关闭BUILD_SHARED_LIBS
  • 打开 SFML_BUILD_EXAMPLESSFML_USE_STATIC_STD_LIBS
  • CMAKE_BUILD_TYPE 更改为调试(可选,以获得有用的错误消息)
  • 单击 'Configure',然后单击 'Generate'

构建文件夹中会有一个.cbp 文件。此外,这些示例可能会告诉您缺少 'resources' 文件夹或 openal32.dll,因此您只需将它们添加到构建文件夹中的示例中即可。

这实际上是在说明您的编译器与 SFML 使用的编译器不同。

您可以通过为每个版本下载特定版本来解决此问题。对于 CodeBlocks,您只需下载(mingw16.01): http://www.codeblocks.org/downloads/26

对于 SFML,您只需下载 GCC 4.9.2 TDM (SJLJ): https://www.sfml-dev.org/download/sfml/2.4.2/