在动态链接库sfml-graphics-2.dll中找不到过程入口点_ZSt24__throw_out_of_range_fmtPKcz。

8

今天我决定下载、安装并尝试使用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过程入口点”。我在网上搜索了一下,但没有找到任何与此问题相关的信息,所以我来这里寻求帮助。感谢您进一步的答案。

3个回答

6
这个问题的主要原因是用于DLL的导入库是为您使用的不同版本的DLL而创建的。
在构建应用程序时,您使用了一个导入库,以便链接器能够找到应用程序调用的SFML函数。但是,DLL本身不包含导入库存在存根的一个或多个函数。
创建一个隐式加载DLL的应用程序需要进行3个步骤: 1.编译代码 2.链接代码 3.运行代码
编译器只关心程序是否语法正确,这一点没有错误。
链接器阶段确定您调用的函数是否实际存在。这就是事情变得棘手的地方,因为函数存根存在于导入库中,并且这将满足链接器的要求。导入库告诉链接器,“是的,在此DLL中有此函数,所以相信我”。对于你来说,这也没有错误。
(请注意,这在非DLL场景下不同,链接器实际上会寻找函数本身,而不是存根)。
然而,实际函数本身位于不同的模块(DLL)中,您的应用程序能够确定它们的存在仅当您运行程序时。这就是您现在卡住的地方。
因此,您应该首先确保在构建应用程序时使用的导入库与您在运行时加载的DLL相匹配。如果仍然出现错误,请联系获取DLL的位置,并查询如何获取正确的导入库。
此外,如果由于某种原因无法获取导入库,则可以从DLL创建导入库。我不知道如何手动为MingW执行此操作的所有细节,但是应该可以在网上找到信息。

2
你能否向一个非Windows程序员解释问题的原因,以便他可以在自己的Windows电脑上修复它? - FreelanceConsultant
2
给出的解释已经足够了。如果您不熟悉动态链接库是什么,那么有大量的资源可以定义它们。如果您正在编写将使用DLL的程序,则程序中调用导出函数的任何函数必须在链接时放置在库中(或使用LoadLibrary / GetProcAddress)。这是基础知识,试图在注释框中解释这一点是不可能的。 - PaulMcKenzie
1
此外,如果由于某些原因无法获取导入库,则有方法从DLL创建导入库。我不知道如何手动为MingW执行此操作的所有细节,但相关信息应该可以在网上找到。- 这并没有什么帮助 - FreelanceConsultant
2
导入库是作者应该作为构建包的一部分提供给您的内容。如果他/她没有提供给您,那么请联系作者并要求提供。如果他们无法提供,那么您需要自己构建它,或者使用LoadLibrary / GetProcAddress调用您的函数。说真的,所有这些信息都可以在这里和在线上获得,我所解释的这些东西都可以找到。你没有访问谷歌吗? - PaulMcKenzie
1
这正是为什么你的回答不足够。我已经问过你了。我该怎么做? - FreelanceConsultant
显示剩余17条评论

0

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

我遇到了同样的问题,静态链接起作用了,虽然我同时使用了mingw-w64 i686和cmake。你需要下载SFML的源代码,然后在cmake设置中:

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

在构建文件夹中会有一个.cbp文件。此外,示例可能会告诉你缺少“resources”文件夹或openal32.dll,所以你只需要将它们添加到构建文件夹中的示例中即可。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接