TwitterTwitter FacebookFacebook FlickrFlickr RSSRSS

20071013

console mode 中使用 C/C++ 編譯器

侯捷 1999.04.08


我總是鼓勵 C/C++ 的學習者,在剛接觸這個程式語言的時候,先以 console modeDOS-like)程式為目標。換言之,不要一開始就想寫 GUI 程式、想開視窗、想有眩目亮麗的畫面 -- 那只是未走先飛,揠苗助長罷了。

所謂 console 程式,就是文字模式的程式,我們可以在其中好好把 C/C++ 的語言根基練好,而不會分心於其他暫無必要的 GUI 枝節上。

我一直以為,這是理所當然的事情,卻也一直發現,有不少大專院校的大一 C/C++ 課程,同學們必須寫個小作家、小畫家、小算盤做為期中或期末作業。

果然世界不能大同,各人看法殊異 :)

我不但認為 C/C++ 程式開發對象初期要以 console mode 為主,我也認為,C/C++ 的程式開發環境,初期也要以 console mode 為主。換言之,不要一開始就進入整合環境(IDE)。整合環境中那麼多視窗、那麼多功能、那麼多預設值,會讓程式新手眼花撩亂,無法掌握程式編譯過程中一些有價值的知識與經驗。


等我們對編譯程序有了起碼的瞭解,再來使用整合環境,我認為這才最好。

所以不論在 <深入淺出 MFC> <多型與虛擬> 書籍中,我都會簡述console mode 下的作業方式。<深入淺出 MFC> p.224 列出,<多型與虛擬> p.233 列出。

但仍然偶而會收到網友(不論是否上兩本書的讀者)的詢問,詢問console mode 的編譯方式,或詢問他們所遭遇的問題。

我再次整理這個題目。再有類似問題,我就可以整篇 mail 給發問者了。

★★
注意:以下適合 PC 環境 ★★


●C/C++ 編譯器需要的環境變數設定

古早以來,PC 上的 C 編譯器,就需要兩個環境變數:

LIB
:這個環境變數告訴編譯器說,必要的 libraries 在哪裡(哪個磁碟目錄下)
INCLUDE
:告訴編譯器說,必要的 header files 在哪裡(哪個磁碟目錄下)

另外,為了讓我們能夠在任何 working directory 都叫得到編譯器,當然我們必須設定 PATH

從古早以來,一直到現在,C/C++ 編譯器都需要這三個環境變數。


Visual C++ 為例

Visual C++ 為例,如果安裝後的檔案佈局如下:

C:MSDEVVC98BIN :
這裡放有編譯器 CL.EXE
C:MSDEVVC98INCLUDE :
這裡放有
C/C++ header files
C:MSDEVVC98LIB :
這裡放有
C/C++ standard libraries

那麼你可以寫一個批次檔如下:


set PATH=C:MSDEVVC98BIN;C:MSDEVCOMMONMSDEV98BIN
set INCLUDE=C:MSDEVVC98INCLUDE
set LIB=C:MSDEVVC98LIB


之所以需要另外設定 PATH=C:MSDEVCOMMONMSDEV98BIN,是因為編譯器 CL.EXE 執行時需要 MSPDB60.DLL,而它被安裝於 C:MSDEVCOMMONMSDEV98BIN 之中。

如果你寫的程式不只是單純的 C/C++ 程式,還用到了 MFC,一樣可以在 console mode 下編譯,這時候你的環境變數應該如此設定:

set PATH=C:MSDEVVC98BIN;C:MSDEVCOMMONMSDEV98BIN
set INCLUDE=C:MSDEVVC98INCLUDE;C:MSDEVVC98MFCINCLUDE
set LIB=C:MSDEVVC98LIB;C:MSDEVVC98MFCLIB


多指定了 MFCINCLUDE MFCLIB,就可以讓編譯器和聯結器找到 MFC header files libraries。如果你還需要用到 ATL,就得在 INCLUDE 環境變數中再加上 C:MSDEVVC98ATLINCLUDE


Borland C++Builder 為例

Borland C++Builder 為例,如果安裝後的檔案佈局如下:

C:BORLANDCBuilder3BIN :
這裡放有編譯器 BCC32.EXE
C:BORLANDCBuilder3INCLUDE :
這裡放有
C/C++ header files
C:BORLANDCBuilder3LIB :
這裡放有
C/C++ standard libraries

那麼你可以寫一個批次檔如下:


set PATH=C:BORLANDCBuilder3BIN
set INCLUDE=C:BORLANDCBuilder3INCLUDE
set LIB=C:BORLANDCBuilder3LIB



如何在 console 中編譯 C/C++ 程式

首先,開啟一個 DOS BoxDOS Prompt, DOS VM),然後在該 DOS box 中執行上述寫好的批次檔,完成環境變數的設定。你可以再在 DOS 提示號下鍵入 set 命令,看看環境變數的設定內容正確與否。

然後就可以直接在 DOS 提示號下鍵入編譯器名稱,開始編譯了。如果你使用 Visual C++,就這麼做:

C:> CL test.cpp <Enter>

如果你使用 C++Builder,就這麼做:

C:> BCC32 test.cpp <Enter>

至於特殊情況下需要什麼特殊的 options,就必須自己查一下啦。只要執行 CL /? BCC32(其後不加任何引數),便可看到所有的 compile options


編譯器與聯結器的關係

早期的編譯過程與聯結過程是分開的。換句話說我們必須做兩個動作:

C:> Cl test.cpp
C:> LINK test.obj xxx
xxx 代表各個必要的 libraries

或是:

C:> BCC32 test.cpp
C:> TLINK32 test.obj xxx
xxx 代表各個必要的 libraries


如今的編譯過程與聯結過程當然還是分開的,但是我們的動作只需一個:

C:> CL test.cpp

或是:

C:> BCC32 test.cpp

這是因為編譯器變聰明了,除非你指定 /c option(表示只編譯不聯結),否則它便自動為你呼叫聯結器進行聯結動作。過去以來頗令 programmer煩惱的「該使用哪些 libraries」的問題,編譯器也有了聰明的解決方案:它將程式中用到的 library functions 記錄起來,同時也錄下它們所屬的library 名稱,於是聯結器就可以從這個表格中知道要聯結哪些 libraries 了。


環境變數與 DOS VMVirtual Machine)的關係

你可以同時開起多個 DOS Box,但是你不能夠在某個 DOS Box 中執行上述批次檔而在另一個 DOS VM 中享受其環境設定。

這是因為每個 DOS Box 都是一個 Virtual Machine,彼此誰也看不到誰,互不相干。

除非你在 autoexec.bat 中就設定好上述那些環境變數。這麼一來,任何一個新開啟的 DOS VM 便會因為繼承最原始的 DOS VM 環境,而繼承了那些變數設定。


環境空間(environment space)不足

最易造成大家困擾的,就是環境空間(environment space)不足的問題。

當你安裝好 Visual C++,會在其 BIN 子目錄中發現一個名為 VCVARS32.BAT 的檔案。這個檔案其實就是做上述的環境變數設定動作(這在 Visual C++ 安裝過程的最後一個步驟有說明。哎,有多少人安裝軟體不看說明!)。所以,你可以在任何 DOS Box 中執行此檔,取代前述我們自己的批次檔。

但是通常大家都有失敗的經驗,得到 "Out of environment space" 的錯誤訊息。這是因為 VCVARS32.BAT 使用以下句法:

set INCLUDE=%MSVCDir%ATLINCLUDE;%MSVCDir%INCLUDE;%MSVCDir%MFCINCLUDE;%INCLUDE%
set LIB=%MSVCDir%LIB;%MSVCDir%MFCLIB;%LIB%


意思是把 INCLUDE 的原始設定(%INCLUDE%)再附加其他設定,並把LIB 的原始設定(%LIB%)再附加其他設定。如果原始設定已經很長,多來這麼幾次,便 "Out of environment space" 啦!

做法之一是調高環境空間的大小。請在 c:config.sys 檔中加上這行:

shell=C:COMMAND.COM C: /E:1024 /P

其中 /E:1024 便是表示將環境空間調為 1024 bytes。(不夠?再調)

做法之二是不要使用 VCVARS32.BAT 的那種「附加」句型,改用前述我們自己的批次檔。要知道,我們可能有好幾個編譯器環境(VCBCBG++ ┅),需要輪番測試我們的程式;如果使用「附加」句型,多來幾次,再大的環境空間也會消磨殆盡。

方法一和方法二要雙管齊下唷。


有任何規模上的限制嗎?

使用 console 模式(或稱 command line 模式)來編譯聯結程式,程式的大小可否有任何規模上的限制?答案是沒有!

它的缺點是沒有工具幫你管理檔案、沒有預設值讓你少打幾個字、沒有分析工具幫你整理 objects,讓你瀏覽 objectssymbols┅。所以一旦你基本功學會了,要開始中大型程式的設計,當然以整合環境(IDE)為佳。


不要誤會

我這不是開倒車,要大家回到茹毛飲血的時代,都回頭去做山頂洞人。而是我覺得,對於一位 C/C++ 初學者,整合環境(IDE)的運用恐怕帶來一頭霧水,不如先在 console mode 下作業。一方面多認識一些環境設定方面的常識,滿好的,一方面比較方便好用,也不必寫個 1000 行的小小練習還得啟動 五五加農炮,一方面求知的力量可以全部放在語言的練習上頭。

等有了一定的程度,再使用整合環境,就不會如墜五里霧了。

-- the end



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=371697

 
PUMA螢光夜跑