じゃあ、さっそく、
ダウンロードのページに行って、SFML の SDK をダウンロードしようぜ!
GCC 用のバイナリをゲットするのだ。
世間には Windows用の GCC がいくつもあって、しかも互換性がありません
(例外の仕組みが違う……スレッドのモデルが異なる……などなど)。
なので、SFML の SDK は、
キミが使ってる GCC に合うものをダウンロードしてね!
え、どんな GCC を使ってるのか、わからないって? そんなときは、"MinGW/bin" フォルダーを見てみてね。
その中に入ってるのは "libgcc_s_sjlj-1.dll" かな? それとも "libgcc_s_dw2-1.dll" かな?
または、MinGW を Code::Blocks と一緒にインストールしたんだったら、きっとキミの GCC は SJLJ だと思うよ。
うーん、どれも当てはまらない? ということは、SFML の公式サイトに置いてある バイナリの中には、
キミの GCC に合うものがないのかもしれないね。
でも大丈夫! まだ奥の手があるんだ。それは……SFML そのものをキミの環境に合うように
ソースからコンパイルするんだ! 恐れるな!
突き進むんだ!
さて、ダウンロードしたら、どこでも好きな場所に展開してね。
だけど、ヘッダーとライブラリを MinGW をインストールした場所にコピーするのはデンジャラスだぜ?
どこか別の場所に分けておくと、用途に合わせて複数のバージョンを共存させられてクールなのであります。
どんな種類のプロジェクトを作ろうかな?
Code::Blocks でプロジェクトを作ろうとすると、いろーんなプロジェクトが表示されるから、目移りしちゃうね!
その中に……おっと、"SFML project" なんてものがあるじゃないか! いやっほーい!
だが使うな! ずーっと昔に作られたまま更新されてないので、最新の SFML とは互換性がないっぽいのです。
そういうわけで、おしとやかに無印の C++ プロジェクトを作ることにしましょう。何も言わずに "Console Application" を選択だ。
なになに? コンソールを消したい?
じゃあ、プロジェクトを作った後、プロジェクト名を右クリックして "Properties" をクリック。
"Build targets" タブを開いて、"Console application" を "GUI application" に変更だ!
さて、次は コンパイラさんに SFML のヘッダーさんたち( ****.hpp のファイル群)がどこにいるのかを教えてあげよう。
リンカさんには SFML のライブラリさんたち( *****.a のファイル群)の場所を教えてあげるよ。
プロジェクト名を右クリックして "Build options" をクリック。
"Search directories" のタブを開く。
SFML のヘッダーさんたちの居場所( [SFML を設置したパス]/include)を "Compiler" のところに 追加(Add)。
SFML のライブラリさんたちの居場所( [SFML を設置したパス]/lib)を "Compiler" のところに 追加(Add)。
画面左のリストで、Debug と Release に分かれてるけど、ここでは、その上にある「プロジェクト名」を選んだ状態にしておこう。
そうすると、設定内容は Debug と Release の両方に反映されるよ。
※訳註
日本語を含むパスは認識されないようです。
次のステップは、キミがソースコードの中で使うライブラリ("****.a" のファイル)をアプリケーションにリンクする設定だよ。
SFML には5つのモジュールがあるんだ(システム、ウィンドウ、グラフィックス、ネットワーク、オーディオ)。
プロジェクト名を右クリックして "Buils options" を選択。
"Linker settings" タブを開いて、"Link libraries" に、必要なライブラリを全て追加するよ。
"Add" ボタンを押すとファイルを選択するダイアログが出るから、該当するライブラリ名を入力してね。
たとえばグラフィックスモジュールなら "sfml-graphics"、ウィンドウモジュールなら "sfml-window"。
実際のライブラリファイル名の冒頭の "lib" と、拡張子 ".a" を省略した文字列だよ。
デバッグモードとリリースモードとで、リンクするべきライブラリが異なります。
"sfml-xxx-d" は デバッグ用。 "sfml-xxx" はリリース用だよ。混ぜないで!
複数の ライブラリをリンクする場合、順番に気をつけてください。
ルールは、こうです。
他のライブラリに依存しているライブラリは、リストの頭の方に配置。
SFML のライブラリは、どれも、"sfml-system" に依存してます。
そして、"sfml-graphics" は "sfml-window" に依存してます。
なので、この3つの正しい並び方は上から順に "sfml-graphics"、"sfml-window"、"sfml-system" です。
上のスクリーンショットをよく見てね。
ところで実は、今までしてきた設定は、SFML のライブラリに
動的リンクする設定なのです。
実行するときに DLL が必要になる、あのタイプです。
DLL とは縁を切って、実行ファイルに SFML を混ぜ混ぜしたい? そんなときは
静的リンク用のライブラリファイルを使うんだ。
静的リンク用の SFML ライブラリは、 ファイル名のお尻に "-s" がついてるよ。
つまり "sfml-xxx-s-d" がデバッグ用。 "sfml-xxx-s" がリリース用ということだね。
それともう1つ。
"SFML_STATIC" というマクロをプロジェクトのプリプロセッサの設定に追加してあげてね。
この状態でビルドすると、静的リンクになるよ。
SFML2.2 からの変更点! スタティックリンクをするときには、SFML が依存しているライブラリもアナタのプロジェクトに設定してあげる必要があります。
たとえば、sfml-window-s または sfml-window-s-d を使う場合、opengl32 と winmm と gdi32 もリンクしてあげてね。
こうした依存ライブラリは "継承の値"(※) に自動的に含まれてるかもしれません。でも! 敢えてアナタの手で設定しておけば確実です。
※ 訳註
この箇所は
Visual Studio の場合 とほぼ同文です(原文が)。
"継承の値" という項目は Visual Studio にはあるのですが、Code::Blocks ではどの設定項目に該当するのか、わかりませんでした。
おそらくチュートリアルの原文が Visual Studio のページを流用して書かれ、その際に残存した記述なのではないかと思っています。違ってたらごめんなさい。
SFML の各モジュールが依存しているライブラリの一覧表です。
デバッグビルド用の SFMLモジュールはモジュール名の後ろに "-d" をつけてね(
上記参照)。
SFML のモジュール
|
依存しているライブラリ
|
sfml-system-s |
|
sfml-network-s |
|
sfml-audio-s |
- sfml-system-s
- flac
- ogg
- vorbis
- vorbisenc
- vorbisfile
- openal32
|
sfml-window-s |
- sfml-system-s
- opengl32
- gdi32
- winmm
|
sfml-graphics-s |
- sfml-window-s
- sfml-system-s
- freetype
- jpeg
- opengl32
|
上の表を見て気付いたかもですが、SFML のモジュール同士で依存し合ってたりもします。
例えば、sfml-graphics-s は sfml-window-s と sfml-system-s に依存してます。
SFML をスタティックリンクで使うときには、使おうとしているモジュールの依存ライブラリだけでなく、
「依存ライブラリの依存ライブラリ」 もリンクするように気をつけてください。依存関係の連鎖がどこかで切れてるとリンカーエラーになってしまいます。
ちなみに Code::Blocks は内部で GCC を使っているので、リンクの順番には意味があります。
他のライブラリに依存しているライブラリは、ライブラリリストの中で、依存相手のライブラリ名よりも先に(上に)しておく必要があります。
このルールに従わないとリンカーエラーになってしまいます。(
上記参照)
ちょっとわかりにくかったかな? でも心配ない! スタティックリンクの話でビギナーが混乱するのはいたってノーマルなことです。
実際にやってみて、一回でうまくいかなくても、ここで読んだことを心に留めて何回もトライしよう!
どうしてもうまくいかないときは
FAQ や
フォーラムをチェックだ。
動的リンクと静的リンクの違いを知らないお友達は、検索エンジンで調べてみてね!
ちなみに、動的リンクは共有ライブラリとも呼ばれてるよ。
さて、そんなわけで、プロジェクトの設定は完了だよ。
そして、お待ちかね。サンプルコードの時間でーす! わーわー、ぱちぱちぱち。
プロジェクトに "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;
}
ファイルに上のサンプルを書くか、またはコピペしたら、コンパイル。
動的リンクで SFML を使ってるなら、SFML の DLL を実行ファイルのあるフォルダにコピーするのを忘れないでね!
(DLL は SFML を解凍したフォルダの "/bin" フォルダの中だよ)
さぁ、実行だ!
こんなウィンドウさん↓ 出てきてー! お願いー!
ところで、オーディオモジュール(sfml-audio)を使うときには、さらに別の DLL も必要なんだ。"OpenAL32.dll" です。
SFML を解凍したフォルダの "/bin" フォルダに入ってるので、実行ファイルと同じフォルダにコピーしてあげてね。
これは、SFML を 静的リンクにしているときにも 動的リンクにしているときにも必要だよ。
※ 訳注 ※
SFML2.3 からは libsndfile-1.dll が不要になりました。