javaプログラムで作成したC言語処理系の利用ツールにかんする様々な問題と対応
C言語処理系のコマンドラインからの利用はコマンドプロセッサのCUIを利用して行う。
Windowsの場合はcmd.exeを起動し、これに対する引数として一連の実行コマンドを与える。
1)カレントディレクトリ
全てのファイル名をフルパスにすることも出来るが、カレントディレクトリを設定することで、コマンドラインは簡素化でき、トラブルも減ると思われる。起動した端末カレントディレクトリを変更するには
- Windowsのcmd.exeではcdコマンドを使ってカレントディレクトリを変更
2)PATH設定
C言語処理系のコンパイラやリンカーの場所をPATHに含めるとコマンドラインは簡素化できる。
- Microsoft Visual C++は設定用のバッチプログラムを用意しているが、設定用バッチファイルはフルパスで指定してもいいかも知れない。
- BorlandC++5.5はインストール先のbinフォルダをPATHに含めると便利。。
3)その他の環境変数設定
処理系によっては様々な環境変数の設定を要求するものがある。
- Microsoft Visual C++は専用の環境変数(INCLUDEやLIBなど多数)設定用のバッチプログラムを用意している。
- BorlandC++5.5は設定ファイル(bcc32.cfgとilink32.cfg)でコンパイラやリンカーに環境を教えている。
1)コンパイルコマンド
標準的はコンパイルであれば既定値で一気にリンクまで済ませることも可能だが、やはり中身まで教えるには細かい処理が出来ないと不十分である。例えばプリプロセスのみの実行とか。
- Microsoft Visual C++は
cl.exe /W4 "ソースファイル名" /Fo"オブジェクトファイル名" /c
ここでW4はワーニングなどの出力設定、/cはリンクを行わない設定
- BorlandC++5.5は
bcc32.exe -c "ソースファイル名" -o "オブジェクトファイル名"
-c はリンクを行わないオプション、-o はオブジェクトファイル名の指定2)リンクコマンド
こちらは、リンクするライブラリーの指定があるので多様になる。この当たりの設定はマニュアルを見ないと解らない。しかもどこを見たら書いてあるのか探すのも一苦労。
- Microsoft Visual C++は
link "オブジェクトファイル名" libcmt.lib /out:"実行可能ファイル名"
ここでlibcmt.libは最も標準的なマルチスレッド対応のライブラリー。昔はlibc.libと言うシングルスレッド前提のものがあったがいまは無い
- BorlandC++5.5は
ilink32 -c -x -Gn -v "オブジェクトファイル名" c0x32.obj , "実行可能ファイル名" , , cw32mt.lib import32.lib
ライブラリ:
c0x32.obj:スタートアップモジュール the startup code for a console application
cw32mt.lib:マルチスレッド対応のランタイムライブラリ
import32.lib:Windows API を使うためのライブラリー
設定:
-c 名前の大文字小文字を区別してリンクを行う
-x マップファイル無し
-Gn 状態ファイル無し
-v デバッグ用の情報を残す
戻り値から旨く実行ファイルが作られたかは知ることが出来る。しかしエラーや警告の出力先(標準出力や標準エラー出力)や書式は処理系依存のためここから情報を取り出すプログラムは個別に作成することになる。国際標準のようなものが無いのは困り者?ないのかな〜。
前記のような一連の処理をコマンドプロセッサを用いて行うにはコマンドプロセッサについて色々知る必要がある。
Windowsのコマンドプロセッサはcmd.exeでコマンドプロセッサを起動すると1個のCUI仮想端末を開く。起動時の引数オプションでコマンドを与えて実行し終了する場合と、端末を開いたまま終了せずに次のコマンドを待つ場合とを区別する。
- cmd /c "コマンド文字列" コマンドを実行して終了する
- cmd /k "コマンド文字列" コマンドを実行しても終了しない
この端末のカレントディレクトリや環境変数は起動時の値から次のコマンドで変更することが可能。
- cd 端末のカレントディレクトリ変更 ドライブ変更の場合は/dオプションが必要
- set 端末の環境変数の設定
実行可能ファイルと引数の文字列をコマンド文字列に与えると、実行可能ファイルをメモリーに展開し引数文字列を渡して実行する。前期のコンパイルやリンクはこの方法で行う。ここで、例えばノートパッドを起動してhello.cを編集したければ
- cmd /c notepad hello.c
条件付き処理記号を使うと、複数コマンドの実行や実行制御が可能になる。
条件付き処理記号には以下の様なものがある。
&&を使って複数のsetコマンドを実行する例。前のコマンドが成功した場合のみ後のコマンドが実行される。
- アンパサンド (&) は、単一のコマンド ライン上で複数のコマンドを区切ります。
- かっこは、複数のコマンドをグループ化します。
- セミコロン ( ; ) またはカンマ ( , ) は、コマンド パラメータを区切ります。
- キャレット (^) を使うと、コマンド記号をテキストとして使用できます (その記号の特殊な意味は無視されます)。
- 二重のアンパサンド (&&) を使うと、この記号の後に続くコマンドは、記号の前のコマンドが成功した場合にだけ実行されます。
- 二重のパイプ (||) を使うと、この記号の後に続くコマンドは、記号の前のコマンドが失敗した場合にだけ実行されます。
cmd /c set "path=c:\Program Files\Microsoft Visual Studio\Vc98\Bin;%PATH%" &&
set "INCLUDE=C:\Program Files\Microsoft Visual Studio\Vc98\include\" &&
set "LIB=C:\Program Files\Microsoft Visual Studio\Vc98\Lib" &&