2011年7月12日火曜日

makefile ~SoralisとLinuxの狭間で~

コンパイルする時にとても便利な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"に変更。

$ make sconv

今度は問題なくコンパイル完了。


たったこれだけ・・・。


もともとC++の拡張子は".C"や".cc"だったらしいが、

「拡張子は3文字」というWindowsの考えから".cpp"や".CPP"が生まれたらしいです[1]。

そういった歴史から、今使っているシステムのSolaris makeでは、

".cpp"をソースとして認識されなかったのだと思います。


書き方については、他にも色々ルールがあるようで、make.rulesに載っています。
ちなみにmake.rules は、
$ man make
で調べてね。

参考ページ
[1]「C++の拡張子で.cppと.ccでは何が違うのですか????」
アクセス日(2011/07/12)

0 件のコメント:

コメントを投稿