2012-09-10 340 views
2

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

如果我ramove第2和建立了我的程序它不会给出错误,但当我打开它说:

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

我有一台64位计算机。并在微软vC++ 2010我可以做生成解决方案或调试,我总是做生成解决方案。

和我建立在释放模式,但我也曾经尝试都和他们都没有工作

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

+0

如果您构建一个调试版本,为什么不在调试器中运行它?至少你会看到_where_问题是。 –

+0

@JoachimPileborg先生,我已经尝试过但没有工作 –

+0

此外,你真的应该叫'App.Display' _all the time_?在大多数其他框架中,您在进入主事件循环之前告诉应用程序对象显示_once_。另外,它会不会尝试在关闭后再次显示窗口,从而给您提供问题? –

回答

1

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

虽然把你的DLL与EXE在同一文件夹中的作品,它不能很好地扩展,一个办法,我平时做的就是把库路径PATH环境变量。

有一点需要注意,sfml为vs2005和vs2008提供了预编译的二进制文件,就像您使用vs2010时一样,底层的c运行时库(msvcrt)是不同的,会有潜在的问题 - 您最好从源代码构建sfml自己使用VS2010或使用VS2005/VS2008,只是要一致

0

我也有一些rel当我第一次使用这个(和等效的libs)的时候会出现问题。这里有几点需要计数:

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