今天我决定下载,安装并尝试使用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”。我在网上搜索但没有发现任何与此问题有关的内容,所以我来到这里寻求帮助。感谢您的进一步解答。
答案 0 :(得分:4)
此问题的主要原因是DLL的导入库是为您正在使用的DLL的不同版本创建的。
构建应用程序时,使用了导入库,以便链接器可以找到应用程序正在调用的SFML函数。但是,DLL本身不包含导入库具有存根的一个或多个功能。
创建一个无意中加载DLL的应用程序需要一个3步骤的过程:
所有编译器关心的是该程序在语法上是正确的。这没有错误。
链接器阶段确定您调用的函数是否确实存在。这是事情变得棘手的地方,因为函数存根存在于导入库中,并且将满足链接器。导入库告诉链接器,&#34;是的,这个函数在这个DLL中,所以相信我&#34;。这对你来说也没有错误
(请注意,这在非DLL场景中是不同的,其中链接器实际上将查找函数本身,而不是存根)。
但是,实际的函数本身位于不同的模块(DLL)中,并且应用程序唯一可以确定它们存在的时间是运行程序时。这就是你现在被困住的地方。
因此,首先应该确保在构建应用程序时使用的导入库与您在运行时重新加载的DLL相匹配。如果仍然出现错误,请联系DLL获取的位置,并询问如何获取正确的导入库。
此外,还有一些方法可以从DLL创建导入库,如果由于某种原因您无法获取导入库。我不知道如何为MingW手动执行此操作的所有细节,但这些信息应该可以在网上找到。
答案 1 :(得分:0)
这不是一个直接的解决方案,但解决方法是尝试静态链接。看起来SFML的教程就此进行了讨论,它涉及将SFML_STATIC
添加到#defines
部分。你的exe会更大,但他们也会更独立。
我有同样的问题和静态链接工作,虽然我使用mingw-w64 i686和cmake。您可以下载SFML的源代码,然后在cmake设置中,您将:
BUILD_SHARED_LIBS
SFML_BUILD_EXAMPLES
和SFML_USE_STATIC_STD_LIBS
CMAKE_BUILD_TYPE
更改为Debug(可选,有用的错误消息)build文件夹中会有一个.cbp文件。此外,示例可能会告诉您缺少'resources'文件夹或openal32.dll,因此您只需将这些添加到构建文件夹中的示例中。
答案 2 :(得分:0)
它基本上说明您的编译器与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/