コンパイルする時にとても便利なmakefileについてです。
基本的には、Ubuntuで書いて、動作させているのですが、
データの都合上、Solarisで動作させなければならなくなりました。
頻繁に修正もしたいので、Solaris上でコンパイルできないと困ります。
そこでネックとなったのが、make違い。
Ubuntuでは、GNU Make 3.81
Solarisでは、Solaris make
コンパイルしたい対象は、C++で書いたソースプログラム。
私が書いていたmakefileは色々省くと、つまるところ、以下のように集約されます。
sconv : sconv.cpp taio.o
CC $^ -o $@ -lm
taio.o : taio.cpp taio.h
CC -c $< -o $@
なおUbuntu上ではg++でコンパイルでき、動作も確認済みです。
さぁいよいよコンパイル!
$ make sconv
CC -c -o taio.o
CC: No input files specified
*** Error code 1
make: Fatal error: Command failed for target `taio.o'
ここままでは、"$<"が空になってしまい、taio.oのコンパイルができませんでした。
・・・
・・・
原因を探ること20分。
そして発見!
C++の拡張子は一般的に以下の3つ。
".C", ".cc", ".cpp"
しかし、make.rulesのマクロ SUFFIXESには、".cpp"が含まれていない!!
ということで、ソースプログラムの拡張子を".cpp"から".cc"に変更。
さらにmakefile内の".cpp"も".cc"に変更。
今度は問題なくコンパイル完了。
たったこれだけ・・・。
もともとC++の拡張子は".C"や".cc"だったらしいが、
「拡張子は3文字」というWindowsの考えから".cpp"や".CPP"が生まれたらしいです[1]。
そういった歴史から、今使っているシステムのSolaris makeでは、
".cpp"をソースとして認識されなかったのだと思います。
書き方については、他にも色々ルールがあるようで、make.rulesに載っています。
ちなみにmake.rules は、
$ man make
で調べてね。
参考ページ
[1]「C++の拡張子で.cppと.ccでは何が違うのですか????」
アクセス日(2011/07/12)