今天我决定下载、安装并尝试使用 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”。我在网上搜索但没有找到与此问题相关的任何内容,因此我来这里寻求帮助。感谢进一步的回答。
此问题的主要原因是 DLL 的导入库是为您正在使用的 DLL 的不同版本创建的。
构建应用程序时,您使用了导入库,以便链接器找到应用程序正在调用的 SFML 函数。但是,DLL 本身不包含导入库具有存根的一个或多个函数。
创建隐式加载 DLL 的应用程序需要 3 个步骤:
- 编译代码
- 链接代码
- 运行代码
编译器只关心程序的语法是否正确。这工作没有错误。
链接器阶段确定您调用的函数是否实际存在。这就是事情变得棘手的地方,因为函数存根存在于导入库中,这将满足链接器的要求。导入库告诉链接器,“是的,这个函数就在这个 DLL 中,所以相信我”。这对你来说也没有错误
(请注意,这在非 DLL 场景中有所不同,链接器实际上会查找函数本身,而不是存根)。
然而,实际的函数本身位于不同的模块(DLL)中,并且应用程序唯一可以确定它们存在的时间是当您运行程序时。这就是你现在被困住的地方。
因此,您首先应该做的事情是确保构建应用程序时使用的导入库与运行时加载的 DLL 相匹配。如果仍然出现错误,请联系您获取 DLL 的位置并询问如何获取正确的导入库。
此外,如果由于某种原因无法获取导入库,还有一些方法可以从 DLL 创建导入库。我不知道如何为 MingW 手动执行此操作的所有细节,但这些信息应该可以在网上找到。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)