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

7 c++ sfml

今天我决定下载,安装并尝试使用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;
}
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*zie 5

出现此问题的主要原因是为您所使用的DLL的其他版本创建了DLL的导入库。

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

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

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

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

链接器阶段确定您正在调用的函数是否确实存在。这是棘手的地方,因为函数存根存在于导入库中,并且可以满足链接器的要求。导入库告诉链接器:“是的,此函数在此DLL中,请相信我。” 这也为您工作没有错误

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

但是,实际功能本身位于不同的模块(DLL)中,并且应用程序唯一可以确定其存在的时间是在运行程序时。这就是您现在陷入困境的地方。

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

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

  • 您可以向非Windows程序员解释此问题,以便他可以在Windows PC上解决该问题吗? (2认同)
  • 给出的解释就足够了。如果您不熟悉什么是动态链接库,则可以使用大量资源来定义它们。如果要编写将使用DLL的程序,则必须在链接时将库中调用DLL导出函数的所有函数放在库中(或使用LoadLibrary / GetProcAddress)。这是基本的内容,尝试在注释框中说明这一点是无法完成的。 (2认同)
  • 作者应该将导入库作为构建包的一部分提供给您。如果他/她没有给您,请去作者那里索要。如果他们不能这样做,那么您需要自己构建它,否则,请使用LoadLibrary / GetProcAddress调用您的函数。认真地讲,所有这些信息都可以在此处获得,也可以在线获取关于我正在解释的内容。您无权使用Google? (2认同)