SFML库:奇怪的错误

SFML library : strange error

本文关键字:错误 SFML      更新时间:2023-10-16

我正在学习SFML库,并从教程中选择了一个代码。它打开了一个窗口,应该可以让我再次关闭它,但当我关闭它时,它显示

Debug Error!
Run-Time Check Failure #2 - stack around variable 'App' was corrupted.
and then the console stops working.
this is my code:
int main()
{
    // Create the main window
    sf::Window App(sf::VideoMode(800, 600, 32), "SFML Events");
    while (App.IsOpened())
    {
        // Process events
        sf::Event Event;
        while (App.GetEvent(Event))
        {
            // Close window : exit
            if (Event.Type == sf::Event::Closed)
                App.Close();
            // Escape key : exit
            if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape))
                App.Close();
        }
        // Display window on screen
        App.Display();
    }
    return EXIT_SUCCESS;// = return 0
}

链接到调试库的是

sfml-system.lib
sfml-window.lib
sfml-system-d.lib//these are debug files
sfml-window-d.lib

如果我修改了前2个并构建了我的程序,它不会给出错误,但当我打开它时,它会说:

应用程序无法正确启动(0xc0150002)。单击"确定"关闭应用程序

我有一台64位的电脑。在微软的vc++2010中,我可以做构建解决方案或调试,我总是做构建方案。

我正在以发布模式进行构建,但我也尝试过这两种模式,但它们都不起的作用

有人能告诉我我能做些什么来防止这种情况发生吗?或者这是怎么发生的。

对于这些应用程序启动问题,最好检查依赖关系闭包中的所有dll是否都可以访问,也就是说,它们都在搜索路径中吗?我们通常使用依赖助行器来检查缺少哪些dll,或者使用gflags进行运行时诊断

虽然把dll和exe放在同一个文件夹中是可行的,但它的伸缩性不好,我通常做的一种方法是把库路径放在path环境变量中。

需要注意的是,sfml为vs2005和vs2008提供了预构建的binrary,因为您使用的是vs2010,底层的c运行库(msvcrt)不同,可能会出现潜在的问题-您最好使用vs2010或使用vs2005/vs2008从源代码构建sfml,只是为了保持一致的

如果您不想使用DLL并想将SFML编译成exe,下面是教程:2http://www.sfml-dev.org/tutorials/2.0/start-vc.php您需要添加预处理器指令SFML_STATIC,并将您在程序中使用的其他库包含到链接器->输入

当我第一次使用这个(以及等效的libs)时,我也遇到了一些相关的问题。以下是一些要点:

  1. 不要使用预编译库/dlls。学习如何使用CMake、boost_build(boost库)、Scons(mongoDB)等,并根据当前使用的编译器/平台构建库(当然,如果有这种可能性的话)。经过一段时间,这个过程变得非常简单,这将为以后的其他项目节省大量时间
  2. 阅读关于制作一个简单项目的SFML教程。它们易于阅读和理解。也可以尝试使用CMake生成示例,并构建它们以了解它们是如何工作的。另一个很好的教程是关于SFML编程的书(这本书对使用C++11有很大的推动作用,我认为这很好)
  3. 如前所述,如果不想使用DLL,请将SFML_STATIC添加到"预处理器定义"中,我认为最好在链接器选项中设置"Windows(/SUBSYSTEM:Windows)"(如果我从"然后控制台停止工作"语句中正确理解)
  4. 最好将libsndfile-1.dll和openal32.dll放在生成应用程序的release/debug文件夹中,因为我看到VC++在从提供的路径中查找dll时有不好的行为