cygwin で Visual C++ のコマンドラインコンパイラーを使う

Visual C++ Express を使ってると、よくビルド&実行した子プロセスが終了しなくて、VC ごと再起動しないとまたコンパイルできなくなってしまうことがある。解決方法知ってる人は教えてください。

それで、Visual C++ Express を使うのはやめて、cygwinVim でやりたい。

基本的には cl.exe などにパスを通せばいいらしい。cmd.exe 用には vsvars32.bat というパスを設定してくれるバッチファイルがあるので、それを .bashrc などに書き換えてもいいらしいのだけど、色々あって面倒だし、cygwin を使うときに常時パスが通ってるのもあまり好きではない。(/usr/bin/link が link.exe とかぶったり)

そこでググッてみたら、cygwin から cmd.exe を使って、vsvars32.bat を走らせた上で cl.exe などのコマンドを実行できる方法があった。

function run_with_bat()
{
  batfile=$1; shift
  tmpfile="$TMP/tmp$$.bat"
  echo "@echo off" > $tmpfile
  echo "call \"%$batfile%vsvars32.bat\" >NUL:" >> $tmpfile
  echo "bash -c \"%*\"" >> $tmpfile
  cmd /c `cygpath -m "$tmpfile"` "$@"
  returnstatus=$?
  rm -f $tmpfile
  return $returnstatus
}

function run_vs10()
{
  run_with_bat VS100COMNTOOLS "$@"
}

alias cl="run_vs10 cl"
alias nmake="run_vs10 nmake"
alias rc="run_vs10 rc"

↑ .bashrc か .zshrc に貼っておけば、cl とか nmake と普通に使える。

StackOverflow には VC9 用の VS90COMNTOOLS と VC8 用の VS80COMNTOOLS がある。

Cygwin.bat に vsvars32.bat と書く方法

指摘してもらいましたcygwin のコンソールではなくて mintty を使っているので Cygwin.bat は走らないのです。

「僕はそんな場合、mintty.bat作っちゃうと思います。clで毎回実行するのはコンパイルが遅すぎる気がするんですよね。」という声も。これもアリだと思います。速度が気になってきたらやるかもしれません。