SFML库:奇怪的错误

时间:2012-09-10 13:18:28

标签: c++ sfml

我正在学习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位电脑。在microsoft vc ++ 2010中,我可以构建解决方案或调试,我总是构建解决方案。

我正在以发布模式构建,但我也尝试了两种方式,但它们都无法正常工作

有人可以告诉我我能做些什么来防止这种情况发生或者如何发生这种情况。

3 个答案:

答案 0 :(得分:1)

对于这些应用程序启动问题,检查依赖关闭中的所有dll是否都可访问总是一个好主意 - 也就是说,它们是否都在搜索PATH中?我们通常使用dependency walker来检查哪些dll丢失,或使用gflags进行运行时诊断

虽然将你的dll与你的exe文件放在同一个文件夹中,但它不能很好地扩展,我通常做的一种方法是将库路径放在PATH环境变量中。

有一点需要注意的是,sfml带有vs2005和vs2008的预构建binrary,因为你使用的是vs2010,底层的c运行时库(msvcrt)是不同的,会有潜在的问题 - 你最好自己从源代码构建sfml使用vs2010或使用vs2005 / vs2008,只是为了保持一致

答案 1 :(得分:0)

如果你不想使用DLL并想将SFML编译成exe,这里是教程: 2.0 http://www.sfml-dev.org/tutorials/2.0/start-vc.php 你需要添加preprcessor指令SFML_STATIC,并在程序中使用你正在使用的附加库 - >>输入

答案 2 :(得分:0)

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

  1. 不要使用预编译的库/ dll。学习如何使用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时有不良行为。