2012-09-10 339 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的不良行爲。