您的位置:首页 > 编程语言 > C语言/C++

在 console mode 中使用 C/C++ 编译器 - 侯捷

2012-04-19 09:46 246 查看
★★ 注意:以下适合 PC 环境 ★★

● C/C++编译器需要的环境变数设定

古早以来,PC 上的 C 编译器,就需要两个环境变数:

LIB:这个环境变数告诉编译器说,必要的 libraries 在哪里(哪个磁碟目录下)

INCLUDE:告诉编译器说,必要的 header files 在哪里(哪个磁碟目录下)

另外,为了让我们能够在任何 working directory 都叫得到编译器,当然我们必须设定 PATH。

从古早以来,一直到现在,C/C++ 编译器都需要这三个环境变数。

● 以 Visual C++为例

以 Visual C++ 为例,如果安装後的档案布局如下:

C:/MSDEV/VC98/BIN : 这里放有编译器 CL.EXE

C:/MSDEV/VC98/INCLUDE : 这里放有 C/C++ header files

C:/MSDEV/VC98/LIB : 这里放有 C/C++ standard libraries

那麽你可以写一个批次档如下:

set PATH=C:/MSDEV/VC98/BIN;C:/MSDEV/COMMON/MSDEV98/BIN

set INCLUDE=C:/MSDEV/VC98/INCLUDE

set LIB=C:/MSDEV/VC98/LIB

之所以需要另外设定 PATH=C:/MSDEV/COMMON/MSDEV98/BIN,是因为编译器 CL.EXE 执行时需要MSPDB60.DLL,而它被安装於 C:/MSDEV/COMMON/MSDEV98/BIN 之中。

如果你写的程式不只是单纯的 C/C++ 程式,还用到了 MFC,一样可以在 console mode下编译,这时候你的环境变数应该如此设定:

set PATH=C:/MSDEV/VC98/BIN;C:/MSDEV/COMMON/MSDEV98/BIN

set INCLUDE=C:/MSDEV/VC98/INCLUDE;C:/MSDEV/VC98/MFC/INCLUDE

set LIB=C:/MSDEV/VC98/LIB;C:/MSDEV/VC98/MFC/LIB

多指定了 MFC/INCLUDE 和 MFC/LIB,就可以让编译器和联结器找到 MFC 的 header files 和libraries。如果你还需要用到 ATL,就得在 INCLUDE 环境变数中再加上C:/MSDEV/VC98/ATL/INCLUDE。

● 如何在 console 中编译 C/C++程式

首先,开启一个 DOS Box(DOS Prompt, DOS VM),然後在该DOS box 中执行上述写好的批次档,完成环境变数的设定。你可以再在 DOS 提示号下键入 set命令,看看环境变数的设定内容正确与否。

然後就可以直接在 DOS 提示号下键入编译器名称,开始编译了。如果你使用 Visual C++,就这麽做:

C:/> CL test.cpp

如果你使用 C++Builder,就这麽做:

C:/> BCC32 test.cpp

至於特殊情况下需要什麽特殊的 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」的问题,编译器也有了聪明的解决方案:它将程式中用到的 libraryfunctions 记录起来,同时也录下它们所属的library 名称,於是联结器就可以从这个表格中知道要联结哪些 libraries了。

● 环境变数与 DOS VM(VirtualMachine)的关系

你可以同时开起多个 DOS Box,但是你不能够在某个 DOSBox 中执行上述批次档而在另一个 DOS VM 中享受其环境设定。

这是因为每个 DOS Box 都是一个 Virtual Machine,彼此谁也看不到谁,互不相干。

除非你在 autoexec.bat 中就设定好上述那些环境变数。这麽一来,任何一个新开启的 DOS VM 便会因为继承最原始的 DOSVM 环境,而继承了那些变数设定。

● 环境空间(environmentspace)不足

最易造成大家困扰的,就是环境空间(environmentspace)不足的问题。

当你安装好 Visual C++,会在其 BIN 子目录中发现一个名为 VCVARS32.BAT的档案。这个档案其实就是做上述的环境变数设定动作(这在 Visual C++安装过程的最後一个步骤有说明。哎,有多少人安装软体不看说明!)。所以,你可以在任何 DOS Box中执行此档,取代前述我们自己的批次档。

但是通常大家都有失败的经验,得到 "Out of environment space"的错误讯息。这是因为 VCVARS32.BAT 使用以下句法:

setINCLUDE=%MSVCDir%/ATL/INCLUDE;%MSVCDir%/INCLUDE;%MSVCDir%/MFC/INCLUDE;%INCLUDE%

set LIB=%MSVCDir%/LIB;%MSVCDir%/MFC/LIB;%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的那种「附加」句型,改用前述我们自己的批次档。要知道,我们可能有好几个编译器环境(VC、BCB、G++┅),需要轮番测试我们的程式;如果使用「附加」句型,多来几次,再大的环境空间也会消磨殆尽。

方法一和方法二要双管齐下唷。

● 有任何规模上的限制吗?

使用console 模式(或称 command line 模式)来编译联结程式,程式的大小可否有任何规模上的限制?答案是没有!

它的缺点是没有工具帮你管理档案、没有预设值让你少打几个字、没有分析工具帮你整理 objects,让你浏览objects、symbols┅。所以一旦你基本功学会了,要开始中大型程式的设计,当然以整合环境(IDE)为佳。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: