目次 - FAQ - Windows

FAQ:Windows

全般

SDLを使う

何に対応しているか?

SDL 2.0.0 はWindows XP, Vista, 7, 8, 10, 11に対応している.

SDLはICC, Visual C++, Cygwin, MinGW, Dev-C++で利用できる.

最新の情報はインストールを参照すること.

Windows 2000

Windows 2000を使っているが, SDL2.dllをコピーできない!

様々な理由で, Linuxで作られたアーカイブはWindows 2000で展開すると「暗号化」属性が設定される. プロパティウィンドウの全般タブの詳細設定から暗号化チェックを外すことができる. そうすれば通常通りコピーできるようになる.

SDLで開発する

Windows CE

Windows CEでSDLをビルドできるか?

SDL 1.2はWindows CEには公式には対応していない. しかし, Windows CEでSDLアプリケーションをビルドし実行することに成功した人達もいる.

SDL 1.2.5以降にはWindows CE用のプロジェクトファイルとSDL 1.2のビルドの情報が含まれている. ソースアーカイブのREADME.WinCEに詳細な情報がある.

SDL 2.0はWindows CEには対応していない.

Visual C++

Visual C++でSDLを使うには?

SDL Visual C++ 開発ライブラリのアーカイブ, またはSDLソースアーカイブに含まれる"VisualC.html"を読むこと.

Visual C++で "fatal error C1083: Cannot open include file: 'windows.h': No such file or directory" が発生する

ここに書かれているように, プラットフォームSDKをインストールする必要がある: http://msdn.microsoft.com/vstudio/express/visualc/usingpsdk/

Visual C++でMSVCRT.LIBまたはLIBCとのリンクエラーが発生する

SDLはMicrosoft Visual C++ランタイムのマルチスレッド版を動的にリンクしている. プロジェクトのプロパティで, C++タブを選択して, リストボックスの「コード生成」の設定し, ランタイムライブラリを「マルチスレッドDLL」に変更する必要がある. 全プロジェクトのアプリケーションがこのようになっていることを確認すること.

Visual C++ 5を使っているが, 次のエラーが発生する: SDL.lib : fatal error LNK1106: invalid file or disk full

これは, Visual C++ 5で最新のサービスパックに更新していない場合, SDLライブラリをリビルドすると発生する.

なぜSDL 1.2アプリケーションでVisual C++デバッガが使えないのか?

MSVCデバッガが働くようにするためには, SDL_Init()にSDL_INIT_NOPARACHUTEフラグを渡して呼ぶ必要がある. そうしないとデバッガは例外をトレースできず, 実行箇所を示すことなども行えない.

SDLアプリケーションをデバッグするとVisual C++デバッガが毎回フリーズするのはなぜか?

サーフェイスをロックしている間, DirectXドライバはシステムをロックしている. これを避けるため, 環境変数SDL_VIDEODRIVERにwindibを設定することでビデオドライバをGDIに設定できる. これはビデオとマウス/キーボード入力ドライバを変更する. 性能と機能が変わるが, アプリケーションをより簡単にデバッグすることができるようになる.

私のアプリケーションではデバッグメッセージのターミナルウィンドウが表示されない

このオプションであなたのアプリケーションにコンソールサブシステムをリンクすること: `/SUBSYSTEM:CONSOLE`

Win32 APIでコンソールの表示を選択させることもできる:

#include "SDL.h"
#include <stdio.h>
#include <string.h>
#include <windows.h>

static void create_console(void) {
    AllocConsole();
    freopen("CONIN$", "r", stdin);
    freopen("CONOUT$", "w", stdout);
    freopen("CONOUT$", "w", stderr);
}

int main(int argc, char *argv[]) {
    if (strcmp(argv[1], "--debug") == 0) {
        create_console();
    }
    /* ... ここに秘密のソースを書き込むこと */
    return 0;
}

gcc

WindowsのgccでSDLを使うには?

ネイティブでビルドするならばCygwin, MSYS2, MinGW, または他の環境でWindowsを対象としたクロスコンパイラでビルドすることもできる. これらの環境を構築するためのドキュメントはhttp://www.libsdl.org/extras/win32/gcc.htmlにある. 環境を構築すれば, UNIXのようにアプリケーションをビルドできるようになる. この環境でアプリケーションをビルドするための詳細はLinux FAQを参照すること.

Dev-C++

Dev-C++でSDLを使うには?

the Dev-C++のチュートリアルを参照すること: http://cone3d.gamedev.net/cgi-bin/index.pl?page=tutorials/gfxsdl/tut1 (アーカイブ) 問題が発生したときは, このチュートリアルの作成者に連絡してほしい.

別の段階的な説明もある: http://docs.deninet.com/sdl_on_dev_c.htm (アーカイブ)

プロジェクトのパラメータの"console application"を選択すると, Vistaではプログラムの生成で必ずクラッシュする

Vistaでコンパイルするときは, "console application"の代わりに"gui application"を選択すること.

MinGW

私のアプリケーションではデバッグメッセージのターミナルウィンドウが表示されない

pkg-config, またはSDL2 CMakeスクリプトを使用しているならば, 常に`-mwindows`がリンクオプションに加えられる. このオプションはWindowsローダにアプリケーションが`WinMain`から始まることを指示し, コンソールウィンドウを表示しない.

`-mwindows`を取り除く方法はビルドシステムによって異なる:
CMaakeの場合, CMake変数`SDL2_NO_MWINDOWS`を設定すると`find_package(SDL2)`を呼ぶ前に`-mwindows`がリンクオプションから削除される.
pkg-configの場合, 代わりに`$(pkg-config sdl2 --libs-only-L --libs-only-l)`とする.
sdl2-configの場合, `sed`で`-mwindows`を取り除く: `$(sdl2-config --libs | sed -E s/-mwindows//)`

`-mwindows`がない場合, SDL_Init()の前にSDL_SetMainReady()を呼ばなければならない. `SDL2_main`内の`WinMain`シンボルはもう使わないためである.

コンソールウィンドウの生成を選択することもできる. Visual C++の欄を参照すること.

その他

"Undefined reference to 'SDL_main'"が発生する...

main()が次のように宣言されていることを確認する:

#include "SDL.h"

int main(int argc, char *argv[])

Windowsアプリケーションであるが, WinMain()の代わりにmain()を使わなければならない. なぜならば, SDLはあなたのメインコードを呼ぶ前にSDLの初期化をWinMain()で行っているからである. 何らかの理由でWinMain()を使う必要があるならば, SDLが正しく動作するためにはWinMain()でどのような初期化が必要かをsrc/main/win32/SDL_main.cから見つけること.

以下の様な警告/エラーメッセージの場合もこの方法で回避できる: - found main and WinMain; defaulting to /subsystem:console - found both wmain and main; using latter

"Undefined reference to 'WinMain@16'"が発生する

Visual C++ではSDL2main.libをリンクする必要がある. Dev-C++を含むgcc環境では, "sdl-config --libs" の出力結果をリンクする必要がある. 通常は次のようである: -lmingw32 -lSDL2main -lSDL2 -mwindows

vcpkgのSDL2main.libはmanual-linkフォルダに移されるので, 手動でリンカに追加する必要がある. 詳細はvcpkgの総合ドキュメントを読むこと.

"Undefined reference to 'main'"(または'_main')が発生する

CMakeを使う場合, add_executableにWIN32を忘れずに追加すること. MinGWを使う場合, -mwindowsをリンクオプションに追加すること. MSVCユーザは/subsystem:windowsを追加すること. clang-clユーザは -Xlinker /subsystem:windows を追加すること.

様々な未定義のSDL関数がある...

gccでコンパイルしているならば, コマンドラインのあなたのソースコードの後にsdl2-configの出力があることを確認する: gcc -o test test.c sdl2-config --cflags --libs

SDL2_imageやSDL2_mixerの未定義の関数がある場合は, これらのライブラリが正しくリンクされていることを確認する.

SDL Wikiへのリンク

FAQ: Windows - SDL Wiki