Windows で複数コンパイラを共存させる

はじめに

この記事は一つの Windows システム上に複数の C/C++ コンパイラを共存させる、私なりの方法について書いています。

何も考えずに C/C++ 言語でプログラムを書くと、 開発環境と違うコンパイラ・リンカでは使えない事があります。 そこで複数のコンパイラを使って動作を確認したくなるのですが、 そのためには複数のコンパイラを一つのシステムに共存させる必要があります。 まあ、お金を出せば VMWare や Virtual PC で各コンパイラ用の環境を作れます。 とはいえさすがにコンパイルのたびに仮想マシンを切り換えるのは面倒ですから、 共存そのものはどんな人にも有用ではないかと思います。

問題

複数コンパイラの共存を考えるにあたって一番問題になるのは、 多くのコンパイラは標準インクルードヘッダ (.h/.hpp) の検索パス、標準リンクライブラリ (.lib) の検索パスを環境変数で決める事です。 面倒を抱えたくなければコンパイラごとにインクルード・リンクするライブラリを設定した方が良いですから、 これをどうにかします。

ほとんどのコンパイラは環境変数 INCLUDE と LIB を検索パスとして使います。 環境変数はシステムに一つですから、 これに依存すれば当然すべてのコンパイラが同じ場所を検索しに行きます。 逆に言えばこれをコンパイラごとのパスに都度書き換えられれば良いわけですね。 そこで、 これをコンパイラごとに変更する簡単なバッチファイルを作ってみます。

バッチファイルの設計

要するに INCLUDE と LIB という環境変数を書き換えるだけのバッチファイルを作れば良いわけです。 単純きわまりない例をあげれば次のようになります。

@echo off
rem Digital Mars C++ 用に環境変数を設定
set PATH=C:\dm\bin;%PATH%
set INCLUDE=C:\FOX\;C:\STLPort\stlport;C:\dm\include
set LIB=C:\STLPort\lib;C:\dm\lib

しかしこのようなバッチファイルがコンパイラの数だけある場合、 ライブラリ

唐突ですが、次が私が作ったバッチファイルの例です。

@echo off

rem --------------------------------------------------------
rem   動作には次のように環境変数を定義しておく必要がある。
rem     DMC     ... DMC のインストールディレクトリ
rem     STLPort ... STLPort のインストールディレクトリ
rem     FOX     ... FOX のインストールディレクトリ
rem --------------------------------------------------------



rem ---- 各ライブラリのパスを確認 ----

rem DMC のパス
if "%DMC%"=="" goto err_no_dmc

rem STLPort のパス
if "%STLPort%"=="" goto err_no_stlport

rem FOX ツールキットのパス
if "%FOX%"=="" goto err_no_fox


cls


SET PATH=%DMC%\bin;%PATH%
SET INCLUDE=%STLPort%\stlport;%FOX%\include;%DMC%\include
SET LIB=%STLPort%\lib;%FOX%\lib\dmc;%DMC%\lib



echo ###################################
echo ### begin Digital Mars C++ mode ###
echo ###################################

goto end





rem ---- エラーメッセージ ----

:err_no_dmc
echo environment variable "DMC" not defined.
goto end

:err_no_stlport
echo environment variable "STLPort" not defined.
goto end

:err_no_fox
echo environment variable "FOX" not defined.
goto end


:end