VS のビルドをコマンドラインで実行する
コマンドラインでビルドできるとバッチファイルなどのスクリプトで実行できるようになりますし、 Emacs 上からビルドもできるようになります。 Emacs 上でコンパイルする設定は以前少し書きました。
http://yohshiy.blog.fc2.com/blog-entry-10.html
私は Un*x 系での開発の場合は、編集、ビルド、デバッグとすべて Emacs 上からやるのですが、 Windows の開発でも 編集、ビルドまで Emacs 上でできます。デバッグだけはコマンドライン上からできないので、おとなしく Visual Studio でやってます。
MSBuild
ビルドをコマンドライン上からやるには MSBuild というプログラムを使用します。これは .NET ランタイムと一緒に配布されているもので通常以下の場所にインストールされています。
c:/Windows/Microsoft.NET/Framework/vX.X
ここに PATH を通せば、 MSBuild で呼び出せます。
使用法は以下の形式です。
$ MSBuild [プロジェクトファイル]
*.vcxproj(VS2010)、 *.vcproj のようなプロジェクトファイルだけでなく、*.sln のソリューションファイルもビルドできます。省略した場合はカレントフォルダにあるものを探して実行します。
オプションを指定していない場合はデフォルトの構成のものがビルドされます。ビルドの構成を指定して実行するオプションは若干面倒です。たとえば Release 指定してビルドする場合は以下のように呼び出します。
$ MSBuild /p:Configuration=Release
http://www.atmarkit.co.jp/fdotnet/special/msbuild01/msbuild01_01.html
.NET 以前
VC++6.0 など .NET の前の場合には 以下のようにしてビルドできます。
$ MSDEV.dsw /MAKE "target"
http://q.hatena.ne.jp/1213016943
Qt の場合
Qt の場合には qmake というツールを使って、 Qt 用のプロジェクトファイル(*.proj)から、 Un*x 系では make ファイル、 Windows 上では VC 用のプロジェクトファイルを生成することができます。
Windows 上で VC 用プロジェクトファイルを生成するためには *.proj の TEMPLATE の設定で vcapp を指定する必要があります。ただクロスプラットホームで開発している場合、 vcapp とプロジェクトファイルに記述すると今度は Un*x 系でエラーとなるので以下のようにして qmake を実行する必要があります。
$ qmake -tp vc
Windows 上でこの -tp vc をつけずに qmake を実行するとどうなるかというと、nmake という VC 用のメイクファイルが生成されます。 MSBuild を使うよりも nmake の方がビルドが若干速いようなので、私は Qt を Windows 上でコンパイルする場合 nmake を使っています。
ただし、この nmake は VS のスタートメニューの [Visual Studio 20XX コマンドライン] というところから実行すると上手くいくのですが、それ以外から実行しようとすると環境変数が設定されていないため、エラーとなります。
そこで、 Emacs などからビルドしたい場合には以下の環境変数を設定しておく必要があります。
- PATH
- INCLUDE
- LIB
- LIBPATH
設定する環境変数の値は以下のファイルなどを参考にして設定してください。
(VSのインストールフォルダー)\Common7\Tools\vsvar32.bat
VS で gcc のようにファイルを指定してビルドする方法
gcc(g++) などのコンパイラではファイルを指定してコンパイルします。
$ g++ main.cpp foo.cpp大きなアプリケーションになると各ソースファイルのコンパイルを定義した Makefile を作成して、 make でビルドするのが一般的です。
それに対して、 Visual Studio でプロジェクトを作ってから、ビルドします。
しかし、ちょっとした確認などで gcc のようにファイルを指定してコマンドラインで コンパイルしたい場合もあります。
実は Visual Studio にも cl というコマンドラインのコンパイラがあって、 gcc のようにソースファイルを指定してコンパイルすることができます。
使うための準備がいろいろあるのですが、前に書いた Windows 版 Qt で nmake を使ったビルド方法 とほぼ同じです。
今回はもう少し詳しく書いてみようと思います。
準備
コンパイルにはコンパイラやビルド用のライブラリファイルが必要となります。 これらをまずインストールする必要があります。- Visual Studio (Express)
- Microsoft Windows SDK
これで GUI アプリなども作成できるのですが、基本的なものしか用意されていないので、 実際に使えるようなアプリを使いたい場合には、 製品版を買うか、 Qt などのツールキットを使った方がいいと思います。
Windows SDK はヘッダやライブラリなどをまとめた開発キットで、前は Plathome SDK という名前でした。
環境設定
コンパイルをコマンドラインで行う場合にはいろいろと環境変数の設定が必要になってきます。これはインストール時にスタートアップメニューに追加された 「 Visual Studio コマンドプロンプト(XXXX)」 から実行すると環境変数を設定して、 コマンドプロンプトを実行してくれるので、設定する必要はありません。
しかし、 Windows 標準のコマンドプロンプトはちょっと使いづらいです。 そこで eshell, Windows Power Shell, nyacus といったのシェルツールを使いたくなってきますが、 この場合は環境変数の設定が必要となります。
環境設定画面は以下の手順で呼び出します。(Windows OS のバージョンの違いで微妙に違います)
- コンピューターを右クリックメニューから [プロパティ]
- [システムの詳細設定]
- [詳細設定] タブの [環境変数] ボタン
設定する環境変数は正確には以下のファイルの内容を確認する必要があります。
ただし、たいていは以下の設定だけでいけると思います。(VS のインストールフォルダー)\Common7\Tools\vsvar32.bat
環境変数 | 値 |
---|---|
VSINSTALLDIR | (VS のインストールフォルダー) |
WindowsSdkDir | (Windows SDK のインストールフォルダー) |
INCLUDE | %VSINSTALLDIR%\Include;%WindowsSdkDir%\Include |
LIB | %VSINSTALLDIR%\Lib;%WindowsSdkDir%\Lib |
LIBPATH | %LIB% |
PATH | %VSINSTALLDIR%\Bin;%WindowsSdkDir%\Bin;(.NET フレームワークのフォルダー) |
%xxx% は環境変数の値を他の値の定義で使用するための記述方法です。
正確には、 VSINSTALLDIR や WindowsSdkDir の変数は他の変数に直接フルパスを書けば、 必要ないのですが、インストール先を変更した場合などに一箇所変更するだけですむようにしています。
.NET フレームワークのフォルダーは以下のようなパスです。 これはフレームワークのバージョンによって、最後のフォルダー名が変わります。
c:\Windows\Microsoft.NET\Framework\v4.0.30319
使用法
使用方法は gcc などのコンパイラとほぼ同じです。ソースファイルを引数に指定して実行します。 複数のファイルがある場合でも、他のコンパイラと同様にリンカーも自動的に呼び出して 結合してくれます。
$ cl main.cpp foo.cpp出力される実行ファイルは指定しなかった場合は、 "ファイルのベース名" + .exe となります。 上記の例では main.exe が生成されます。
指定する場合は /Fe オプションを使用します。
$ cl /Febar.exe main.cpp foo.cpp # bar.exe が生成されます。".exe" は省略可能です
その他のオプションは MSDN に一覧があります。
よく使うオプションとしては次のようなものだと思います。
オプション | 目的 |
---|---|
/HELP | ヘルプ(コンパイラ オプションのリスト)を出力 |
/D | 定数とマクロを定義 |
/I | インクルードファイルの検索パスの追加 |
/EH | 例外処理のモデルを指定。 STL など標準ライブラリを使う場合は /EHsc と指定していないとワーニングが発生します。 |
他にはデバッグビルドの指定などを gcc などのコンパイラーではよく使うと思いますが、 デバッグをしたい場合は VS プロジェクトを作る必要があるので、そちらを使用した方がいいでしょう。
dll(ダイナミックリンクライブラリ) を使用する場合、 公開関数の定義情報を持つ lib ファイルをコンパイル時に指定する必要があります。
この lib ファイルの指定方法は通常のファイルと同じように引数として指定するだけです。
$ cl main.cpp user32.libただし、この指定する lib ファイルへのパスが環境変数 LIB で定義されている必要があります。
指定する lib ファイルは WIN32API の MSDN に関数でどの lib が必要かという情報が書かれていますので、 そちらを見て、指定を追加するようにしてください。
Windows でライブラリの依存関係を調べる
Windows では Dependency Walker というツールがよく使われます。 このツールは昔は VS のツールとしてついてきていたものらしいです。
ただ、 Un*x 系の開発の長かった Emacs 派としては Windows 上でも eshell を使って作業しているので、つい ldd と打ちたくなります。
実は Windows にもコマンドラインで依存関係を調べる dumpbin というツールがあります。 これは以下のような引数を渡します。
dumpbin.exe /DEPENDENTS ファイル名
$ dumpbin.exe /DEPENDENTS c:/Windows/System32/user32.dll Microsoft (R) COFF/PE Dumper Version 10.00.30319.01 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file c:/Windows/System32/user32.dll File Type: DLL Image has the following dependencies: ntdll.dll GDI32.dll KERNEL32.dll :このコマンドラインツールは 2010 でも VS についてくるツールです。 ただし、パスを省略して実行する場合には、以前コマンドラインでコンパイルする方法で書いた PATH の設定をしておく必要があります。
これをエイリアスにしておけば Windows 上でも ldd でライブラリの依存関係が調べられます。