93896


# 起こっている問題

SDL2を使いたいと思っているのですが、何故かウィンドウが表示されません。  
ログを見る限りではプログラムは一応動いているっぽいです。ただ、ウィンドウが表示されません。  
解決法をご存知の方、どうぞよろしくお願いいたします。

## ソースコード（main.cpp）

[code]

    #include <iostream>
    #include "SDL2/SDL.h"
    using namespace std;
    
    int main(int argc, char* argv[])
    {
        cout << "Start" << endl;
    
        const int SCREEN_WIDTH = 800;
        const int SCREEN_HEIGHT = 600;
    
        if (SDL_Init(SDL_INIT_AUDIO) < 0) {
            cout << "SDL init failed." << endl;
            return 1;
        }
    
        // initialize screen
        SDL_Window* window = SDL_CreateWindow("Hello world !!", SDL_WINDOWPOS_UNDEFINED,
            SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
    
        if (window == NULL) {
            SDL_Quit();
            return 2;
        }
    
        SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC);
        SDL_Texture* texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888,
            SDL_TEXTUREACCESS_STATIC, SCREEN_WIDTH, SCREEN_HEIGHT);
    
        if (renderer == NULL) {
            cout << "Could not create renderer" << endl;
            SDL_DestroyWindow(window);
            SDL_Quit();
            return 3;
        }
    
        if (texture == NULL) {
            cout << "Could not create texture" << endl;
            SDL_DestroyRenderer(renderer);
            SDL_DestroyWindow(window);
            SDL_Quit();
            return 4;
        }
    
        // prepare memory
        Uint32* buffer = new Uint32[SCREEN_WIDTH * SCREEN_HEIGHT];
    
        memset(buffer, 0, SCREEN_WIDTH * SCREEN_HEIGHT * sizeof(Uint32));
    
        // set every 4bytes as color into memory
        for (int i = 0; i < SCREEN_WIDTH * SCREEN_HEIGHT; i++) {
            buffer[i] = 0x008080FF;
        }
    
        // update screen
        SDL_UpdateTexture(texture, NULL, buffer, SCREEN_WIDTH * sizeof(Uint32));
        SDL_RenderClear(renderer);
        SDL_RenderCopy(renderer, texture, NULL, NULL);
        SDL_RenderPresent(renderer);
    
        bool quit = false;
        SDL_Event event;
    
        while (!quit) {
            while (SDL_PollEvent(&event)) {
                if (event.type == SDL_QUIT) {
                    quit = true;
                };
            }
            cout << "Loop" << endl;
        }
    
        // finalize screen
        delete[] buffer;
        SDL_DestroyRenderer(renderer);
        SDL_DestroyTexture(texture);
        SDL_DestroyWindow(window);
        SDL_Quit();
    
        cout << "End" << endl;
    
        return 0;
    }
    
[/code]

## 実行結果

[code]

    $ g++ -o main main.cpp `sdl2-config --cflags --libs` -lSDL2
    $ ./main
    Start
    Loop
    Loop
    Loop
    Loop
    Loop
            //省略
    Loop
    Loop
    Loop
    Loop^C  //ctrl + c
    Loop
    End
    
[/code]


CC BY-SA 4.0
2023-02-11T16:23:34.633
93801
2023-02-17T11:25:15.127
2023-02-14T04:21:18.410
3060
57062
question
c++ linux sdl
Debian で SDL2 を用いたプログラムを実行しても、ウインドウが表示されない


こちらの環境で動かしてみました。ウィンドウは表示されます。  
以下のようにディスプレイを指定するとウィンドウが表示されるかもしれません。

[code]

    DISPLAY=:0.0 ./main
    
[/code]

表示されない場合はX Serverのインストール、環境設定がうまくいっていない可能性があります。

* * *

X Serverが起動されていない、または、DISPLAYに設定されていない場合はイベントループがまわりませんでした(Loopが表示されない)。

* * *

oririさんのコメントにあるよう実際はウィンドウが表示されていて隠れているのかもしれません。

次のコマンドを実行するとすべてのウィンドウの情報が表示されます。

[code]

    DISPLAY=:0.0  xwininfo -root -tree
    
[/code]

※すでに環境変数DISPLAYが設定されている場合は`DISPLAY=:0.0`は不要です。


CC BY-SA 4.0
2023-02-12T00:59:38.703
93804
2023-02-14T00:32:50.780
2023-02-14T00:32:50.780
35558
35558
93801
answer


解決の手助けをしてくださった皆様、ありがとうございました。  
OpenGLで必要なファイルが足りなかったことが原因だったようです。  
以下のページで生成してincludeファイルの中身を「/usr/include」に配置することでウィンドウが表示されるようになりました。  
<https://glad.dav1d.de/>


CC BY-SA 4.0
2023-02-17T11:25:15.127
93896
2023-02-17T11:25:15.127
57062
93801
answer