2014-12-02 82 views
0

到目前爲止,我對SDL2非常沮喪。這裏沒有選擇,所以從一些知識淵博的人的幫助中尋找。我試圖讓這個補丁在Windows 8.1上工作。 我在使用Windows 7上的第一個SDL時遇到了任何問題,並且輕而易舉。但是,SDL2並非如此。程序運行時沒有任何反應(也沒有創建窗口)

我使用最近更新的代碼塊+ minGW32發行版來關注「http://lazyfoo.net/tutorials/SDL/01_hello_SDL/windows/codeblocks/index.php」的教程。我也在Orwell Dev C++ + minGW32上試過它。然而,非常奇怪的事情正在發生,這是我在編程中從未見過的東西。我的編譯器不給我任何錯誤。但是,當程序運行時,什麼都不會發生。應該創建一個窗口並延遲幾秒鐘。我也嘗試了第2部分教程來展示圖片,並且再次沒有任何反應。

  • 我確定這兩個程序都不被Windows防火牆阻止,並以管理員身份運行程序和.exe。

  • 編譯器不給出錯誤。

  • SDL2.dll位於.exe的文件夾中。

  • 我已經從網站上的鏈接下載SDL2.0.3和下載並應用修復爲一個靠不住的.h文件中,讓編譯器 誤差SDL2.0.3但不SDL2.0.0在 https://hg.libsdl.org/SDL/raw-file/e217ed463f25/include/SDL_platform.h

    下載
  • 我在編譯器選項中爲SDL2.0.3添加了lib和include文件夾。

  • 我已經添加了連接字符串:-lmingw32 -lSDL2main -lSDL2(也試過-lmingw32 -lSDL2 -lSDL2main和像 論壇發現了其他10件)。

  • 我試過使用調試和發佈編譯器。

  • 我試過將程序構建爲GUI應用程序和控制檯應用程序。在SDL1中,我編譯爲GUI應用程序。在SDL2中,這個 只是編譯,但是當運行時,它什麼都不做。當跑 作爲控制檯應用程序,一個控制檯窗口彈出, 停止響應的程序,然後控制檯顯示 6.357秒後處理退出,返回值255

我已經照着所有的指令準確同時使用Code :: Blocks和Dev C++ IDE,但我仍然沒有得到任何結果。一直在工作和搜索這個爲期2天。上帝的名字是什麼讓我產生這種壓力? 如果您有任何建議或遇到過這個悲劇,請幫忙! T.T

的代碼是非常基本的,如下所示:

//Using SDL and standard IO 
#include <SDL.h> 
#include <stdio.h> 

//Screen dimension constants 
const int SCREEN_WIDTH = 640; 
const int SCREEN_HEIGHT = 480; 

int main(int argc, char* args[]) 
{ 
    //The window we'll be rendering to 
    SDL_Window* window = NULL; 

    //The surface contained by the window 
    SDL_Surface* screenSurface = NULL; 

    //Initialize SDL 
    if(SDL_Init(SDL_INIT_VIDEO) < 0) 
    { 
     printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError()); 
    } 
    else 
    { 
     //Create window 
     window = SDL_CreateWindow("SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); 
     if(window == NULL) 
     { 
      printf("Window could not be created! SDL_Error: %s\n", SDL_GetError()); 
     } 
     else 
     { 
      //Get window surface 
      screenSurface = SDL_GetWindowSurface(window); 

      //Fill the surface white 
      SDL_FillRect(screenSurface, NULL, SDL_MapRGB(screenSurface->format, 0xFF, 0xFF, 0xFF)); 

      //Update the surface 
      SDL_UpdateWindowSurface(window); 

      //Wait two seconds 
      SDL_Delay(2000); 
     } 
    } 

    //Destroy window 
    SDL_DestroyWindow(window); 

    //Quit SDL subsystems 
    SDL_Quit(); 

    return 0; 
} 

這是從開發的C輸出編譯器++:

Compiling Project Changes... 
-------- 
- Project File: C:\Users\Giovanni\Desktop\test\GioGame\GioGame.dev 
- Compiler Name: MinGW GCC 4.8.1 32-bit Debug 

Building makefile... 
-------- 
- Filename: C:\Users\Giovanni\Desktop\test\GioGame\Makefile.win 
- Output File: C:\Users\Giovanni\Desktop\test\GioGame\GioGame.exe 

Processing makefile... 
-------- 
- Makefile Processor: C:\Program Files (x86)\Dev-Cpp\MinGW32\bin\mingw32-make.exe 
- Command: mingw32-make.exe -f "C:\Users\Giovanni\Desktop\test\GioGame\Makefile.win" all 

g++.exe -c 01_hello_SDL.cpp -o 01_hello_SDL.o -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/lib/gcc/mingw32/4.8.1/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/lib/gcc/mingw32/4.8.1/include/c++" -I"C:/Users/Giovanni/Desktop/test/SDL2.0.3/include/SDL2" -g3 

g++.exe 01_hello_SDL.o -o GioGame.exe -L"C:/Program Files (x86)/Dev-Cpp/MinGW32/lib" -L"C:/Program Files (x86)/Dev-Cpp/MinGW32/mingw32/lib" -L"C:/Users/Giovanni/Desktop/test/SDL2.0.3/lib" -static-libstdc++ -static-libgcc -lmingw32 -lSDL2main -lSDL2 -g3 


Compilation Results... 
-------- 
- Errors: 0 
- Warnings: 0 
- Output Size: 143.41796875 KiB 
- Compilation Time: 2.86s 

終於解決。正如我有一種感覺,這是Windows或Windows 8.1的一些問題,只是爲了好玩而讓我感到厭煩。我非常小心並重新下載了SDL2.0。3並重新應用了SDL_platform.h的修補程序。 然後,我完全卸載了我嘗試的所有IDE,以Windows 7兼容模式重新安裝Dev C++作爲桌面管理員(即不在Program Files x86中)。 然後,我再次安裝所有東西,然後運行它。

可能是Windows 8.1管理員BS shenanigans或兼容模式,或早期損壞的下載,或者我正在使用的SDL的問題,甚至是它已安裝到程序文件x86中,這些文件在文件中有一個空格路徑和有限的權利,因爲窗戶。

所以問題:因爲windows。

+0

您忘了發佈您的程序的輸出...您也沒有檢查'SDL_CreateWindow'後的任何錯誤 – 2014-12-02 00:29:08

+0

如何發佈我的程序輸出?編譯和運行後,幾乎沒有任何反應,或者如果設置爲控制檯程序,它只是打開一個控制檯框並停止響應。我有一種感覺,這和Windows 8有一些可怕的聯繫,我做得不對。 – Giovanni 2014-12-02 02:06:40

+0

@Giovanni添加爲答案並接受它。如果其他人有相同的錯誤,他們可以很快找到解決方案。 – Emz 2014-12-02 08:57:57

回答

0

你應該得到一個編譯器錯誤;您對SDL_CreateWindow的參數進行了換位。

SDL_CreateWindow("SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, 
        SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); 

聲明:

SDL_Window * SDLCALL SDL_CreateWindow(const char *title, 
             int x, int y, int w, 
             int h, Uint32 flags); 

你缺少y參數,應該是:

SDL_CreateWindow("SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 
        SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);` 
+0

啊,我喜歡來自其他地方的錯誤代碼。我的意思是要鏈接的代碼格式正確。我想再次鏈接它,但對答覆有一個字符限制,但不是我想的問題。嘗試重新編譯後編譯器錯誤是相同的。 – Giovanni 2014-12-02 01:38:28

+0

當我糾正那條線時,窗戶顯示出來了。如果您仍遇到問題,則與代碼無關。 – mukunda 2014-12-02 01:51:20

+0

您可以點擊您的帖子下方的修改按鈕來更正您的粘貼 – mukunda 2014-12-02 01:57:53

3

的問題是,你永遠不會讓窗戶進入事件循環。您正在閱讀的教程假設該窗口只顯示而不處理事件,這不會發生在所有平臺上。

只是在做SDL_Delay(2000);只會睡2秒,但它不會讓線程處理事件在此期間。

如果替換成

 SDL_Event e; 
     bool quit=false; 
     while(!quit) 
     { 
      while(SDL_PollEvent(&e) != 0) 
      { 
       if(e.type == SDL_QUIT) 
       { 
        quit = true; 
       } 
      } 
     } 

一行它會正常工作(雖然它的忙等待,但你可以不在乎這個版本)

1

終於解決了。正如我有一種感覺,這是Windows或Windows 8.1的一些問題,只是爲了好玩而讓我感到厭煩。我非常小心並重新下載了SDL2.0.3,並重新安裝了SDL_platform.h的補丁程序。然後,我完全卸載了我嘗試的所有IDE,在Windows 7兼容模式下重新安裝Dev C++,作爲桌面管理員(即不在Program Files x86中)。然後,我再次安裝所有東西,然後運行。

可能是Windows 8.1管理員BS shenanigans或兼容模式,或早期損壞的下載,或者我正在使用的SDL的問題,甚至是它已安裝到程序文件x86中,這些文件在文件中有一個空格路徑和有限的權利,因爲窗戶。

所以問題:因爲windows。