サブディレクトリに配置してもコンパイルできる方法を確認した。
入手先
開発環境
- Windows XP Pro SP3 32bit
- MinGW 5.3.0
- g++ 5.3.0
ライブラリ
環境変数のPathに各DLLがあるディレクトリパスを追記することでexeを実行できる。
前回まで
- MinGWでコンパイルできる環境が整った。
- さらにGTKmm3ライブラリも揃った。
- HelloWorldまでやった。
Makefileでコンパイルする方法を以下のとおりに調べる。
実施 | パターン |
---|---|
● | 単体コード |
● | 複数コード |
● | 略記 |
未 | サブディレクトリ |
未 | Release/Debug切替 |
ソースコード
前回より一気に長くなった。でもポイントは関数を使っているところだけ。
関数
Makefileにも関数があるらしい。今回は以下のような関数を使った。
関数 | 例 | 説明 |
---|---|---|
wildcard | $(wildcard hoge/*.cc) |
カレントディレクトリ配下のhogeディレクトリ内にある、ファイル名の末尾が.cc のファイルパスを返す |
addprefix | $(addprefix src/,foo bar) |
src/foo ,src/bar が返ってくる。 |
notdir | $(notdir src/foo bar) |
foo ,bar が返ってくる。 |
他にもある。こちらを参照
ファイル名の一覧取得
sources = $(wildcard $(DirSrc)/*.cc)
objects = $(addprefix $(DirObj)/, $(notdir $(sources:.cc=.o)))
./src/*.cc
というファイルパスに該当するファイル一覧を取得する。
さらに、そこからobjectファイルパス一覧も作成している。
ファイル名をリテラルで書くのではなく、関数でやってくれる。だからファイル数が増えてもMakefileのコードは増えない。
コンパイル
$(DirObj)/%.o: $(DirSrc)/%.cc
-mkdir -p $(DirObj)
g++ -o $@ -c $< $(include) $(CompileOption)
前回までは以下のように書いていた部分。これと同じことをやっている。1つ分の記述で。
MainWindow.o:
g++ -c MainWindow.cc $(CompileOption)
program.o:
g++ -c program.cc $(CompileOption)
所感
今回の関数を使えばかなり簡略化できそう。 でも、Makefileが複雑になってしまった。
.cppと.hファイルを分けるだけのディレクトリ構成なんて、ライブラリを作成するプロジェクトでもない限りほとんど意味ないのでは? 実際は機能ごとにディレクトリを分けるなど、もっと複雑なものになるだろう。