目次 - FAQ - Windows

FAQ:Windows

全般

SDLを使う

何に対応しているか?

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

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

最新の情報はhttp://hg.libsdl.org/SDL/file/default/docs/README-platforms.mdを参照すること.

Windows 2000

Windows 2000を使っているが, SDL.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に設定できる. これはビデオとマウス/キーボード入力ドライバを変更する. 性能と機能が変わるが, アプリケーションをより簡単にデバッグすることができるようになる.

gcc

WindowsのgccでSDLを使うには?

ネイティブでビルドするならばCygwinまたはMiGW, または他の環境で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/MYSYS

MinGW/MYSYSでSDLを使うには?

MYSYS/MinGWチュートリアルを参照すること.

その他

"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から見つけること.

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

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

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

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

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

WindowsでSDL_WM_ToggleFullScreen()が動作しないのはなぜか?

フルスクリーンとウィンドウのモードを切り替えるSDL_WM_ToggleFullScreen()の動作は, アプリケーションからは透過的てある. ディスプレイのピクセルポインタが変わらない, ディスプレイのビット深度が変わらないなどである. これはWindowsは保障できない. しかし, 次の方法でフルスクリーンとウィンドウモードを簡単に変えられる:

flags ^= SDL_FULLSCREEN;
screen = SDL_SetVideoMode(..., flags);

stdout.txtとstderr.txtを作らないようにする方法は?

「SDLを使うVisual C++プロジェクトには, SDL_nostdioがあり, 望むならばこれをビルドできるはず」

「"NO_STDIO_REDIRECT"を定義しSDLを再コンパイルすれば, この問題は解決すると思う」(Bill Kendrickによる回答)

SDL Wikiへのリンク

FAQ: Windows - SDL Wiki