Batファイルにcppファイルをドラッグ＆ドロップしてコンパイル

Visual Studioの起動が遅いので、とにかく手抜きでコンパイルしたいと思い、トライ＆エラーの末に漸く環境が整ったので、まとめておきます。
注）以下、Visual Studio 2015のcl.exeを使用することを前提として書いております。バージョンが異なる場合は、INCLUDE、LIBファイルの置き場所等異なっているかと思いますので、ご注意ください。

#目的
C++で自作関数の動作検証を行う際に、Visual Studioで一々プロジェクトを作成していると起動からコンパイルまでに時間がかかるので、cppファイルをbatファイルでコンパイルしたい、できるならcppファイルをbatファイルにドラッグ＆ドロップするだけで自動的にコンパイルしてくれると尚良いと思い、上記を目標に色々試してみました。
##まずはVisual Studio 2015開発者コマンドプロンプトでのテスト
まずはVisual Studio 2015の開発者コマンドプロンプトでコンパイルのテストです。
<img width="257" alt="CommandPrompt.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/119667/94b63d77-32c8-d5eb-b33d-b1e81db3586e.png">

printfとcoutで、出力確認を行うだけですが、以下のシンプルなコードでコンパイルのテストを行ってみます。

```C++:Hello.cpp
#include <stdio.h>
#include <iostream>

int main()
{
	printf("Hello World \n");
	std::cout << "Hello iostream" << std::endl;
	return 0;
}
```

実行結果は以下の通り。
<img width="453" alt="VSCMD.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/119667/be4924f5-15df-b8f6-4205-cc5b6e98ccb1.png">

開発者用コマンドプロンプトでは問題無くコンパイル⇒実行までできることが確認できました。

##続いてbatファイルを使ったコンパイルテスト
[こちらのサイト](http://d.hatena.ne.jp/tt_clown/20090816/p1)が一番参考になりました。
ただ、私の場合こちらのサイトの設定だけでは上手くいかず、いくつか修正しています。
上記サイトを参考にINCLUDE,LIBの追加を行っていきましたが、いくつもエラーが出てなかなかコンパイルが通りませんでした。
**１．「stdio.hが無い」というエラー**
⇒C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include内にあるものと思っていたのですが、上記のフォルダをINCLUDEしてもエラーが消えず、確かに上記のフォルダで検索をかけてもstdio.hが見つかりませんでした。
C:\Program Files(x86)内で検索をかけた所、以下のフォルダで発見。
C:\Program Files (x86)\Windows Kits\10\Include\10.0.14393.0\ucrt
どうも、Visual studio2015から置き場所が変わったようです。
その後も以下のファイルでエラーが出て、その都度フォルダ検索をかけてINCLUDE、LIBを追加していきました。
・vcruntime.h、LIBCMT.lib、kernel32.lib、libucrt.lib

最終的に、私がbatファイルで追加したのは以下になります。

```bat:compile.bat
set INCLUDE=%ProgramFiles(x86)%\Windows Kits\10\Include\10.0.14393.0\ucrt;%INCLUDE%
set INCLUDE=%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\VC\include;%INCLUDE%
set LIB=%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\VC\LIB;%LIB%
set LIB=%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.0A\Lib;%LIB%
set LIB=%ProgramFiles(x86)%\Windows Kits\10\Lib;%LIB%
set LIB=%ProgramFiles(x86)%\Windows Kits\10\Lib\10.0.14393.0\ucrt\x86;%LIB%
set LIB=%ProgramFiles(x86)%\Windows Kits\10\Lib\10.0.14393.0\um\x86;%LIB%
```

##batファイルをダブルクリックするだけでコンパイルしたい
実は、上記のbatファイルはダブルクリックで実行した際、以下のエラーでコンパイルすることができませんでした。

<img width="405" alt="Error.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/119667/6b058bb4-09ef-132d-0962-0e3c9232c06a.png">

エラーメッセージから管理者権限の問題のようだったので、batファイルを右クリック→管理者権限で実行するようにしたところ、問題無くコンパイルできるようになりました。
ただ、いちいち右クリック→管理者権限として実行を選択するのは非常に面倒です。
batファイルをダブルクリック⇒コンパイルしてくれるようにしたいと思い、色々調べたところ、[こちらのサイト](http://piyopiyocs.blog115.fc2.com/blog-entry-929.html)に素晴らしい方法が載っていました。
真似して管理者権限として実行するためのbatファイルを作成したところ、確かにダブルクリックでコンパイルできるようになりました！
しかし何度か実行していると、batファイルからbatファイルを読みだす時間差と、UACのポップアップが煩わしくなってきました。
そもそも何故このコンパイル作業に管理者権限が必要なのかと思い、調べていたところ、objファイルが以下のフォルダに生成しており、program filesフォルダ下の階層のファイルを編集しようとしているためにUACが必要となっているようでした。
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin
objファイルの生成場所を、管理者権限の必要無い階層（現在コンパイルファイルを置いているOneDrive内のフォルダ）に変更することにしました。
[こちらの知恵袋](http://okwave.jp/qa/q7864150.html)の記事を参考に、cl.exeのオプションを追加しました。

```bat:compile.bat
cl /EHsc C:\Users\xxx\OneDrive\Ccompile\test.cpp  /link  /OUT:"C:\Users\xxx\OneDrive\Ccompile\test.exe"
```

これで、batファイルをダブルクリックすることで、exeファイルを指定のフォルダ内に生成させることができるようになりました。

##cppファイルをbatファイルにドラッグ＆ドロップしてコンパイルできるようにしたい
ここまでできると、もう少し欲が出てきます。
cppファイルも色々作るので、cppファイル名をタイピングして、指定したファイルをコンパイルできるようにするか、できればcppファイルをドラッグ＆ドロップで自動的にコンパイルできるようにしたい。
これが、バッチファイルの知識の無い私にとっては難問でしたが、[こちらのサイト](http://memo.morelents.com/batch-drag-drop/)が非常に参考になりました。

仕組みを全く理解していないのですが、ひとまず以下のようにかけば、

```bat:compile.bat
for %%f in (%*) do (
  echo %%~nf
)
```
%%~nfの部分に、ドラッグ＆ドロップしたファイル名（拡張子無）が入ることが分かりました。
これをコンパイルするファイル名の変数に代入し、作業フォルダを取得するコードが分かればなんとかできそうです。
カレントディレクトリの取得方法は、[こちらのサイト](http://d.hatena.ne.jp/nakamura001/20090203/1233652705)を参考にさせていただきました。
ということで、最終的に私が使用したコードは以下になります。

```bat:compile.bat
set FN=
for %%f in (%*) do (
  echo %%~nf
  set FN=%%~nf
)
set INCLUDE=%ProgramFiles(x86)%\Windows Kits\10\Include\10.0.14393.0\ucrt;%INCLUDE%
set INCLUDE=%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\VC\include;%INCLUDE%
set LIB=%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\VC\LIB;%LIB%
set LIB=%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.0A\Lib;%LIB%
set LIB=%ProgramFiles(x86)%\Windows Kits\10\Lib;%LIB%
set LIB=%ProgramFiles(x86)%\Windows Kits\10\Lib\10.0.14393.0\ucrt\x86;%LIB%
set LIB=%ProgramFiles(x86)%\Windows Kits\10\Lib\10.0.14393.0\um\x86;%LIB%

cd /D C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin
cl /EHsc /Fo%~dp0\ %~dp0\%FN%.cpp  /link /OUT:%~dp0\%FN%.exe
%~dp0\%FN%
```

なお、上記でのコードでcdコマンドのオプション/Dが入っているのは、別PCでOneDriveの同期フォルダがCドライブではないためにつけているだけですので、Cドライブ下にコンパイルしたいファイルがある場合は、/Dオプションは不要です。
上記のbatファイルに、作成したcppファイルをドラッグ&ドロップすることで、コンパイル⇒実行までを自動で行うことができます。
（batファイルとcppファイルは同じフォルダ内に置いてください。）