2

我正在学习 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

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

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

我有一台 64 位计算机。在 microsoft vc++ 2010 中,我可以构建解决方案或调试,而且我总是构建解决方案。

我正在发布模式下构建,但我也尝试了两者,但它们都没有工作

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

4

3 回答 3

1

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

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

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

于 2012-09-10T14:17:17.280 回答
0

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

于 2012-10-06T11:23:11.897 回答
0

当我第一次使用这个(和等效的库)时,我也遇到了一些相关的问题。这里有几点需要考虑:

  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 放在生成应用程序的发布/调试文件夹中,据我所知,VC++ 在从提供的路径中查找 dll 时表现不佳。
于 2013-10-16T12:23:22.830 回答