次のやつでluaを使おうと思っているんですけど、C++と一緒に組み込みの言語を触るなら、なるべく同じエディタで見れた方が良いと思いまして、VC++を使うよりも、Emacsとかを使った方がいいんじゃないかなーと思ったのが事の発端でした。
自分の開発スピードとしても、やっぱEmacs使った方が早そうですし。
つーことで、最初はボーランドのbcc(C++ Compiler 5.5)を使おうとチャレンジ。
Makefileを書いたり頑張った後、コンパイルしたところで、luaのlibファイルが使えない事に気づく。VC++でコンパイルされているため、ボーランドからは使えないんだそうな。
ということで、luaを頑張ってコンパイルして、膨大に出てきたobjをちまちまくっつける作業をこれまた頑張ってやって、なんとかコンパイルできるようになる。
……が、使おうと思ってたirrlichtまでコンパイルせざるをえない状況に追い込まれたっぽくて、挫折。
しかたない諦めてVC++でやるか…いやだなー……と思ってたら、ふと思い出しました。
あれ、VC++って確かコンパイラがコマンドラインから使えなかったっけ?
検索かけると、cl.exeとかいうのでコンパイルできるらしい。
小ネタで言うと、vcvars32.batとかいうファイルがあって、これをコマンドプロンプト打って実行しないと、stdio.hが無いとか言って怒られたりします。
そんなこんなで、Makefileを書きなおす。
clはコンパイラのオプションが結構違うので、苦戦。そしてライブラリが通らない…。
仕方ないので、コマンドラインにべた打ちしてみる…けどそれでも動かない!
と思ったら、あれですね、ライブラリ名間違えてましたwww
あの3時間は一体なんだったんだ…。
動いたので、今度はちゃんとMakefileを書いてみるけれど、これまたうまくいかない!
test.cpp(1) : fatal error C1083: include ファイルを開けません。'stdio.h': Invalid argument
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\cl.EXE"' : リターン コード '0x2'
Stop.
stdio.hが無いってなんなの?
ちゃんとvcvars32やってもダメだし、Makefileの中にvcvars32にもぐりこませても全然ダメだし…。
うーん、詰んでるなぁ…。
追記:分かった。
まずMakefileを見せましょう。
# 作業ディレクトリ
DIR = C:\project\game
# コンパイラ
CC = cl
# luaのヘッダがあるするフォルダのパス
INCLUDEA = -I$(DIR)\lua5.1\include
# ライブラリがあるフォルダのパスとライブラリ
LIBPATHA = -libpath:$(DIR)\lua5.1\lib
LIBA = lua5.1.lib
# ソース
SRC = test.cpp
# 出力ファイル
TARGET = test.exe
ALL : $(TARGET)
# exeファイルの生成
$(TARGET):
$(CC) $(INCLUDEA) $(LIBA) $(SRC) -link $(LIBPATHA)
最小のMakefileだとこんな感じかな。実際はお掃除とかあってごちゃごちゃしてるんだけど、必要な部分のみ。
で、もう眠いのでいきなり種明かしなんだけど、INCLUDE、LIBPATH、LIBの三つはもともと勝手にコマンドプロンプト側(っていうか設定したのはvcvars32か)が環境設定しているので、=記号で代入して中身を新しいものにクリアしてしまうと死にます。
なので、上の例ではINCLUDEをINCLUDEAとかいう名前に変えて使ってます。スマートなやり方としては、INCLUDEに追加する形がいいのかな。
なんでこんなことに気付かなかったんだろう…。