まず、ダウンロードのページから SFML の SDK をダウンロードしてね。
SFML は SFMLで、分けておくのがよさげです。違うバージョンのを共存させられるようにもなるし、その方がいい感じですよね?
アプリケーションの種類は何がいいかな?
もちろん「Win32 アプリケーション」だよね。コンソール画面が欲しかったら「コンソールアプリケーション」でもいいのかも。
あと「空のプロジェクト」をチェックしておくと、自動生成される鬱陶しいコードに悩まされなくて済むよ。
じゃあ、そんなわけで、「main.cpp」というファイルをプロジェクトに作ってください。 なんでかって? チュートリアルなんで、黙って言うこと聞いてください。
(これで、VisualStudio が 「C++のプロジェクトなんだ(C言語じゃなく)」と理解してくれます)
では、SFML のヘッダーとライブラリのパスを設定しましょう。
(ヘッダーは .hppのファイル、ライブラリは .lib のファイルです)
プロジェクトのプロパティ設定画面を開いて、下記のように設定します。
・ヘッダーファイルを置いたフォルダを登録:
C++ > 全般 > 追加のインクルードディレクトリ
・ライブラリを置いたフォルダを登録:
リンカー > 全般 > 追加のライブラリディレクトリ
上記2つのパスはデバッグモードでもリリースモードでも同じです。
なので、構成を「全ての構成」にした状態で設定しても問題なしです。
次のステップ。
必要なライブラリ(.lib のファイル)をリンクしましょう。
SFMLには5つのモジュールがあります。
(システム、ウィンドウ、グラフィックス、オーディオ、ネットワーク)
各モジュールごとに、1つずつ libファイルがあります。
設定は「リンカー > 入力 > 追加の依存ファイル」に書き込みます。
アナタが使いたい機能のモジュールのライブラリをリンクしてね(全部必要とは限らない)。
実行時に DLL が必要なのがイヤだったら、スタティック版のを使ってください。 ファイル名に「-s」がついているやつがスタティック版です。
スタティック&デバッグ版は「sfml-モジュール名-s-d.lib」。
スタティック&リリース版は「sfml-モジュール名-s.lib」。
スタティック版を使う場合は、もう1つ設定が必要です。
プリプロセッサの設定に「SFML_STATIC」マクロを追加してください。
C/C++ > プリプロセッサ > プリプロセッサの定義
SFML の各モジュールが依存しているライブラリの一覧表です。
デバッグビルド用の SFMLモジュールはモジュール名の後ろに "-d" をつけてね(上記参照)。
上の表を見て気付いたかもですが、SFML のモジュール同士で依存し合ってたりもします。 例えば、sfml-graphics-s.lib は sfml-window-s.lib と sfml-system-s.lib に依存してます。 SFML をスタティックリンクで使うときには、使おうとしているモジュールの依存ライブラリだけでなく、 「依存ライブラリの依存ライブラリ」 もリンクするように気をつけてください。依存関係の連鎖がどこかで切れてるとリンカーエラーになってしまいます。
ちょっとわかりにくかったかな? でも心配ない! スタティックリンクの話でビギナーが混乱するのはいたってノーマルなことです。 実際にやってみて、一回でうまくいかなくても、ここで読んだことを心に留めて何回もトライしよう! どうしてもうまくいかないときは FAQ や フォーラムをチェックだ。
ダイナミックリンクライブラリとスタティックリンクライブラリの違いをご存知じゃないキミは、 検索エンジンに聞いてみてね。
(ちなみに、ダイナミックリンクライブラリは「共有ライブラリ」とも言います)
そんなわけで設定完了だよ! レッツ動作確認!
main.cpp ファイルに、下記のサンプルを入力してね。
さて、ビルドの前に sfml-main モジュールをリンクしてくださいませ。 やり方は他のモジュールのときと同じです。 (デバッグモードなら sfml-main-d.libを、リリースモードなら sfml-main.lib をリンク)
ではビルドしてみましょう。ダイナミックリンクライブラリを使ってる場合は DLL を実行ファイルと同じフォルダに置くのを忘れないでね。 (DLLファイルは SFML を解凍したフォルダの「bin」に入ってるよ)
ビルドが終わったら実行。問題なければ、↓のように表示されるはずだよ。
最後に、オーディオモジュール(sfml-audio)を使うときの注意点です。
オーディオモジュールは、さらに別の外部ライブラリを使ってます。 なので、オーディオモジュールを使うときには、そのライブラリも一緒に入れてあげないといけません。
(スタティックリンクのときも、ダイナミックリンクのときも同じ)
必要なファイルは「OpenAL32.dll」です。
SFMLを解凍したフォルダの「bin」に入ってます。
実行ファイルと同じフォルダにコピーしてあげてください。
あなたの使ってる VisualStudio のバージョンに合うパッケージをダウンロードしてね。
じゃないとコンパイルできないよ。
たとえば、VC++ 10 (Visual Studio 2010) と VC++ 12 (Visual Studio 2013) は互換性がありません。
もし、合うバージョンがないときは、SFML自体を自力でコンパイルしてね。
ダウンロードできた? じゃあ、好きな場所に解凍するといいよ。
ちなみに、ヘッダーとライブラリを、VsualStudio をインストールしてある場所に直接入れるのはおススメできませんです。SFML は SFMLで、分けておくのがよさげです。違うバージョンのを共存させられるようにもなるし、その方がいい感じですよね?
アプリケーションの種類は何がいいかな?
もちろん「Win32 アプリケーション」だよね。コンソール画面が欲しかったら「コンソールアプリケーション」でもいいのかも。
あと「空のプロジェクト」をチェックしておくと、自動生成される鬱陶しいコードに悩まされなくて済むよ。
じゃあ、そんなわけで、「main.cpp」というファイルをプロジェクトに作ってください。 なんでかって? チュートリアルなんで、黙って言うこと聞いてください。
(これで、VisualStudio が 「C++のプロジェクトなんだ(C言語じゃなく)」と理解してくれます)
では、SFML のヘッダーとライブラリのパスを設定しましょう。
(ヘッダーは .hppのファイル、ライブラリは .lib のファイルです)
プロジェクトのプロパティ設定画面を開いて、下記のように設定します。
・ヘッダーファイルを置いたフォルダを登録:
C++ > 全般 > 追加のインクルードディレクトリ
・ライブラリを置いたフォルダを登録:
リンカー > 全般 > 追加のライブラリディレクトリ
上記2つのパスはデバッグモードでもリリースモードでも同じです。
なので、構成を「全ての構成」にした状態で設定しても問題なしです。
次のステップ。
必要なライブラリ(.lib のファイル)をリンクしましょう。
SFMLには5つのモジュールがあります。
(システム、ウィンドウ、グラフィックス、オーディオ、ネットワーク)
各モジュールごとに、1つずつ libファイルがあります。
[モジュールと Libファイルの対応表] | ||||
モジュール | デバッグ(DLL) | デバッグ(スタティック) | リリース(DLL) | リリース(スタティック) |
システム | sfml-system-d.lib | sfml-system-d-s.lib | sfml-system.lib | sfml-system-s.lib |
ウィンドウ | sfml-window-d.lib | sfml-window-d-s.lib | sfml-window.lib | sfml-window-s.lib |
グラフィクス | sfml-graphics-d.lib | sfml-graphics-d-s.lib | sfml-graphics.lib | sfml-graphics-s.lib |
オーディオ | sfml-audio-d.lib | sfml-audio-d-s.lib | sfml-audio.lib | sfml-audio-s.lib |
ネットワーク | sfml-network-d.lib | sfml-network-d-s.lib | sfml-network.lib | sfml-network-s.lib |
設定は「リンカー > 入力 > 追加の依存ファイル」に書き込みます。
アナタが使いたい機能のモジュールのライブラリをリンクしてね(全部必要とは限らない)。
デバッグモードとリリースモードとで、リンクするLibファイルが異なります。
「sfml-モジュール名-d.lib」というファイルはデバッグ用。
「sfml-モジュール名.lib」というファイルはリリース用です。
上記掲載の対応表をよく見てね。混ぜるな危険!
上の表にもあるように、ライブラリにはDLL版とスタティック版があります。「sfml-モジュール名-d.lib」というファイルはデバッグ用。
「sfml-モジュール名.lib」というファイルはリリース用です。
上記掲載の対応表をよく見てね。混ぜるな危険!
実行時に DLL が必要なのがイヤだったら、スタティック版のを使ってください。 ファイル名に「-s」がついているやつがスタティック版です。
スタティック&デバッグ版は「sfml-モジュール名-s-d.lib」。
スタティック&リリース版は「sfml-モジュール名-s.lib」。
スタティック版を使う場合は、もう1つ設定が必要です。
プリプロセッサの設定に「SFML_STATIC」マクロを追加してください。
C/C++ > プリプロセッサ > プリプロセッサの定義
SFML2.2 以降の変更点! スタティックリンクをするときには、SFML が依存しているライブラリも全て、アナタのプロジェクトに設定してあげる必要があります。
たとえば、sfml-window-s.lib または sfml-window-s-d.lib を使う場合、opengl32.lib と winmm.lib と gdi32.lib もリンクしてあげてね。
こうした依存ライブラリは "継承の値" に自動的に含まれてるかもしれません。でも! 敢えてアナタの手で設定しておけば確実です。
※ 訳註 ※
「継承の値」 の場所(↓のダイアログの下半分)
プロパティ > リンカー > 入力 > 追加の依存ファイル > 編集
※ 訳註 ※
「継承の値」 の場所(↓のダイアログの下半分)
プロパティ > リンカー > 入力 > 追加の依存ファイル > 編集
SFML の各モジュールが依存しているライブラリの一覧表です。
デバッグビルド用の SFMLモジュールはモジュール名の後ろに "-d" をつけてね(上記参照)。
SFML のモジュール | 依存しているライブラリ |
sfml-graphics-s.lib |
|
sfml-window-s.lib |
|
sfml-audio-s.lib |
|
sfml-network-s.lib |
|
sfml-system-s.lib |
|
上の表を見て気付いたかもですが、SFML のモジュール同士で依存し合ってたりもします。 例えば、sfml-graphics-s.lib は sfml-window-s.lib と sfml-system-s.lib に依存してます。 SFML をスタティックリンクで使うときには、使おうとしているモジュールの依存ライブラリだけでなく、 「依存ライブラリの依存ライブラリ」 もリンクするように気をつけてください。依存関係の連鎖がどこかで切れてるとリンカーエラーになってしまいます。
ちょっとわかりにくかったかな? でも心配ない! スタティックリンクの話でビギナーが混乱するのはいたってノーマルなことです。 実際にやってみて、一回でうまくいかなくても、ここで読んだことを心に留めて何回もトライしよう! どうしてもうまくいかないときは FAQ や フォーラムをチェックだ。
※ 訳注 ※
ランタイムライブラリを「マルチスレッド(/MT)」にしていると、スタティックリンクに失敗します。
なぜかと言うと、SFML の lib ファイルが「マルチスレッド(/DLL)」でビルドされているからです。ここをそろえておかないとエラーになる。
「マルチスレッド(/MT)」でビルドしたい場合は、SFML の lib ファイルをソースから自分でビルドしなおす必要があります。 別のページにやり方をまとめてあります ( → SFML をマルチスレッド(/MT) でビルド)。
ランタイムライブラリを「マルチスレッド(/MT)」にしていると、スタティックリンクに失敗します。
なぜかと言うと、SFML の lib ファイルが「マルチスレッド(/DLL)」でビルドされているからです。ここをそろえておかないとエラーになる。
「マルチスレッド(/MT)」でビルドしたい場合は、SFML の lib ファイルをソースから自分でビルドしなおす必要があります。 別のページにやり方をまとめてあります ( → SFML をマルチスレッド(/MT) でビルド)。
ダイナミックリンクライブラリとスタティックリンクライブラリの違いをご存知じゃないキミは、 検索エンジンに聞いてみてね。
(ちなみに、ダイナミックリンクライブラリは「共有ライブラリ」とも言います)
そんなわけで設定完了だよ! レッツ動作確認!
main.cpp ファイルに、下記のサンプルを入力してね。
#include <SFML/Graphics.hpp> int main() { sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!"); sf::CircleShape shape(100.f); shape.setFillColor(sf::Color::Green); while (window.isOpen()) { sf::Event event; while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) window.close(); } window.clear(); window.draw(shape); window.display(); } return 0; }このサンプルでは関数名が main だけど、プロジェクトを作るときにウィンドウアプリケーションを選択してたら、関数名は WinMain にしてね。 でもそれって Windowsの仕様だから、Linux とか Mac とか、他の環境では同じコードはコンパイルできません。 だから SFMLでは main 関数も使えるようにしてあるのさー。スタンダード!
さて、ビルドの前に sfml-main モジュールをリンクしてくださいませ。 やり方は他のモジュールのときと同じです。 (デバッグモードなら sfml-main-d.libを、リリースモードなら sfml-main.lib をリンク)
ではビルドしてみましょう。ダイナミックリンクライブラリを使ってる場合は DLL を実行ファイルと同じフォルダに置くのを忘れないでね。 (DLLファイルは SFML を解凍したフォルダの「bin」に入ってるよ)
ビルドが終わったら実行。問題なければ、↓のように表示されるはずだよ。
最後に、オーディオモジュール(sfml-audio)を使うときの注意点です。
オーディオモジュールは、さらに別の外部ライブラリを使ってます。 なので、オーディオモジュールを使うときには、そのライブラリも一緒に入れてあげないといけません。
(スタティックリンクのときも、ダイナミックリンクのときも同じ)
必要なファイルは「OpenAL32.dll」です。
SFMLを解凍したフォルダの「bin」に入ってます。
実行ファイルと同じフォルダにコピーしてあげてください。