从零开始,重新学习windows编程(2)--环境准备,不用IDE编写程序

既然是求甚解,那就要脱离掉IDE,保证每个字符都是经过思考产生出来的,其实我们脱离掉IDE环境,更能够了解到每一步的执行是怎么样的,IDE到底在你选择项目、创建项目的时候为了做了哪些事情,还有一个好处就是,当你想写一个小的测试程序的时候,你就不用打开VC,而直接用文本编辑器编写好,直接在命令行中编译运行就可以看到结果了,节约了不少时间。

下面,我们就来看看怎么做才可以脱离IDE工作。

1. 在VC6安装好的前提下,win+R,输入cmd,在出现的命令行窗口中试下"nmake"命令,如果能执行该命令,那就可以进行下面的操作,否则需要按照步骤2中的操作设置环境变量。如果学习过java的同学,或者使用过linux的同学,应该对这个很熟悉。

2. 在cmd环境下,可以使用echo %path%命令,来显示一下现在系统中的环境变量路径。或者,右键点击“我的电脑”,在出现的“属性”对话框中,选择“Advanced”Tab页,在 “Environment Variables”中,“用户环境变量”里面找到“path”,点击修改。

3. 找到你电脑中nmake.exe所在的地方,我电脑中为“d:\Program Files\Microsoft Visual Studio\VC98\Bin\NMAKE.EXE”,就将“d:\Program Files\Microsoft Visual Studio\VC98\Bin\"这个路径加入到path中,因为有可能大家电脑的环境变量中还有Platform SDK和其他版本VS的路径,所以希望使用哪个,就将哪个放到最前面。
在这个目录下,你还可以看到有其他的exe程序,有些我们之后也会使用到,比如CL.EXE和LINK.EXE,还有一个VCVARS32.BAT之后我们也会稍微介绍一下,当添加了这个路径到环境变量之后,所有该路径下的exe就都可以使用了。

4. 设置完成后,重新开启一个cmd,使用echo %path%命令查看刚刚的路径是否添加上去了,是否是在最前。
再进行步骤1的操作,看看是否可以执行nmake命令。
最终得到的结果为:

1 D: \> nmake
2
3 Microsoft ( R ) Program Maintenance Utility Version 6.00 . 8168.0
4 Copyright ( C ) Microsoft Corp 1988 - 1998 . All rights reserved .
5
6 NMAKE : fatal error U1064: MAKEFILE not found and no target specified
7 Stop .

5. 当设置完NMAKE.EXE成功后,你可以试着执行一下CL.EXE命令,如果报出一个找不到mspdb60.dll,不用慌张,那是因为还有一个路径没有设置。
在 电脑中寻找mspdb60.dll文件,我的电脑中路径为“d:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\MSPDB60.DLL”,从路径名称可以看到,这应该是属于Dev环境的一个公共文件,这里我们 不管它具体的,直接将路径“d:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\"加入path中,刚刚加入的路径之后,两个路径之间记得用英文字符的分号(;)分隔开来。

6. 同样,设置path,重启cmd窗口,echo查看下设置是否成功,然后执行cl,link命令。
结果如下:

1 D: \> cl
2 Microsoft ( R ) 32 -bit C / C ++ Optimizing Compiler Version 12.00 . 8168 for 8 0x86
3 Copyright ( C ) Microsoft Corp 1984 - 1998 . All rights reserved .
4
5 usage: cl [ option ... ] filename ... [ / link linkoption ... ]
link
1 D: \> link
2 Microsoft ( R ) Incremental Linker Version 6.00 . 8168
3 Copyright ( C ) Microsoft Corp 1992 - 1998 . All rights reserved .
4
5 usage: LINK [options] [ files ] [@commandfile]
6
7 options:
8
9 / ALIGN: #
10 / BASE:{address|@filename , key}
11 / COMMENT :comment
12 / DEBUG
13 / DEBUGTYPE:{CV|COFF}
14 / DEF :filename
15 / DEFAULTLIB :library
16 / DELAY:{NOBIND|UNLOAD}
17 / DELAYLOAD :dll
18 / DLL
19 / DRIVER[:{UPONLY|WDM}]
20 / ENTRY :symbol
21 / EXETYPE :DYNAMIC
22 / EXPORT :symbol
23 / FIXED[ :NO ]
24 / FORCE[:{MULTIPLE|UNRESOLVED}]
25 / GPSIZE: #
26 / HEAP :reserve [ , commit]
27 / IMPLIB :filename
28 / INCLUDE :symbol
29 / INCREMENTAL:{YES|NO}
30 / LARGEADDRESSAWARE[ :NO ]
31 / LIBPATH :dir
32 / LINK50COMPAT
33 / MACHINE:{ALPHA|ARM|IX86|MIPS|MIPS16|MIPSR41XX|PPC|SH3|SH4}
34 / MAP[ :filename ]
35 / MAPINFO:{EXPORTS|FIXUPS|LINES}
36 / MERGE :from = to
37 / NODEFAULTLIB[ :library ]
38 / NOENTRY
39 / NOLOGO
40 / OPT:{ICF[ , iterations]|NOICF|NOREF|NOWIN98|REF|WIN98}
41 / ORDER:@filename
42 / OUT :filename
43 / PDB:{filename|NONE}
44 / PDBTYPE:{CON[SOLIDATE]|SEPT[YPES]}
45 / PROFILE
46 / RELEASE
47 / SECTION :name , [E][R][W][S][D][K][L][P][X]
48 / STACK :reserve [ , commit]
49 / STUB :filename
50 / SUBSYSTEM:{NATIVE|WINDOWS|CONSOLE|WINDOWSCE|POSIX}[ ,# [ .## ]]
51 / SWAPRUN:{ CD | NET }
52 / VERBOSE[ :LIB ]
53 / VERSION: # [ .# ]
54 / VXD
55 / WARN[ :warninglevel ]
56 / WINDOWSCE:{CONVERT|EMULATION}
57 / WS :AGGRESSIVE

到这里,我们的环境设置算是完成了一半,下面还有一半是设置库和头文件,首先来看看库和头文件不设置会出现什么情况。

这里做个小例子,照旧例,还是hello world.

随便进入某个目录,创建一个hello.c
内容很简单,printf一串字符吧。

用你最喜爱的文本编辑器写下下面的代码:

1 #include < stdio.h >
2
3   int main()
4 {
5 printf( " abcdefg.\n " );
6 return 0 ;
7 }

然后进入命令行,在命令行中进入代码所在的目录,我这里是d:\test
全部执行过程如下:

1 d: \ test > cl hello . c
2 Microsoft ( R ) 32 -bit C / C ++ Optimizing Compiler Version 12.00 . 8168 for 8 0x86
3 Copyright ( C ) Microsoft Corp 1984 - 1998 . All rights reserved .
4
5 hello . c
6 hello . c ( 1 ) : fatal error C1083: Cannot open include file: 'stdio . h': No such fil
7 e or directory

可以发现没有找到stdio.h,这里在环境变量中还要设置一个头文件的目录。

同样在“用户变量”中查找,找名字为"include"的环境变量是否存在,不存在则新建一个,然后找到你电脑中"stdio.h"所在的路径,我的为“d:\Program Files\Microsoft Visual Studio\VC98\Include\”,将其放到include环境变量对应的value中。

再进行编译

1 d: \ test > cl hello . c
2 Microsoft ( R ) 32 -bit C / C ++ Optimizing Compiler Version 12.00 . 8168 for 8 0x86
3 Copyright ( C ) Microsoft Corp 1984 - 1998 . All rights reserved .
4
5 hello . c
6 Microsoft ( R ) Incremental Linker Version 6.00 . 8168
7 Copyright ( C ) Microsoft Corp 1992 - 1998 . All rights reserved .
8
9 / out :hello . exe
10 hello . obj
11 LINK : fatal error LNK1104: cannot open file " LIBC.lib "

结果出现找不到LIBC.lib错误,关于LIBC.lib,在之后的篇章里面会详细介绍到。我们还是要将其放到环境变量中,同include环境变量,我们同样加上lib这个环境变量在“用户变量”中,对应的值为你找到的LIBC.lib所在的目录,我这里为“D:\Program Files\Microsoft Visual Studio\VC98\lib”,然后再试一把。

1 D: \> cd test
2
3 D: \ test > cl hello . c
4 Microsoft ( R ) 32 -bit C / C ++ Optimizing Compiler Version 12.00 . 8168 for 8 0x86
5 Copyright ( C ) Microsoft Corp 1984 - 1998 . All rights reserved .
6
7 hello . c
8 Microsoft ( R ) Incremental Linker Version 6.00 . 8168
9 Copyright ( C ) Microsoft Corp 1992 - 1998 . All rights reserved .
10
11   / out :hello . exe
12 hello . obj
13
14 D: \ test > hello . exe
15 abcdefg .

大功告成,可以看到cl hello.c就编译出来了hello.exe,执行hello.exe得到输出。 So easy是不是?

这样你就掌握到如何在命令行中编译win32 console Application了,至于其他类型的Application,就需要不同的编译、链接设置以及不同的头文件、库设置而得到,但是基本原理是差不多的。


But这里提几个问题,看看你能不能回答出来。

1. 这里是hello.c,如果是hello.cpp,cl的行为有没有不同?

2. 如果是两个或多个文件,那使用cl是否可以直接编译出来exe文件?

3. 将入口修改为void main()是否可以,或者void start()呢?

4. stdio.h大家都知道是C的标准库内容,windows是如何将它合入到系统中去的呢?

5. 同样,stdio.h只是头文件,而具体函数实现是在lib库中,windows又是如何将其合到exe文件中的呢?

6. 刚刚我们打印的是英文字符,那如果我们要打入中文"你好,世界",结果会怎样,到底是为什么呢?

这其实也是我的疑惑,也是下一篇文章要讨论的内容,暂定题为"hello.c的疑问",我努力解答。

转载于:https://www.cnblogs.com/cnyao/archive/2011/06/08/win32sdkp2_envset.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值