以前、Visual Studioを使うときに環境変数を設定するバッチファイルを記述して、Visual Studioの起動オプションに/useenvをつけると、IncludeパスやLibパスなどに設定された環境変数の値をそのまま使用できてとても便利だという記事を書きましたが、この環境変数設定のバッチファイルの書き方について一番スマートな書き方はどんなものかを考えてみました。
まず、設定するパスにどのような共通点があるかということを考えてみます。
環境変数のPath, Include, Libの設定は次のようなパスになることが多いです。
つまり、ライブラリパス群をforループで回して、これらのパスを設定するようなスクリプトを書けば新しいライブラリのパスを追加したいときにわざわざPath, Include, Libの環境変数を設定するスクリプトを記述しなくて済みます。
バッチファイルでforループを使いながら変数を設定する場合に注意しなければならないのが、普通に記述すると環境変数の即時展開により、バッチファイルが読み込まれた時点で環境変数の設定が行われてしまうということです。これを回避するために遅延環境変数というものを使います。
次のようにsetlocal ENABLEDELAYEDEXPANSIONというコマンドを実行するとendlocalがある行までの環境変数の設定が遅延環境変数で行われるため、コマンドの実行時に変数の設定が行われるようになります。変数の使用時には%変数名%ではなく!変数名!とします。
詳しくは下記のサイトがわかりやすかったので参照して下さい。
http://f32.aaa.livedoor.jp/~kobun/index.php?CMD.EXE%A4%CE%C3%D9%B1%
E4%B4%C4%B6%AD%CA%D1%BF%F4%A4%CE%C5%B8%B3%AB
以下が最終的なバッチファイルの例になります。環境変数を上記の方法で設定してVC++ 2010を起動するバッチファイルです。
このようにバッチファイルを書いておけば、新しいライブラリのパスを追加したいというときにLibListに新しいライブラリのパスを追加するだけで済み、管理がとても楽になるのでおすすめです。
まず、設定するパスにどのような共通点があるかということを考えてみます。
環境変数のPath, Include, Libの設定は次のようなパスになることが多いです。
Path: ライブラリパス\bin
Include: ライブラリパス\include
Lib: ライブラリパス\lib
Include: ライブラリパス\include
Lib: ライブラリパス\lib
つまり、ライブラリパス群をforループで回して、これらのパスを設定するようなスクリプトを書けば新しいライブラリのパスを追加したいときにわざわざPath, Include, Libの環境変数を設定するスクリプトを記述しなくて済みます。
バッチファイルでforループを使いながら変数を設定する場合に注意しなければならないのが、普通に記述すると環境変数の即時展開により、バッチファイルが読み込まれた時点で環境変数の設定が行われてしまうということです。これを回避するために遅延環境変数というものを使います。
次のようにsetlocal ENABLEDELAYEDEXPANSIONというコマンドを実行するとendlocalがある行までの環境変数の設定が遅延環境変数で行われるため、コマンドの実行時に変数の設定が行われるようになります。変数の使用時には%変数名%ではなく!変数名!とします。
setlocal ENABLEDELAYEDEXPANSION ... endlocal
詳しくは下記のサイトがわかりやすかったので参照して下さい。
http://f32.aaa.livedoor.jp/~kobun/index.php?CMD.EXE%A4%CE%C3%D9%B1%
E4%B4%C4%B6%AD%CA%D1%BF%F4%A4%CE%C5%B8%B3%AB
以下が最終的なバッチファイルの例になります。環境変数を上記の方法で設定してVC++ 2010を起動するバッチファイルです。
@echo off setlocal ENABLEDELAYEDEXPANSION rem Define Library Path -------------- set LibList=C:\Qt4.7.1 C:\DevIL C:\OpenCV2.2 rem Set Environment Variables -------- for %%p in (%LibList%) do ( set Path=%%p\bin;!Path! set Include=%%p\include;!Include! set Lib=%%p\lib;!Lib! ) set SourcePath=%Include% rem Execute VC++ --------------------- set VCCommonDir=C:\Program Files (x86)\^ Microsoft Visual Studio 10.0\Common7 call "%VCCommonDir%\Tools\vsvars32.bat" devenv.exe /useenv endlocal
このようにバッチファイルを書いておけば、新しいライブラリのパスを追加したいというときにLibListに新しいライブラリのパスを追加するだけで済み、管理がとても楽になるのでおすすめです。