- 浏览: 1542911 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (532)
- 软件设计师 (7)
- PSP (5)
- NET MD (9)
- Hibernate (8)
- DIY (51)
- Work (43)
- GAME (24)
- 未分类 (44)
- iPod (6)
- MySQL (39)
- JSP (7)
- 日语能力考试 (36)
- 小说 (4)
- 豆包网 (23)
- 家用电脑 (7)
- DB2 (36)
- C/C++ (18)
- baby (9)
- Linux (13)
- thinkpad (23)
- OA (1)
- UML (6)
- oracle (24)
- 系统集成 (27)
- 脑梗塞 (6)
- 车 (8)
- MainFrame (8)
- Windows 7 (13)
- 手机 (8)
- git (12)
- AHK (2)
- COBOL (2)
- Java (9)
最新评论
-
安静听歌:
... ...
UUID做主键,好还是不好?这是个问题。 -
lehehe:
http://www.haoservice.com/docs/ ...
天气预报 -
lehehe:
[url http://www.haoservice.com/ ...
天气预报 -
liubang201010:
监控TUXEDO 的软件推荐用这个,专业,权威.并能提供报警和 ...
(转载)Tuxedo中间件简介 -
tinkame:
Next[j] =-1 当j=0时;=Max{k|0<k ...
KMP字符串模式匹配详解
在 console mode 中使用 C/C++ 编译器
侯捷 1999.04.08
我总是鼓励 C/C++ 的学习者,在刚接触这个程式语言的时候,先以 console mode(DOS-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:\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=%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)为佳。
●不要误会
我这不是开倒车,要大家回到茹毛饮血的时代,都回头去做山顶洞人。而是我觉得,对於一位 C/C++ 初学者,整合环境(IDE)的运用恐怕带来一头雾水,不如先在 console mode 下作业。一方面多认识一些环境设定方面的常识,满好的,一方面比较方便好用,也不必写个 1000 行的小小练习还得启动 五五加农炮,一方面求知的力量可以全部放在语言的练习上头。
等有了一定的程度,再使用整合环境,就不会如坠五里雾了。
-- the end
发表评论
-
(转)const参数,const返回值与const函数
2014-11-14 17:29 812原文地址:http://04 ... -
(转)在 Eclipse 中配置编译 Pro*C
2010-08-09 17:49 2033http://blog.csdn.net/gjl2004yn/ ... -
(转)Pro*C 程序概述
2010-06-30 10:24 1138http://blog.csdn.net/amandake ... -
(转)什么是Pro*C/C++
2010-06-30 10:22 2313http://blog.csdn.net/hwz119/a ... -
(转)oracle中pro*c的学习
2010-06-30 10:17 1486http://www.qqread.com/ora ... -
(转)gcc and g++编译器和gdb调试器
2010-02-23 15:09 1864http://d.download.csdn.net/d ... -
(转)GDB 命令详细解释
2010-02-23 15:05 1524http://blog.csdn.net/wei801004/ ... -
CC和gcc是一样的编译器吗?
2009-06-15 17:06 2826楼主anysisze(张)2006-07-20 21:4 ... -
gcc常用参数,备忘
2009-06-12 14:45 1476gcc常用参数,备忘收藏 1. 头文件象conio ... -
请教关于标准C中findfirst()函数的用法!谢谢
2009-06-03 17:45 5049http://www.9php.com/FAQ/cx ... -
用strtok()函数提取分隔符隔开的每个字符串
2009-05-22 14:45 4171http://www.cplusplus.com/refere ... -
printf格式控制符的完整格式
2009-03-25 10:39 3205printf格式控制符的完整格式(2006-2-17 14: ... -
iconv 转码编程简介
2009-03-24 17:39 4402glibc带了一套转码函数 ... -
iconv 的使用方法
2009-03-24 17:38 1477iconv 的使用方法 iconv---编码转换用法: ic ... -
(C语言)头文件实现的函数
2009-03-18 17:43 4450(C语言)头文件实现的函数 http://www.diy ... -
C语言库函数大全(字母a)---使用说明(转)
2009-03-18 17:43 1618C语言库函数大全(字母 ... -
Converting Strings To/From Ints:atoi, itoa, sprint
2009-03-18 16:41 1412Converting Strings To/From Int ...
相关推荐
对于初学者来说,了解如何在console mode(命令行模式)下使用C/C++编译器是至关重要的。这是因为命令行环境可以让开发者更专注于语言本身,而不是复杂的图形用户界面(GUI),从而更好地掌握编程基础。 在console ...
熬夜一年多,终于把C/C++语言反编译器的演示版本搞出来了! 目前C语言的基本反编译功能已完成,C++部分刚刚开了个头,正在开发中。此版本非常不稳定,仅做演示用!它能很好的反编译自带的56个测试例子,但对于大家...
liblogger : A logging framework for C / C++ 0.2 Features liblogger is a logging framework for C / C++, with the following features : Transparent Logging to file / console / network. Supports ...
在这个项目中,我们看到的是一个基于C/C++语言实现的简单贪吃蛇版本,使用了Windows API进行控制台操作,没有使用图形用户界面(GUI)。 **C/C++编程基础** 1. **C/C++语言特点**:C/C++是两种强大的、高效的编程...
通过上述步骤,我们可以看到C/C++与C#混合编程的实现方法不仅可行,而且在实际应用中具有很高的灵活性和实用性。托管C++作为一种桥梁技术,在实现跨语言调用方面发挥了关键作用,使得开发者能够在充分利用各自语言...
C/C++Console.tsp
本文将详细介绍如何在C#中使用P/Invoke调用C/C++ DLL中的函数,并处理输入、输出字符串参数和结构类型参数。 首先,我们需要理解P/Invoke的概念。P/Invoke是.NET框架提供的一种机制,用于使托管代码能够访问非托管...
在C/C++中,可以使用标准输入`scanf`或`cin`来获取用户输入,或者在GUI中使用控件如文本框。 2. 数据存储:登录信息通常需要保存,以便进行验证。一种简单的方法是使用文本文件存储账号和对应的加密密码。更安全的...
在C/C++编程环境中,有时候我们可能需要使用到类似VBScript中的`InputBox`功能,即弹出一个对话框让用户输入信息。由于C/C++的标准库并没有直接提供这样的功能,尤其是对于初学者来说,实现一个完整的对话框界面可能...
在开始之前,假设读者已经了解了如何安装Eclipse以及如何在Eclipse中编写C/C++程序。关于Eclipse的安装指南,请参考以下链接: - [Eclipse On Linux](http://pl.csie.ntut.edu.tw/~ctchen/pdf/EclipseOnLinux.pdf) -...
- 在搜索框中输入“C++”,找到并安装官方提供的“C/C++”扩展。 3. **安装Microsoft Visual C++(MSVC)编译器工具集**: - 如果您已经安装了最新的Visual Studio,请通过“开始”菜单打开Visual Studio安装程序...
《C/C++練習150題》是一个针对C++初学者设计的编程练习集合,旨在帮助学习者从基础开始逐步掌握C++编程语言。在这个练习集中,你将找到涵盖不同难度级别的问题,覆盖了C++的核心概念和技术,包括基本语法、数据类型...
Dev-C++ is a full-featured Integrated Development Environment (IDE) for the C/C++ programming language. It uses Mingw port of GCC (GNU Compiler Collection) as it's compiler. It can creates native Win...
在Windows环境下,使用C或C++编程语言进行文件和文件夹操作是一项常见的任务。Visual Studio 2017(VS2017)为开发者提供了丰富的库和工具来支持这样的功能。本文将深入探讨如何在VS2017中编写代码来删除文件夹及其...
- 在Visual Studio 2008中,创建一个新的C++项目,选择Console Application模板。 - 引入必要的头文件,如`<fstream>`,`<sstream>`,`<string>`等。 - 使用`ifstream`对象打开CSV文件,用`getline()`读取每一行...
例如,托管代码中使用指针时需要考虑垃圾回收的影响,而引用则是一个保留字,用于访问托管对象。 8. 包含规则(Rules of Containment):在C++/CLI中,托管代码可以包含本地代码,反之亦然。这提供了编写混合语言...
在C#中,你可以使用.NET Framework或.NET Core的库来实现与SYSMAC Gateway的连接。这些库通常包括类和方法,用于建立网络连接、发送指令以及接收设备响应。例如,可能有一个`SysmacGatewayClient`类,它包含`Connect...