bcc のコマンドラインオプション


プログラム内(ソースコード)のことは別として、
コマンドラインからのことに関して少しだけ。

「オプション」はコンパイラによって異なります。


 

コンパイルするときのコマンドは、

「bcc32 ファイル名」 、またはしばしば、「 bcc32 -tW ファイル名 」 が、基本的なかたちです。

「-tW」 は、コマンドラインオプションというもので、状況に応じて このような オプションの追加が必要です。

オプションは、実際は多数あります。具体的にはコンパイラの説明書を参照してください。

まずは例を挙げます。オプションは以下のように使います。


1 bcc32 -f test.txt : -f : 浮動小数点計算を行う == こういう説明はあまり見かけませんが、敢えて具体的に説明するならば、「プログラム中で、float , double 型の変数を使ったら -f を付ける」、と考えておけばあまり間違いはありません。
2 bcc32 -P test.txt : 「C++ として」コンパイルする ( bcc32 では、もともとは、ファイル名の拡張子が .cpp でないと自動的に C として、.cpp なら C++ としてコンパイルされます。-P を指定すると、常に C++ 。)
3 bcc32 -tW test.txt : Windows 32 ビットアプリケーションをコンパイルします。
4 bcc32 -tW -tWM test.txt : 32 ビットアプリの場合で、更に、プログラム内で、「マルチスレッド」を扱う場合、に指定。 _beginthread() (C関数)など 「マルチスレッド用の関数」 を使う場合です。「マルチスレッド用の関数」とはいっても、さしあたり、_beginthread() と、スレッド終了の _endthread() くらいしか思い当たりません。CreateThread() (API関数) もありますが、具体的にはこれら程度です。
5 bcc32 -e"myprog.exe" test.txt : 通常 「test.exe」 が出力されるところ、ファイル名を 「myprog.exe」 として出力することができます。

 

オプションをつけるということです。

-tW というオプションは、32 ビットの Windows Application をコンパイルしたい場合に指定するオプションです。16 ビットのコンソールアプリと区別されます。

WinMain() 関数をベースにプログラムを書いて、-tW を忘れると、「エラー : 関数 main が未解決」。一見なにが悪いのかわからないものです。

 -tW がないと、コンパイラは当然に void main() 〜 でプログラムが書かれていると「思い込む」ので、それがないから、左のようなエラーを出してくるのです。-tW を指定しているのに、WinMain() 関数がない、という逆のパターンでも同じです。エラーが出ること自体ありがたいことですが、この「未解決」エラーや他のいくつかのエラーのときは、何が悪いのかわからないことが多くので、ポイントを押えておく必要があります。そうしないと、右往左往することになります。

 

必要なオプションが欠けている場合、コンパイラがエラーを出してくるので、せいぜいそのエラーに頼りにオプションのことを気にしておく、というのも 一つの手ではあります。

ただその点で、コンパイル時のエラーといっても、「ソースのエラーなのか」または、「コンパイルのときのオプションの付け方が悪いのか」 の特定が容易でなく、スムーズにプログラム作業に集中できないケースがあります。そのようなときのために、少しくらいは目を通しておくことが必要です。

オプションに関して、以下、煩雑にならない程度に、少しまとめておきました。実際にコンパイルするや、エラーのときの参考にしてください。

 

戻る


 

例中 4 にもあるように、オプションは一つだけには限りません ( 「-tW -tWM」 は、「-tW」 と 「-tWM」 の2つを指定しています)。オプションは、コンパイラにどう動作させたいかに従って、本来は説明書から見つけ出し、追加していきます。

bcc32 [リターン] のようにすると、オプション一覧が表示されるので、コンパイルの作業中にその場で確認することもできます。

 

説明書には、 「コンパイラのコマンドラインオプション」 に関して必ず説明があるはずですが、それを見てみると、うんざりするくらい多様な指定ができることがわかります。これを見て、コンパイラ恐るべし、と思う人も少なくないでしょう。技術語のかたまりです。

しかし、コンパイラを Windows 上で標準的に使用する限り、はじめのうちは、よく使うオプションとほとんど縁のないオプションでは、お目にかかる率にかなり かたより があるのが実際です。

 

よく使うものについて目を通しておくと、あとあと混乱がありません。含まれるオプションに重複がありますが以下、3つの興味から整理します。数はたいしたことありません。

( ※ 普通のコンパイルとは、 .exe 形式の実行ファイルを作ることだと考えてください。 )

 

@作成できるものには、.exe 実行ファイルのほか、いくつか種類があります。
( ので、興味のあるところだと思います。)

 

オプション

作成できる形式 (拡張子)

簡易の説明

説明と具体例

-tW or -tWC(または無し)

.exe

実行形式ファイルを作成します。

bcc32 -tW test.txt [ WINAPI WinMain() 、APIENTRY WinMain() 、など ]
[ウィンドウを出したいプログラムなど(32ビット、
Win32アプリ)はこちら。 ]

bcc32 test.txt [ もしくは bcc32 -tWC test.txt : 省略可 : void main() や int main() ]
[API を使わない、純粋 C/C++ 言語のプログラム(16ビット、
コンソールアプリ) はこちら。 ]

両者とも生成されるのは .exe 実行ファイルです。同じ .exe 実行ファイルでも 16 ビットと 32 ビットで、種類が異なるということです。  

-tWD

.dll

DLL(.dll) を生成します。

EXE の場合は -tW でした。DLL(Dinamic Link Library) の場合は、その代わりに -tWD を指定する、というイメージです。

エントリーポイントを決定する関数が、

WinMain なら -tW を指定 (.exe)、
DllMain なら -tWD を指定 (.dll)、
main ならば -tWC もしくは指定無し ( .exe )。


尚、-tWM は、これらと同列の内容を指定するものではないので、例えば、-tWD -tWM と指定する場合がありえます。( 上記 例4 参照 )

bcc32 -tWD test.txt [ DllMain() ]

 

以上に含まれる、-tWx についてたかだか4つ程度、これらの区別をおさえておけば、あとはあまり混乱がありません。以下は、興味の範囲。

-c

.obj

中間オブジェクトファイル (.obj) のみを生成します。

この .obj ファイルは、スタティックライブラリ (.lib) を作りたいときに、tlib.exe とともに活用します。とくに込み入ったことをするのでなければ、.obj ファイルの使い道は他にはありません。

通常のコンパイル時には .exe または .dll などのファイルとともに、 .obj ファイルも常に作成されます。このオプション -c は .obj ファイルのみの生成 を指定するオプションです。

bcc32 -c test.txt

[ これで、test.obj を生成、次に、コマンドラインから、tlib mylibrary +test で、mylibrary.lib を作成、同時に test.obj の内容が mylibrary.lib に追加されます。この mylibrary.lib を使うには、ソースコード内で、#pragma comment( lib , "" ) 指令を記述します。 ※ 詳しくは、tlib.exe 、#pragma について調べましょう ]  

-S

.asm

アセンブリコードを出力(生成)します。

単に、アセンブリを見てみたい、分析したい場合。また、アセンブリコードから細かくコードを組みたい場合。ただし、アセンブリをコンパイルするにはアセンブラ ( assembler ) が必要です。

※ C ベースのコード内で部分的に アセンブリを利用することをインラインアセンブリといいます。インラインアセンブラが必要です。

bcc32 -S test.txt

 

 

A「指定しておかないとまずい」
という類(たぐい) のオプションは、気になるオプションです。


オプション 簡易の説明

どういう場合に指定しなくてはいけないか、及び具体例

 

-tW Win32 アプリ作成の場合。

( ソースプログラム中の、エントリポイントの関数として )
WinMain() を使っている場合は、指定しないとコンパイルできない。

※ この、-tW が いちばん大切です。説明が重複してしまうので、上の、「.dll」 のところも読んでみてください。

bcc32 -tW test.txt

-tWD Win32 DLL作成の場合。

DllMain() を使っている場合 (DLL を作るつもりの場合) は、指定しないとコンパイルできない。

bcc32 -tWD test.txt

-tWM マルチスレッドを扱う場合。

マルチスレッドアプリケーションの場合(且つ、32ビット)は、指定しないとコンパイルできない。参考 : _beginthread() 関数。

bcc32 -tW -tWM test.txt

※ -tWM 単独という指定はありえません。

-f 浮動小数点のエミュレート。

浮動小数点の演算を行う場合、指定しないとコンパイルできない。参考 : float、double 型。

bcc32 -f test.txt

-P 拡張子が .cpp でなくても、C++ のソースとしてコンパイルする。

C++ のソースを書いたつもりでも、拡張子が .cpp でない、つまり .c だったりその他 .txt 、etc... にしてある場合、この「-P」 を付け忘れると、思わぬ落とし穴になります。ただ、C でなく、C++ のソースのつもりならば、.cpp の名前で保存しておくのがベストです。そうすれば、このオプションは気にしなくて済む。

bcc32 -P test.txt [ これで、 C++ としてコンパイルされる。]

参考 : -P- : C または C++ かは、拡張子に従って判別される。何も指定しないのと同じ(デフォルト)。

 

 

B好みに応じてこういうこともできる
という類のオプションとしては、

 
オプション 簡易の説明

説明と具体例

 

-n 出力先ディレクトリを指定します。

bcc32 -nC:\MyDirectory test.txt
[-n"C:\MyDirectory" も可。 スペースを含む場合はこのように " を活用 ]
C:\MyDirectory に出力されます。

-e 出力される実行ファイル名を指定します。

bcc32 -eMyApp.exe test.txt [-e"MyApp.exe" も可。]

通常 test.exe が作成されるところ、MyApp.exe として作成されます。

-I インクルードパス(ディレクトリ)を指定します。

bcc32.cfg に記述するのと同じ。つまり、bcc32.cfg に記述するのでも、コンパイル時 -I を使って指定するのでも、どちらの方法でも良い

bcc32 -I"C:\MyDirectory\MyInclude" test.txt

-L ライブラリパス(ディレクトリ)を指定します。

bcc32.cfg に記述するのと同じ。bcc32.cfg に記述するのでも、コンパイル時 -L を使って指定するのでも、どちらの方法でも良い

注 インクルードパスの通っている場所にある インクルードファイルは、ソースコード内で、「#include <abc.h>」 のようにして、インクルードできますが、ライブラリはどうなのだろう。ライブラリパスを通して(指定して)も、ライブラリがリンクの際に取り込まれない場合があります。そのようなときは、ソース内で、「#pragma comment( lib , "フルパス又はパス" )」 を記述します。インクルードファイルの場合の、#include <abc.h> に相当します。尚、#pragma 指令では、C言語の行末文法シンボル 「;」 は不要です。落とし穴になるので注意してください。

bcc32 -L"C:\MyDirectory\MyLib" test.txt

-D 文字列シンボルを定義します。

ソースコード内で、#define XXX とするかわりに、コンパイル時に -DXXX を指定することでも同じことができます

例1 ソースコード内 「#define DEBUG」 の場合、
  かわりにコンパイル時、 bcc32 -DDEBUG test.txt

例2 ソースコード内 「#define DEBUG I32c」 の場合、
  かわりにコンパイル時
bcc32 -DDEBUG=I32c test.txt

※ コンパイルの場合に応じて、ソースコード内の記述かこちら、便利なほうを使い分けます。

 

 

主観的な分類を試みました。説明書に載っている全てのオプションの数に比べると、はるかに reduce されました。bcc メインで説明しましたが、bcc 以外のコンパイラでも、指定の仕方こそ違え、同じような内容のオプションがあると思います。

 -tW -tWD -tWM -tWC -c -S -f -P -n -e -I -L -D

 

コンパイルがうまくできないときなど、「何かオプションが間違っていたり、足りないのかな?」などと考え出すと、解決策に困ることがあります。「コードが間違っているのか」、それとも「コンパイルの仕方のところが間違っているのか」が分からない、特定にこまるからです。コンパイルの仕方は実は完璧なのに、確信が持てないばかりに、無駄に調べつくすなんてこともあることでしょう。そういうときのための「せめてもの説明」くらいにはなりましょう。

プログラミングをやる以上、プログラム内、ソースコードの記述のこと、だけを考えていたい。だから、そのような場合は、上の「指定しておかないとまずい...」 のところや、こちら を参考にしてください。

 

基本は bcc32 test.txt ( しばしば、bcc32 -tW test.txt ) です。

 

文法的には、 「bcc32 オプション ファイル名」 の形です。例とともに紹介しましたが、結局一行であることは変わりません。また、VC++ や BCB などの統合開発環境では、コンパイルをボタン操作で行うことができます。コンパイルに先立ちオプションを選択しますが、その際、これらのオプションは選択リストから選択する、という形で簡単に行うことができます。ただ、オプション自体の内容を理解していなければ選択しようにも選択できないのが道理なので、プログラミング当初、特に自分独自のプログラムを書き出したとき、のコンパイラオプションにまつわる困難さには、大差がないと思います。また、以上で挙げたことに注意しておけば、おおかた困難というほどではありません。

 


※ 以上は、borland c++ compiler に関する独自の説明を行ったものです。borland 社とは一切関係がありません。内容に関するクレーム等はわたくしにお寄せください。

 

[トップ] [戻る]