如何在console mode下顺利编译windows程序

原创 2001年08月26日 18:18:00

  相信看了侯捷《在 console mode 中使用 C/C++ 编译器》一文的朋友都有跃跃欲试的感觉,想在console mode下编译自己的程序,然而当自己这样做时,会碰到很多问题,编译比较简单的console程序还好,但是当你编译windows程序时就会发现,根本就通不过,很多link错误,为什么会出现这种情况呢,这与windows程序有关,windows程序不同于以往的dos程序,他需要很多库文件的支持,且让我们先看看侯捷的文章,知道一下如何设置一些基本的东西:
>★★ 注意:以下适合 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。
>
>
>●以 Borland C++Builder 为例
>
>以 Borland C++Builder 为例,如果安装後的档案布局如下:
>
>C:/BORLAND/CBuilder3/BIN : 这里放有编译器 BCC32.EXE
>C:/BORLAND/CBuilder3/INCLUDE : 这里放有 C/C++ header files
>C:/BORLAND/CBuilder3/LIB : 这里放有 C/C++ standard libraries
>
>那麽你可以写一个批次档如下:
>
>set PATH=C:/BORLAND/CBuilder3/BIN
>set INCLUDE=C:/BORLAND/CBuilder3/INCLUDE
>set LIB=C:/BORLAND/CBuilder3/LIB
>
>
>●如何在 console 中编译 C/C++ 程式
>
>首先,开启一个 DOS Box(DOS 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 VM(Virtual 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=ir/ATL/INCLUDE;ir/INCLUDE;ir/MFC/INCLUDE;%
>set LIB=ir/LIB;ir/MFC/LIB;%
>
>意思是把 INCLUDE 的原始设定(%)再附加其他设定,并把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)为佳。
>
>
>●不要误会
>
>我这不是开倒车,要大家回到茹毛饮血的时代,都回头去做山顶洞人。而是我觉得,对於一位 C/C++ 初学者,整合环境(IDE)的运用恐怕带来一头雾水,不如先在 console mode 下作业。一方面多认识一些环境设定方面的常识,满好的,一方面比较方便好用,也不必写个 1000 行的小小练习还得启动 五五加农炮,一方面求知的力量可以全部放在语言的练习上头。
>
>等有了一定的程度,再使用整合环境,就不会如坠五里雾了。


    不知道的朋友可以按上面的设定一下,编译windows程序时,我们需要在参数上设定,cl的语法是这样的CL  [option...] file... [option | file]... [lib...] [@command-file] [/link link-opt...],其中的option一般可以不管,@command-file等一会儿再说,关键问题在lib上,编译windows程序时我们必须设定这项,如加上user32.lib,gdi32.lib等,举个实例来说,比如我们写了一个名为hello.cpp的windows application,我们可以这样编译:cl hello.cpp user32.lib gdi32.lib  就是这样简单。
   通常我们可能不知道要用哪些.lib文件,根据不同程序而定,那么一个很好的方法就是把所有的可能的.lib文件名都加在后面,好当然很好了,但是同时也给我们带来了不少麻烦----我们每次都要键入这么多的字母,很繁琐。幸好还有一个编译选项@command-file,它可以减少我们的输入量,我们可以把所有的.lib文件名都放在这个文件礼,存放于当前目录下,比如取名为lib(我们姑且不要后缀名),于是编译时可以这样输入:cl hello.cpp @lib 是不是很简单,大家快去试试吧,在console mode下编译可以让我们更加熟悉compiler选项的设定。
  注:常用的.lib文件如下
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

在windows下编译某linux源码

最近编译了一份linux下写的源码,源码中并无跨平台相关的代码,因此win下无法直接编译,而且源码较多,在linux下./configure 后make,make install很容易就编译并使用。 ...
  • sguotciq2
  • sguotciq2
  • 2015年01月23日 09:51
  • 2116

如何在Windows下使用Linux系统来编译和运行程序?

很多开发人员都有这样的疑问:自己平时是在Windows下面办公的,而自己编写的程序的运行环境又是Linux的,如何从Windows切换到Linux呢?是不是要专门到Linux机器上去编写代码呢?实际上...
  • zhouzxi
  • zhouzxi
  • 2015年04月21日 14:38
  • 6811

windows环境下编译运行C语言程序(…

首先写一个完好的C语言程序,可以运行的通,自然是简单就好,下面给出一个简单的示例供参考: #include int main(void) {  char *string = "Hello World...
  • CHINAonlyQiu
  • CHINAonlyQiu
  • 2013年08月23日 15:08
  • 2598

Linux 下重新编译Windows下生成的Qt工程 .

以下内容未经测试通过,待我到时候测试通过时会验证相关方案和更新相关问题的解决措施。   --------------------------------------------------------...
  • Fanpei_moukoy
  • Fanpei_moukoy
  • 2014年03月20日 13:43
  • 1379

windows命令行下编译、运行c程序

在windows操作系统中,运行一个c程序,首先必须安装一个c语言编译器,如Visual C++ 6.0,然后建立这个源程序,并以“.c”作为文件的扩展名,例如在D盘theC文件夹下(D:\theC)...
  • qq_33312747
  • qq_33312747
  • 2015年12月23日 16:41
  • 680

在Windows上编译mono

There are two ways of building Mono on Windows, both do require a Cygwin setup which provides some t...
  • x_studying
  • x_studying
  • 2016年05月01日 23:52
  • 1490

如何实现在Windows下编写的代码,直接在Linux下编译

方法一:   如何实现在Windows7下编写Linux程序,写完程序以后,不用拷贝文件,直接在Linux(RHEL6.5)机器上编译最新的代码。 1.首先将Window...
  • A493203176
  • A493203176
  • 2017年04月20日 00:04
  • 1179

如何在Windows环境的域中顺利更新Ubuntu

最近在公司的域环境下切换操作系统,切换系统为ubuntu,在firfox下可以通过设置代理进行访问,但是在apt-get  update 操作的时候,是无法上网的,报的错误所不能访问, 502 错误和...
  • thisisvoa
  • thisisvoa
  • 2013年07月26日 14:01
  • 837

Windows Console的字符集和编码问题

最近在玩Hadoop和Hive, 因为这类框架还处在必须使用命令行交互的阶段。 不得不使用Windows Command 来访问hive。 (要问我问什么要再windows上装hadoop, 因为我没...
  • tiimfei
  • tiimfei
  • 2014年03月12日 13:43
  • 1818

Java程序Console编译执行

还是IDE习惯了,以至于忘记了如何手动构建编译Java程序。今天写一个Flag作为警醒,以后IDE可以用,也会经常用,但是也不能忘记其背后的核心原理。默认包路径Java文件的编译执行: public ...
  • u010455714
  • u010455714
  • 2017年06月20日 16:43
  • 80
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何在console mode下顺利编译windows程序
举报原因:
原因补充:

(最多只允许输入30个字)