アットウィキロゴ

GNU Make

GNU Make


2008/6/20
 えー、あれ。
 コンパイルできたはいいけど、デバッグ情報のことすっかり忘れてた orz

 よく考えたらVCでステップデバッグできないじゃん!
 ということで、今日はVCでデバッグできるところまで。

 まず。コンパイルにオプションを付加する。

$(TARGET_OBJ_DIR)/%.obj : %.cpp
	cl -c -nologo -EHsc -GR -Zc:forScope -Zc:wchar_t \
	/Od /Zi /Fd"debug\vc90.pdb" \
	$(addprefix -I,$(INCLUDE_HEADER)) -Fo$@ $<

こんな感じ。

重要なのは、/Od と /Zi 。
/Od はコードの最適化を一切行わない設定で、
/Zi はデバッグ情報を出してくれる設定。
あと、/Fb"debug\vc90.pdb"
これは、デバッグ情報を出力するディレクトリを指定している。

これで、CLの方はOK

次はリンカ側

$(TARGET_EXE_FILES) : $(TARGET_OBJ_LIST_FILES)
	link -nologo -out:$@ $^ /debug \
		/SUBSYSTEM:WINDOWS /MACHINE:X86 /ERRORREPORT:PROMPT $(LIB_LIST)

んな感じ。

追加したのは、/debug だけ。デバッグだよって教えてあげる。

んで、make

んで、できあがった *.exe を、VCに食わせる。

んで、適当なソースを食わせて、ブレイクを張る。

んで、実行


ブレイクに止まったー!!(゜∀゜)キタワー

ということで完了。

これで無事、VCでステップデバッグできるようになりましたっと。


#はぁ、もう少ししたらプリコンパイルヘッダーとかもやんなきゃなー…
#リリースとデバッグでmakeの処理わけていかなきゃなー…メンドイナー
#はやくゲームを作るところまでいきたいなー…


2008/6/19
 えー、あんまりパターンルール理解してませんでした!

 依存ファイルに対して、ディレクトリ指定を考えるあまり、
 えらいことになっていましたが、

obj/%.obj : src/%.cpp
    cl.exe んたらかんたら

 こんな感じで書いてました。

 

 実際問題。

 依存ファイルに検索ディレクトリを指定できることに今さら気付く。

VPATH = src/ src/app src/system

 などとするとカレントディレクトリで見つからなかったらこっから探してくれるみたい。

 うーん。なるほど。便利。

 というわけで、パターンルールのとこが以下のように変更になりました!

$(TARGET_OBJ_DIR)/%.obj : %.cpp
    cl -c -nologo -EHsc -GR -Zc:forScope -Zc:wchar_t \
    $(addprefix -I,$(INCLUDE_HEADER)) -Fo$@ $<

これでターゲットに指定するのは、出力ディレクトリのみでよくなりました。

うーん。便利。いやすっきり。



2008/6/9
 ひとまず、DirectX9のライブラリをリンクして実行するところまで
 成功した。(VC使えば一瞬なんですがね…)

 で、ちょっと補足。

 ・Cygwinのターゲットとドライブ指定の問題
  これは、Cygwinのターゲットと依存ファイルを区別するために、
  :(コロン)が使われているためにそれが競合し、
  複数のターゲットを指定すんな!! ヽ(`д´)ノ
  と、怒られる。

  解決方法としては2つあり、
  ①Cygwinのバージョンを戻す(バージョン忘れたけど)
  ②C:/ の部分を、/cygdrive/c/ に置換する

  まぁ①はいいとして、②。
  問題になったのは、オブジェクトの依存関係ファイルを
  記述している いわゆるdepend ファイルだ。
  てなもんで、またまたSEDコマンドで置換。

   ※今回の置換は /(スラッシュ) を含むため正規表現を利用する
@sed s/C:\\//\\/cygdrive\\/c\\//g < [email protected] > $@
   こんな感じ。スラッシュを置換する対象として認識させるには \\/ と指定する。

 ・ライブラリの自動検索と、link.exe のライブラリ指定の問題
  何故か、カーネル関係のWindowsライブラリファイルは、
  link.exe にファイルまでしっかり指定してあげないといけない。
  ライブラリのあるディレクトリを指定すれば勝手に探してきてくれると思ったのに。

  一方、DirectX9のライブラリは、ディレクトリを指定すると、
  そこから自動でほしいファイルを検索して、リンクしてくれる。

  何故だ!!

  自動検索のディレクトリ指定方法は、以下のような感じで2種類ある。
   ①LIB環境変数にディレクトリを指定
   ②link.exe の -LIBPATH オプションにディレクトリを指定
    但し、LIB環境変数のほうが検索優先順位が高い。

  ①の方は問題ないが、②の方はMSDNにそう書いてあったので
  試してみると何故かうまく動かなかった。

 ・ライブラリのヘッダー自動検索パス指定方法の問題
  これは、clの場合は以下のような方法で指定できる。
   ①INCLUDE環境変数にディレクトリを指定
   ②cl.exe の -I オプションでディレクトリを指定

   これらは①も②も全て正常に動く。

   が、依存ファイルを生成する gcc には①を
   適用することができなかった。②はもちろんできる。

   そんなわけで、ライブラリのファイルも全て環境変数に逃がして、
   自動検索するようにすることもできず、ライブラリの
   ヘッダーも環境変数に逃がすことはできないことに。    


 とまぁそんな感じで諸問題がある。

 んなこんなでそれらを全部加味した上で以下のような環境にすることに決定。

LIB(*.lib)ファイル自体の指定はMakefileにもリストとして列挙。
LIB(*.lib)のあるディレクトリ指定は、環境変数LIBに設定する。
LIBヘッダー(*.h)のあるディレクトリ指定は、Makefileにリストとして列挙。

 ちょっと環境変数だったり、Makefileの変数だったりと散らばっている
 感があって個人的に気持ち悪いのだが、まぁ仕方ない。

 ひとまずこれで落ち着いた。

 これからはいよいよ、ゲーム部分を作っていくぞー。
 といっても、まずはシステム部分ですが('A';



2008/6/8
 今まで、VCに含まれているコマンドラインからMeadowを起動し、
 そこからシェルを走らせてコンパイルしていた。

 が、いい加減ちょっとこの辺を改善しようと思い、
 smashonline(以下:so)に必要な環境設定がバッチファイル一発で設定できるような
 環境を作ることに。

 soの環境起動の流れとしては以下のような感じ。


 ・登場人物

  so/tool/boot/soEnvBoot.bat
環境設定と、soCygwin.bat を起動するバッチファイル
  so/tool/boot/soCygwin.bat
Cygwinを起動と、vcvarsall.batを起動するバッチファイル。(Cygwin.batのクローン)
  VC/vcvarsall.bat
VCについてるVCのコンパイル環境設定をやってくれるバッチファイル。

 soEnvBoot.batを起動。
 (ユーザー作業としてはこれを起動するだけ。起動もめんどいから、スタートアップに登録w これで全自動(゜∀゜))
 ↓
 必要な環境変数を設定し、soCygwin.bat を起動
 ↓
 soCygwin.bat内からvcvarsall.batを起動してVCの設定を行う。
 ↓
 soに必要な環境設定が全て完了し、Cygwinが起動する。

 いちおうこの流れで問題が無い。が!

 実際にコンパイルしてみると、エラーが出る。
 エラーの内容はこうだ。

link: invalid option -- n
Try `link --help' for more information.

 ハァ??(゜д゜)

 ちょっと調べてみると、どうやらVCのlink.exeではなく、
 Cygwinのlink.exeが起動している模様。

 それならと、PATHの設定でVCのディレクトリを優先に
 設定(先に持ってくる)してみる。

 …失敗。

 アルェ!?(´д`)

 さらに調べてみると、どうやらCygwinを起動した時点で、
 PATHの先頭にCygwinのBINディレクトリが強制的に挿入されているようだ。

 勝手なことすんなよ!!

 他にいい解決策も見つからないので、
 Cygwinのlink.exeをリネームしちゃいました(ノ∀`;

 再度実行。

 …成功

 なんとかしたいなぁ。。まぁとりあえずはこれで…
 別にCygwinのlink.exeなんてこの先使うこと無いと思うし…。



2008/6/6
 以前、nmakeでMakefileを書いて、コンパイルを通そうと
 がんばってみたけど、依存ファイルの定義方法とか、
 テキストの置換やらprefix, suffix加工とか、
 そもそも、gccの-MMオプションのようなものが無い!(あるんかもしれんけど)
 なにより!資料がない!!MSDN漁りまくってもせいぜいオプションの
 リファレンスが関の山。

 もういろいろとGNU Makeなら正直、ストレス無く全部できる(*´∀`*)
 GNU Makeに慣れすぎてるせいか,,,orz

 あと、gcc の -MM オプションのようなものが、cl.exeにMSDNを探した限りでは
 見つからなかったので、gccで代用。 
 サフィックスが微妙に違う(*.o と *.obj)のとかは、SEDで置換。

 あとは普通に、依存ファイルをinclude設定して、コンパイル…

 成功!! (*´∀`*)ハエー

 やっぱGNUダヨネー。
 資料がたくさんあるもの助かるし♪

 ということで、この勢いで静的ライブラリのリンクもバシバシ追加。

 一応、一番簡単なWindowsプログラム(ウインドウが出るだけのヤツ)を
 コンパイルして実行するところまでできた。

 うん。いい調子♪


 今ちょこちょこと話したとこだけをピックアップして以下に掲載。
 重要そうなとこだけを抜粋したので、そのままじゃ当然動かない。
#===============================================================
# 実行ファイルの生成
#===============================================================
$(TARGET_EXE_FILES) : $(TARGET_OBJ_LIST_FILES)
	@link -nologo -out:$@ $^ \
	/SUBSYSTEM:WINDOWS /MACHINE:X86 /ERRORREPORT:PROMPT $(LIB_LIST)

#===============================================================
# objファイルとcファイルのパターンパッチclコンパイル
#===============================================================
$(TARGET_OBJ_DIR)/%.obj : src/%.cpp
	@cl -c -nologo -EHsc -GR -Zc:forScope -Zc:wchar_t -Fo$@ $<

#===============================================================
# オブジェクト依存ファイルの自動生成
#===============================================================
$(TARGET_DEP_DIR)/%.d : src/%.cpp
	@gcc -MM $< > [email protected]
	@sed s/.o/.obj/ < [email protected] > $@
	@rm -f [email protected]

#===============================================================
# オブジェクト依存ファイルの定義
#===============================================================
-include $(TARGET_DEP_LIST_FILES)

タグ:

+ タグ編集
  • タグ:
最終更新:2008年06月20日 01:15