今天我决定下载,安装并尝试使用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; }
代码编译正确,虽然尝试运行它出现一个错误消息框说“程序入口点_ZSt24__throw_out_of_range_fmtPKcz无法位于动态链接库sfml-graphics-2.dll”.我在网上搜索但没有发现任何与此问题有关的内容,所以我来到这里寻求帮助.感谢进一步的答案.
解决方法
此问题的主要原因是DLL的导入库是为您正在使用的DLL的不同版本创建的.
构建应用程序时,使用了导入库,以便链接器可以找到应用程序正在调用的SFML函数.但是,DLL本身不包含导入库具有存根的一个或多个功能.
创建一个无意中加载DLL的应用程序需要一个3步骤的过程:
所有编译器都关心的是程序在语法上是正确的.这没有错误.
链接器阶段确定您调用的函数是否实际存在.这是事情变得棘手的地方,因为函数存根存在于导入库中,并且将满足链接器.导入库告诉链接器,“是的,这个函数在这个DLL中,所以请相信我”.这对你来说也没有错误
(请注意,这在非DLL方案中是不同的,其中链接器实际上将查找函数本身,而不是存根).
但是,实际的函数本身位于不同的模块(DLL)中,并且应用程序唯一可以确定它们存在的时间是运行程序时.这就是你现在被困住的地方.
所以你应该首先做的是确保你在构建应用程序时使用的导入库与你在运行时加载的DLL相匹配.如果仍然出现错误,请联系获取DLL的位置,并询问如何获取正确的导入库.
此外,还有一些方法可以从DLL创建导入库,如果由于某种原因您无法获取导入库.我不知道如何为MingW手动执行此操作的所有细节,但信息应该可以在某处在线获取.