読者です 読者をやめる 読者になる 読者になる

やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

サブディレクトリに配置してコンパイルするMakefileを書いた

サブディレクトリに配置してもコンパイルできる方法を確認した。

window messagebox

入手先

GitHub MEGA

開発環境

ライブラリ

環境変数のPathに各DLLがあるディレクトリパスを追記することでexeを実行できる。

前回まで

  1. MinGWでコンパイルできる環境が整った。
  2. さらにGTKmm3ライブラリも揃った。
  3. 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ファイルを分けるだけのディレクトリ構成なんて、ライブラリを作成するプロジェクトでもない限りほとんど意味ないのでは? 実際は機能ごとにディレクトリを分けるなど、もっと複雑なものになるだろう。