makefile を作ってみる

makefile を作ってみたのでちょっと内容をメモしておきます。詳しいことは全然わかってないですが、そして、超絶単純な C アプリですが、とりあえずメモだけ・・・

1.ソースの用意


makefile 作ることが目的なのでソースは簡単なもので。

■ test.c

#include <stdio.h>

void test()
{
  printf("test !!\n");
}

■ main.c

#include <stdio.h>

void main()
{
  test();
}


2.makefile の作成


test.c から共有ライブラリ libtest.so を作って、main.clibtest.so に依存するのでターゲット main の箇所には main.c に加えて libtest.so も書く感じで。

makefile

main: main.c libtest.so
        gcc -L./ -o main main.c -ltest

libtest.so: test.c
        gcc -shared -o libtest.so test.c


3.make コマンドの実行


ちゃんと libtest.somain が作成されている。

# make
gcc -shared -o libtest.so test.c
gcc -L./ -o main main.c -ltest
# ls
libtest.so  main  main.c  makefile  test.c
# ./main
test !!

環境変数 LD_LIBRARY_PATH に libtest.so のディレクトリを設定しておく。


ちなみに make は関連するファイルに更新があった場合のみコンパイル等が行なわれるらしく、特に main.c、test.c を更新せずに再度 make 実行すると以下のようになる。

# make
make: `main' は更新済みです

main.c だけ更新するとターゲット main のコマンドだけが実行される。

# make
gcc -L./ -o main main.c -ltest

あと、特に引数ナシで make 実行した場合、おそらく一番上のターゲットだけが実行されるっぽい。例えば、以下のようにターゲットを入れ替えると libtest.so しか実行されない。
makefile

libtest.so: test.c
        gcc -shared -o libtest.so test.c

main: main.c libtest.so
        gcc -L./ -o main main.c -ltest
# make
gcc -shared -o libtest.so test.c

上記の makefile でターゲット main を実行したい場合は make main といったように引数にターゲット名を与えてやればいい。

# make main
gcc -shared -o libtest.so test.c
gcc -L./ -o main main.c -ltest
# ls
libtest.so  main  main.c  makefile  test.c


make のドキュメントは以下です。ここをちゃんと読まないといけませんね・・・

GNU make
https://www.gnu.org/software/make/manual/make.html


ひとまず今日のところは以上です。

[ 環境情報 ]
CentOS 6.2
GCC 4.4.7