【问题标题】:The procedure entry point _ZSt24__throw_out_of_range_fmtPKcz could not be located in the dynamic link library sfml-graphics-2.dll无法在动态链接库 sfml-graphics-2.dll 中找到过程入口点 _ZSt24__throw_out_of_range_fmtPKcz
【发布时间】:2015-03-29 01:27:26
【问题描述】:

今天我决定下载、安装并尝试使用 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;
}

编译正确的代码虽然尝试运行它,但会出现一个错误消息框,提示“无法在动态链接库 sfml-graphics-2.dll 中找到过程入口点 _ZSt24__throw_out_of_range_fmtPKcz”。我在网上搜索但没有找到与此问题相关的任何内容,所以我来这里寻求帮助。感谢进一步的回答。

【问题讨论】:

    标签: c++ sfml


    【解决方案1】:

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

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

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

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

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

    链接器阶段确定您调用的函数是否实际存在。这是事情变得棘手的地方,因为函数存根存在于导入库中,这将满足链接器的要求。导入库告诉链接器,“是的,这个函数在这个 DLL 中,所以相信我”。这对您来说也没有错误

    (请注意,这在非 DLL 场景中是不同的,链接器实际上会查找函数本身,而不是存根)。

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

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

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

    【讨论】:

    • 这没有回答“如何解决问题”的问题
    • 这对我没有任何意义——它不能回答问题
    • 你能向非windows程序员解释一下,以便他可以解决他的windows pc上的问题吗?
    • 给出的解释就足够了。如果您不熟悉动态链接库是什么,可以使用大量资源来定义它们是什么。如果您正在编写将使用 DLL 的程序,则程序中将调用 DLL 导出函数的任何函数都必须在链接时放置在库中(或使用 LoadLibrary / GetProcAddress)。这是基本的东西,试图在评论框中解释是无法做到的。
    • 导入库是作者应该作为构建包的一部分提供给您的。如果他/她没有给你,那就去找作者索要。如果他们不能这样做,那么您需要自己构建它,或者如果不是,请使用 LoadLibrary / GetProcAddress 调用您的函数。说真的,所有这些信息都可以在这里和在线获得,以了解我正在解释的这些事情是什么。您无权访问 Google?
    【解决方案2】:

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

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

    • 选择源和构建文件夹
    • 点击“配置”并为生成器选择“CodeBlocks - MinGW Makefiles”
    • 关闭BUILD_SHARED_LIBS
    • 开启SFML_BUILD_EXAMPLESSFML_USE_STATIC_STD_LIBS
    • CMAKE_BUILD_TYPE 更改为 Debug(可选,提供有用的错误消息)
    • 点击“配置”,然后点击“生成”

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

    【讨论】:

      【解决方案3】:

      这实质上是在说明您的编译器与 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/

      【讨论】:

        猜你喜欢
        • 2021-06-12
        • 2012-09-09
        • 1970-01-01
        • 2013-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-24
        • 2013-03-19
        相关资源
        最近更新 更多