C99 を VC でコンパイルする

[戻る]

先日, とあるプロジェクトをコンパイルする必要がありました. 手に入れたファイルは VC 用のようです. Express Edition を入手し nmake をかけてみると…

〜前略〜
hoge.c
hoge.c(100) : error C2143: 構文エラー : ';' が '型' の前にありません
hoge.c(110) : error C2065: 'n' : 定義されていない識別子です.
hoge.c(120) : error C2065: 'n' : 定義されていない識別子です.
hoge.c(130) : error C2065: 'n' : 定義されていない識別子です.
〜後略〜
などといったエラーが出ます. 該当部分を見ても特におかしそうではありません.

いろいろ悩んだ結果, 以下のことがわかりました.

つまり拡張子が c だと, (古い) c の文法に則ってコンパイルしようとし, 文法にあってないからエラーがでるわけです.

拡張子をすべて cpp に変更し Makefile を適当に返るとか, 古い c の文法に則った書式に書き換えるとかするのが王道でしょうが, 量が多いとか, あまり大々的な変更を加えたくはありません. というわけでいろいろ調べた結果, c++ 風にコンパイルしろという /Tp オプション を見つけました.

> cl.exe /Tp list2.c
と打てば無事, 拡張子が c のままでもコンパイルが通ります.

で, この知見を Makefile に反映させようと思ったのですが, nmake の書式は普通の make と若干違います. どこでコンパイルさせているのかも分かりません. で, いろいろ調べた結果, Makefile の適当な所に

.c.obj:
      $(CC) $(CFLAGS) $(COPT) /Tp $<
といったフレーズをもぐりこませればよいことが分かりました.

ただしこの手法は, 「拡張子が C だろうと C++ だと思ってコンパイルしろ」というオプションですので, 凝ったことしているとリンクとかうまくいかないかもしれません.


2011.1