<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_乱想乱写飞舞之空间</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/61482/rss</id><updated>2012-04-01T14:29:21Z</updated><author><name>cnyao</name><uri>http://www.cnblogs.com/cnyao/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cnyao/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/61482/rss"/><entry><id>http://www.cnblogs.com/cnyao/archive/2012/04/01/winsdk9_encoding.html</id><title type="text">从零开始，学习windows编程（9）-- 字符编码以及国际化（1）</title><summary type="text">前言前面写的8篇文章，基本上将VC环境下命令行模式程序的入口，以及链接库的知识进行了介绍，基本可以告一段落了。至于kernel32.lib包括后面的user32.lib等，之后介绍win32应用程序(Win32 Application)的时候会介绍到，这里就不展开了。另外，忽然想到，这里写的程序都是win32程序，至于64位的程序，具体还没有开发过，也就不涉及了，以后如果业务上使用到的时候，再具体研究之后加上。这里新的话题就是字符编码以及国际化的问题。在写完这个话题之后，我们就将开始"Win32 Application"的旅程。从一个例子开始既然你在看这篇文章，那我就假定你</summary><published>2012-04-01T14:12:00Z</published><updated>2012-04-01T14:12:00Z</updated><author><name>cnyao</name><uri>http://www.cnblogs.com/cnyao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cnyao/archive/2012/04/01/winsdk9_encoding.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cnyao/archive/2012/04/01/winsdk9_encoding.html"/><content type="html">&lt;p&gt;&lt;strong&gt;前言&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;前面写的8篇文章，基本上将VC环境下命令行模式程序的入口，以及链接库的知识进行了介绍，基本可以告一段落了。至于kernel32.lib包括后面的user32.lib等，之后介绍win32应用程序(Win32 Application)的时候会介绍到，这里就不展开了。另外，忽然想到，这里写的程序都是win32程序，至于64位的程序，具体还没有开发过，也就不涉及了，以后如果业务上使用到的时候，再具体研究之后加上。&lt;/p&gt;&lt;p&gt;这里新的话题就是字符编码以及国际化的问题。在写完这个话题之后，我们就将开始"Win32 Application"的旅程。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;从一个例子开始&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;既然你在看这篇文章，那我就假定你是一个开发者，并且对于ANSI，ASCII，Unicode，UTF8这些名词都有所了解，至少是听说过这些概念。因为这个例子中，我们就会使用到这些概念。如果你对于这些概念不熟悉，那请先从我的&amp;ldquo;参考&amp;rdquo;链接中找到对应的条目进行研究，然后再开始做这个例子。&lt;/p&gt;&lt;p&gt;OK，那我们就可以开始了。首先，打开你的Notepad，中文系统中叫做&amp;ldquo;记事本&amp;rdquo;。下面是一个空的打开的记事本：&lt;/p&gt;&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" src="http://pic002.cnblogs.com/images/2012/91649/2012040122001756.png" alt="" border="0" /&gt;&lt;/p&gt;&lt;p&gt;我们来输入一些文字。&lt;/p&gt;&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" src="http://pic002.cnblogs.com/images/2012/91649/2012040122004214.png" alt="" border="0" /&gt;&lt;/p&gt;&lt;p&gt;我们现在输入了一行中文，一行英文，并且带了一些标点符号，同时有一个换行符。&lt;/p&gt;&lt;p&gt;将其保存起来，命名为"hello.txt"，位置放在"d:\test"目录下。&lt;/p&gt;&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" src="http://pic002.cnblogs.com/images/2012/91649/2012040122010117.png" alt="" border="0" /&gt;&lt;/p&gt;&lt;p&gt;到文件管理器下，我们可以看到hello.txt这个文件，大小为27个byte。&lt;/p&gt;&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" src="http://pic002.cnblogs.com/images/2012/91649/2012040122013162.png" alt="" border="0" /&gt;&lt;/p&gt;&lt;p&gt;现在我们需要用一些其他的辅助工具，我这里用的是Notepad++以及它的一个叫HexEditor的插件，不喜欢使用的同学们可以用其他类似的工具代替，如WinHex或HexEdit等十六进制编辑器。用工具将这个txt文件打开，来看看这27个byte是怎么组成的。&lt;/p&gt;&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" src="http://pic002.cnblogs.com/images/2012/91649/2012040122015954.png" alt="" border="0" /&gt;&lt;/p&gt;&lt;p&gt;打开文件后，点击工具栏上的&amp;ldquo;H&amp;rdquo;图标，我们来看看十六进制。&lt;/p&gt;&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" src="http://pic002.cnblogs.com/images/2012/91649/2012040122024097.png" alt="" border="0" /&gt;&lt;/p&gt;&lt;p&gt;其实这里的对应是有些小问题的，对于中文的部分，dump出来的映射关系在移动光标的时候有些不准确，但是这个并不是影响很大，我们可以忽略。我们可以挑选其中几个来看看，这里的&amp;ldquo;你&amp;rdquo;对应的十六进制为&amp;ldquo;c4 e3&amp;rdquo;，也就是0xC4E3；"l"对应的十六进制为"6c"，即0x6C。我们在这里看到的映射关系，就叫做字符编码(character encoding)，而所有字符编码的集合，我们叫做字符集(character set--charset)。&lt;/p&gt;&lt;p&gt;我们在这里看到的是ANSI编码的，可以回过来看一下&amp;ldquo;保存&amp;rdquo;的那个截图，最下方的"encoding"选择的是"ANSI"。我们在保存文件的时候，还可以有其他选择。用saveas来另存一下。&lt;/p&gt;&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" src="http://pic002.cnblogs.com/images/2012/91649/2012040122030885.png" alt="" border="0" /&gt;&lt;/p&gt;&lt;p&gt;可以看到，除了ANSI选项外，我们还有3个选项。&lt;/p&gt;&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" src="http://pic002.cnblogs.com/images/2012/91649/2012040122040180.png" alt="" border="0" /&gt;&lt;/p&gt;&lt;p&gt;这里我们选择使用"unicode"，其他两个也是unicode的概念，只不过是不同形式的表示，我们之后会进行解释，将其保存为"hello_unicode.txt"，从文件管理器中查看，其大小为44个byte。同样的内容，换了不同的encoding，大小也变得不同了。来看看到底是为什么吧。&lt;/p&gt;&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" src="http://pic002.cnblogs.com/images/2012/91649/2012040122042662.png" alt="" border="0" /&gt;&lt;/p&gt;&lt;p&gt;我们也将其用Notepad++打开，查看其十六进制。&lt;/p&gt;&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" src="http://pic002.cnblogs.com/images/2012/91649/2012040122052181.png" alt="" border="0" /&gt;&lt;/p&gt;&lt;p&gt;这里Dump出来怎么都是&amp;ldquo;乱码&amp;rdquo;呀？不要慌张，这是因为dump使用的是ANSI编码显示，而现在我们用的是unicode编码。这里文件最前面的"ff fe"是用来判断"大小端"的，如果你学过TCP/IP或者计算机基础课程，那应该对于这个概念比较熟悉，如果不熟悉，那就搜索一下"littlen endian, big endian"来看看吧，这个对于文件是需要的，但是对于字符串等在内存中的字符表示，就不需要了，所以这里只需要了解就可以了。字符&amp;ldquo;你&amp;rdquo;的对应十六进制编码为"60 4f"，而这里是小端模式，即0x4F60。要验证的话，也很简单，我博客中有篇文章中已经介绍过了，可以参考&lt;a href="http://www.cnblogs.com/cnyao/archive/2010/11/11/1875037.html"&gt;巧用WORD进行字符与Unicode字符的转换&lt;/a&gt;中的内容，用word来验证一下。&lt;/p&gt;&lt;p&gt;当你有耐心看到这里，并且明白了我上面所写的内容的话，背景介绍完毕。下面就开始真正介绍&amp;ldquo;字符编码&amp;rdquo;了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;字符集&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;首先，上面我们所做的都是针对简体中文环境下的字符编码，至于其他编码，我们还没有涉及到，之后会谈到。对于&amp;ldquo;你&amp;rdquo;这个字符，在ANSI中，为0xC4E3；在Unicode中，为0x4F60。这是由不同的标准所决定的，决定前面的标准为中国国家标准，包括一系列一脉相承的标准，从GB2312到GBK到GB18030。决定后面的为The Unicode Standard。为什么会出现这么多标准，这是由历史原因以及当时的机器性能决定的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;历史&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;刚刚前面一直提到ANSI，其实并不是那么准确的，其中我们要涉及到codepage的概念，这里我们的codepage为936，也就是简体中文，在这个环境下，我们的ANSI编码表示才是中国国家标准的那套。ANSI真正的含义是&amp;ldquo;美国国家标准协会&amp;rdquo;(American National Standards Institute)。就是这个协会，定义了字符编码的&amp;ldquo;鼻祖&amp;rdquo;--ASCII码。现在的字符编码，大多是基于ASCII码扩展而来的。&lt;/p&gt;&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" src="http://pic002.cnblogs.com/images/2012/91649/2012040122071572.png" alt="" border="0" /&gt;&lt;/p&gt;&lt;p&gt;ASCII(American Standard Code for Information Interchange, 美国信息交换标准代码)是一个7位(7-bits)码，包含了128个字符的定义(128=2^7)，其中有33个非打印控制字符，以及95个可打印字符（包括空格），主要是用来显示英文字母的，其对应的ISO标准为ISO646。为了避免概念混淆，IANA(Internet Assigned Numbers Authority，互联网号码分配局)使用US-ASCII来称呼该字符集。至于为什么定义7位而不是一下子8位，当时是个&amp;ldquo;锱铢必较&amp;rdquo;的时代，内存太紧俏太贵了，能省一点是一点哈，够用就行。&lt;/p&gt;&lt;p&gt;尽管能表示英文字母，但是还是有很多字符还是无法表示，比如德文中的&amp;ouml;&amp;auml;&amp;uuml;&amp;szlig;等，于是不够用了，然后就出现了扩展ASCII码(Extended ASCII)，也就是将ASCII码从7位扩展成了8位，这样一共就有了256个字符。EASCII码比ASCII码扩充出来的符号包括表格符号、计算符号、希腊字母和特殊的拉丁符号。这里，就开始有了区分，对应的标准并不是一个，而是一系列的8位字符集标准，在ISO标准中叫做ISO 8859，全称为ISO/IEC 8859，现在定义了15个字符集(这里有16个，应该是希伯来语一个是视觉顺序，一个是逻辑顺序，为1个，猜想，未验证)。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;ISO/IEC 8859-1 (Latin-1) - 西欧语言&lt;/li&gt;&lt;li&gt;ISO/IEC 8859-2 (Latin-2) - 中欧语言&lt;/li&gt;&lt;li&gt;ISO/IEC 8859-3 (Latin-3) - 南欧语言。世界语也可用此字符集显示。&lt;/li&gt;&lt;li&gt;ISO/IEC 8859-4 (Latin-4) - 北欧语言&lt;/li&gt;&lt;li&gt;ISO/IEC 8859-5 (Cyrillic) - 斯拉夫语言&lt;/li&gt;&lt;li&gt;ISO/IEC 8859-6 (Arabic) - 阿拉伯语&lt;/li&gt;&lt;li&gt;ISO/IEC 8859-7 (Greek) - 希腊语&lt;/li&gt;&lt;li&gt;ISO/IEC 8859-8 (Hebrew) - 希伯来语（视觉顺序）&lt;/li&gt;&lt;li&gt;ISO 8859-8-I - 希伯来语（逻辑顺序）&lt;/li&gt;&lt;li&gt;ISO/IEC 8859-9（Latin-5 或 Turkish）- 它把Latin-1的冰岛语字母换走，加入土耳其语字母。&lt;/li&gt;&lt;li&gt;ISO/IEC 8859-10（Latin-6 或 Nordic）- 北日耳曼语支，用来代替Latin-4。&lt;/li&gt;&lt;li&gt;ISO/IEC 8859-11 (Thai) - 泰语，从泰国的 TIS620 标准字集演化而来。&lt;/li&gt;&lt;li&gt;ISO/IEC 8859-13（Latin-7 或 Baltic Rim）- 波罗的语族&lt;/li&gt;&lt;li&gt;ISO/IEC 8859-14（Latin-8 或 Celtic）- 凯尔特语族&lt;/li&gt;&lt;li&gt;ISO/IEC 8859-15 (Latin-9) - 西欧语言，加入Latin-1欠缺的芬兰语字母和大写法语重音字母，以及欧元（&amp;euro;）符号。&lt;/li&gt;&lt;li&gt;ISO/IEC 8859-16 (Latin-10) - 东南欧语言。主要供罗马尼亚语使用，并加入欧元符号。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;上面的这些字符问题，基本解决了，下面就是比较麻烦的了。上面的字符，用1个byte都能够表示完整了，叫做SBCS(Single Byte Character Set)。但是咱们是象形文字啊，几千个字符，这小小256个地方怎么够用呢？于是没办法，扩1个byte吧，于是叫DBCS(Double Byte Character Set)。对于CJK语言（以中文、日文、韩文为主的东亚语言），基本上使用2个byte表示一个字符的编码方式来进行表示。具体了解的有日文、简体中文、韩文、繁体中文（至于泰文并不是很清楚，据有些同学说是3字节编码？资料没有找到很确切的，希望了解的同学指导一下）。&lt;/p&gt;&lt;p&gt;我们最熟悉的当然是简体中文了，所以就看这个，其余除了以前玩大宇游戏的时候，知道&amp;ldquo;大五码&amp;rdquo;(Big 5)，用过南极星，就了解不深了。这里就不做介绍了。&lt;/p&gt;&lt;p&gt;对于简体中文编码，最开始的就是GB2312编码（GB 2312-80），是中国国家标准简体中文字符集，全称《信息交换用汉字编码字符集&amp;middot;基本集》，又稱GB0，由中国国家标准总局发布，1981年5月1日实施。GB2312编码通行于中国大陆；新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持GB 2312。&lt;/p&gt;&lt;p&gt;GB 2312标准共收录6763个汉字，其中一级汉字3755个，二级汉字3008个；同时收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个字符。GB 2312的出现，基本满足了汉字的计算机处理需要，它所收录的汉字已经覆盖中国大陆99.75%的使用频率。&lt;/p&gt;&lt;p&gt;尽管覆盖了99.75%，但是还是有没覆盖的，所以之后又出现了GBK和GB-18030。这里对于编程人员的建议就是，如果需要更全的字符覆盖，就使用GB-18030，如果是嵌入式系统，需要在更小的内存中实现较多的功能，使用GB-2312即可，甚至在某些场合，可以使用其子集（一般嵌入式系统需要显示的字符是可以统计出来的，有些字符并不需要）。&lt;/p&gt;&lt;p&gt;这样，对于非Unicode部分的字符集，基本上要了解的都介绍了。不过，如何使用呢？我Latin-1的和GB 2312的，其同一个十六进制，对应的字符不一样、同样用&amp;ldquo;你&amp;rdquo;的编码来说，对应为0xC4E3，对应到Latin-1中，就是两个字符，&amp;Auml;&amp;atilde;，两个是不能共存的。&lt;/p&gt;&lt;p&gt;在这种情况下，有一个新的概念出现了：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;codepage（代码页）&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;为了使用不同的字符集，我们使用不同的codepage。不同的codepage对应不同的字符集。对于简体中文，其codepage为936；日文的codepage为932；韩文的codepage为949；繁体中文的codepage为950。我们可以参考Windows下面的Region and Language Option设置，对于&amp;ldquo;非Unicode&amp;rdquo;语言设置，选择的就是特定的codepage。&lt;/p&gt;&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" src="http://pic002.cnblogs.com/images/2012/91649/2012040122075560.png" alt="" border="0" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;字体文件的显示&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;字体文件的显示，也是经过长时间的演变过来的。一开始的字体为&amp;ldquo;点阵字体&amp;rdquo;，后来出现了PostScript字体，TrueType字体(True Type Font, TTF)，我们这里就看一下具体点阵字体的显示过程。一般嵌入式方案或者有些游戏中还是使用该种显示。这里我们使用GB 2312的一个点阵字体方案，叫做&amp;ldquo;hzk16.fnt&amp;rdquo;(最后部分有下载，也可google到)，是提供16*16的点阵字体给用户使用。这里我写了一个比较简单的程序来进行显示：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; #include &amp;lt;stdio.h&amp;gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; #include &amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.h&amp;gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; printHZK16(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; gbcode[&lt;span style="color: #800080;"&gt;3&lt;/span&gt;]);&lt;br /&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; main()&lt;br /&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; {&lt;br /&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; input[&lt;span style="color: #800080;"&gt;10&lt;/span&gt;]={&lt;span style="color: #800080;"&gt;0&lt;/span&gt;};&lt;br /&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;while&lt;/span&gt;(&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt;     {&lt;br /&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt;         printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;输入中文，一次一个字符：&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt;         printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt;         scanf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%s&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,input);&lt;br /&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt;         printHZK16(input);&lt;br /&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt;         printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt;     }&lt;br /&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt; }&lt;br /&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; printHZK16(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; gbcode[&lt;span style="color: #800080;"&gt;3&lt;/span&gt;])&lt;br /&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt; {&lt;br /&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt;     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;要读出的汉字，GB2312编码   &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt;     unsigned &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; incode[&lt;span style="color: #800080;"&gt;3&lt;/span&gt;];&lt;br /&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt;     unsigned &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; qh = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;, wh = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;  &lt;br /&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt;     unsigned &lt;span style="color: #0000ff;"&gt;long&lt;/span&gt; offset = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;  &lt;br /&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;char&lt;/span&gt; mat[&lt;span style="color: #800080;"&gt;16&lt;/span&gt;][&lt;span style="color: #800080;"&gt;2&lt;/span&gt;] = {&lt;span style="color: #800080;"&gt;0&lt;/span&gt;};  &lt;br /&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt;     FILE *HZK = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;  &lt;br /&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i,j,k;&lt;br /&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;32&lt;/span&gt;     memcpy(incode, gbcode, &lt;span style="color: #800080;"&gt;3&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: #008080;"&gt;33&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #008080;"&gt;34&lt;/span&gt;     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;每个汉字，占2个字节，取其区位码&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;35&lt;/span&gt;     qh = incode[&lt;span style="color: #800080;"&gt;0&lt;/span&gt;] - &lt;span style="color: #800080;"&gt;0xa0&lt;/span&gt;;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;获得区码&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;36&lt;/span&gt;     wh = incode[&lt;span style="color: #800080;"&gt;1&lt;/span&gt;] - &lt;span style="color: #800080;"&gt;0xa0&lt;/span&gt;;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;获得位码&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;37&lt;/span&gt;     offset = (&lt;span style="color: #800080;"&gt;94&lt;/span&gt;*(qh-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;)+(wh-&lt;span style="color: #800080;"&gt;1&lt;/span&gt;))*&lt;span style="color: #800080;"&gt;32&lt;/span&gt;;    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;得到偏移位置&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;38&lt;/span&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;打开hzk16.fnt文件&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;39&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;((HZK=fopen(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;hzk16.fnt&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;rb&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)) == NULL)  &lt;br /&gt;&lt;span style="color: #008080;"&gt;40&lt;/span&gt;     {  &lt;br /&gt;&lt;span style="color: #008080;"&gt;41&lt;/span&gt;         printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Can't Open hzk16\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);  &lt;br /&gt;&lt;span style="color: #008080;"&gt;42&lt;/span&gt;         getchar(); &lt;br /&gt;&lt;span style="color: #008080;"&gt;43&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; &lt;br /&gt;&lt;span style="color: #008080;"&gt;44&lt;/span&gt;     }&lt;br /&gt;&lt;span style="color: #008080;"&gt;45&lt;/span&gt;     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;根据 offset进行定位&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;46&lt;/span&gt;     fseek(HZK, offset, SEEK_SET);&lt;br /&gt;&lt;span style="color: #008080;"&gt;47&lt;/span&gt;     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;读取32字节字模&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;48&lt;/span&gt;     fread(mat, &lt;span style="color: #800080;"&gt;32&lt;/span&gt;, &lt;span style="color: #800080;"&gt;1&lt;/span&gt;, HZK); &lt;br /&gt;&lt;span style="color: #008080;"&gt;49&lt;/span&gt;     fclose(HZK); &lt;br /&gt;&lt;span style="color: #008080;"&gt;50&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #008080;"&gt;51&lt;/span&gt;     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;显示&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;52&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(i=&lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i&amp;lt;&lt;span style="color: #800080;"&gt;16&lt;/span&gt;; i++) &lt;br /&gt;&lt;span style="color: #008080;"&gt;53&lt;/span&gt;     {    &lt;br /&gt;&lt;span style="color: #008080;"&gt;54&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(j=&lt;span style="color: #800080;"&gt;0&lt;/span&gt;; j&amp;lt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;; j++) &lt;br /&gt;&lt;span style="color: #008080;"&gt;55&lt;/span&gt;         { &lt;br /&gt;&lt;span style="color: #008080;"&gt;56&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;(k=&lt;span style="color: #800080;"&gt;0&lt;/span&gt;; k&amp;lt;&lt;span style="color: #800080;"&gt;8&lt;/span&gt;; k++) &lt;br /&gt;&lt;span style="color: #008080;"&gt;57&lt;/span&gt;             { &lt;br /&gt;&lt;span style="color: #008080;"&gt;58&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;(mat[i][j] &amp;amp; (&lt;span style="color: #800080;"&gt;0x80&lt;/span&gt;&amp;gt;&amp;gt;k))  &lt;br /&gt;&lt;span style="color: #008080;"&gt;59&lt;/span&gt;                 {&lt;br /&gt;&lt;span style="color: #008080;"&gt;60&lt;/span&gt;                     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;测试为1的位则进行显示&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;61&lt;/span&gt;                     printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%c&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;#&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;); &lt;br /&gt;&lt;span style="color: #008080;"&gt;62&lt;/span&gt;                 } &lt;br /&gt;&lt;span style="color: #008080;"&gt;63&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;64&lt;/span&gt;                 { &lt;br /&gt;&lt;span style="color: #008080;"&gt;65&lt;/span&gt;                     printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;%c&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;span style="color: #800000;"&gt;'&lt;/span&gt; &lt;span style="color: #800000;"&gt;'&lt;/span&gt;); &lt;br /&gt;&lt;span style="color: #008080;"&gt;66&lt;/span&gt;                 }    &lt;br /&gt;&lt;span style="color: #008080;"&gt;67&lt;/span&gt;             }    &lt;br /&gt;&lt;span style="color: #008080;"&gt;68&lt;/span&gt;         } &lt;br /&gt;&lt;span style="color: #008080;"&gt;69&lt;/span&gt;         printf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;); &lt;br /&gt;&lt;span style="color: #008080;"&gt;70&lt;/span&gt;     } &lt;br /&gt;&lt;span style="color: #008080;"&gt;71&lt;/span&gt;     getchar(); &lt;br /&gt;&lt;span style="color: #008080;"&gt;72&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; &lt;br /&gt;&lt;span style="color: #008080;"&gt;73&lt;/span&gt; }&lt;/div&gt;&lt;p&gt;&lt;br /&gt; 效果如下：&lt;/p&gt;&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" src="http://pic002.cnblogs.com/images/2012/91649/2012040122094589.png" alt="" border="0" /&gt;&lt;/p&gt;&lt;p&gt;写得有点累了，放假还是休息休息吧，这篇就先介绍非Unicode部分了；Unicode部分以及其他相关的，在下一篇再说吧。有什么疑问问题，欢迎提出来。&lt;/p&gt;&lt;p&gt;&lt;a href="http://files.cnblogs.com/cnyao/hzk16.zip"&gt;hzk16.fnt文件下载&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;参考&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.fmddlmyy.cn/text7.html"&gt;谈谈Windows程序中的字符编码&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/dd318081(v=vs.85).aspx"&gt;MSDN GetCPInfoEx function&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx"&gt;MSDN Code Page Identifiers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/dd318103(v=vs.85).aspx"&gt;MSDN GetLocaleInfoEx function&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://us.generation-nt.com/answer/cant-get-translatecharsetinfo-work-help-25610622.html"&gt;TranslateCharsetInfo()函数调用错误&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.csdn.net/davidhsing/article/details/2951098"&gt;编码大全 CodePage CharSet 中英文显示名称&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/windows/desktop/dd374077(v=vs.85).aspx"&gt;TranslateCharsetInfo function&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.csdn.net/hbu_dcf/article/details/3837565"&gt;关于编码问答&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.bloggern.com/2945.html"&gt;关于unicode，mbcs，utf8，charset，encoding等相关概念的说明&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://hi.baidu.com/chongerfeia/blog/item/dac386fa591d8140242df245.html"&gt;输入法到编辑器字符编码识别&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.regexlab.com/zh/encoding.htm"&gt;字符，字节和编码&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://space.itpub.net/519536/viewspace-580610"&gt;查看本地windows的字符集方法&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cppblog.com/pansunyou/archive/2010/12/31/charset_encoding.html"&gt;字符集和字符编码[订正]&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms912047(WinEmbedded.10).aspx"&gt;Microsoft Locale ID Values&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/78zh94ax(v=vs.80).aspx"&gt;strlen, strlen_l, wcslen, wcslen_l, _mbslen, _mbslen_l, _mbstrlen, _mbstrlen_l&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/ahuo/archive/2011/03/27/1997261.html"&gt;windows的CP_ACP代码页与CP_OEMCP代码页区别&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnitblog.com/asfman/archive/2006/06/16/12397.html"&gt;字符集编码问题&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.path8.net/tn/archives/66"&gt;中文化和国际化问题权威解析之一：字符编码发展历程&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gonglue58.com/z1/14064.htm"&gt;你见过支持四字节 GB18030-2005 内码文本显示的编辑器吗？&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/goglobal/cc305142.aspx"&gt;Windows 874&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zh.wikipedia.org/wiki/%E6%B3%B0%E6%96%87%E5%AD%97"&gt;泰文字&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://hi.baidu.com/springwang8020/blog/item/efe9c60d4607fa216159f3d6.html"&gt;点阵字体和TrueType字体&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://zh.wikipedia.org/zh/TrueType"&gt;TrueType&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;img src="http://www.cnblogs.com/cnyao/aggbug/2429408.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cnyao/archive/2012/04/01/winsdk9_encoding.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cnyao/archive/2011/06/24/win32sdk8_compileCRT.html</id><title type="text">从零开始，学习windows编程（8）--自己动手，编译CRT</title><summary type="text">翻开对应VC中的lib目录，是可以看到CRT的lib文件的，我电脑上面路径是“d:\Program Files\Microsoft Visual Studio\VC98\Lib\”，大家可以自己找一下自己的路径。经过上面的文章，我们对它已经有了一定的了解，使用它当然没问题了。那作为程序员，是不是还想看看它是怎么生成的呢？这里，就是讲如何来生成一个CRT库。安装CRT源码既然题目是编译，那就需要源码。如果你翻开电脑中的路径，如我电脑中为“d:\Program Files\Microsoft Visual Studio\VC98\CRT\”，发现下面已经有一个SRC目录，并且里面有700多个文件和</summary><published>2011-06-24T14:17:00Z</published><updated>2011-06-24T14:17:00Z</updated><author><name>cnyao</name><uri>http://www.cnblogs.com/cnyao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cnyao/archive/2011/06/24/win32sdk8_compileCRT.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cnyao/archive/2011/06/24/win32sdk8_compileCRT.html"/><content type="html">&lt;p&gt;翻开对应VC中的lib目录，是可以看到CRT的lib文件的，我电脑上面路径是&amp;ldquo;d:\Program Files\Microsoft Visual Studio\VC98\Lib\&amp;rdquo;，大家可以自己找一下自己的路径。经过上面的文章，我们对它已经有了一定的了解，使用它当然没问题了。那作为程序员，是不是还想看看它是怎么生成的呢？这里，就是讲如何来生成一个CRT库。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;安装CRT源码&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;既然题目是编译，那就需要源码。如果你翻开电脑中的路径，如我电脑中为&amp;ldquo;d:\Program Files\Microsoft Visual Studio\VC98\CRT\&amp;rdquo;，发现下面已经有一个SRC目录，并且里面有700多个文件和2个子目录的话，那你就是安装过CRT的源码了，可以直接跳过这段，看到下面的&amp;ldquo;编译过程&amp;rdquo;，如果碰巧没有，那想要继续，可以参考这里，来安装一下CRT的源码。&lt;/p&gt;&lt;p&gt;首先，你需要一张VC6的安装盘，或者VC6的安装文件。不管你是已经安装过VC，还是新装VC，安装过程我就不详细说了，主要CRT安装在下面这个画面中：&lt;/p&gt;&lt;p&gt;中间用红线框住的就是CRT了。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnyao/201106/201106242215575197.png"&gt;&lt;img style="display: inline; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/cnyao/201106/201106242216033972.png" alt="image" width="608" height="510" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;可以看一下细节，里面第3项就是CRT的源码，重点就是将这项勾选上，到时候安装目录中就有源码了，对应的源码目录也在截图中有显示，为用黄线框住的部分。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnyao/201106/201106242216122703.png"&gt;&lt;img style="display: inline; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/cnyao/201106/201106242216354591.png" alt="image" width="623" height="517" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;当然，为了省事，直接将VC中的组件全部安装上就可以了。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnyao/201106/201106242216419919.png"&gt;&lt;img style="display: inline; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/cnyao/201106/201106242217043168.png" alt="image" width="620" height="512" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;安装完之后，就可以进行编译了，不过安装盘先不要放到一边，一会我们还有用。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff8000;"&gt;编译过程&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们已经知道，CRT库分为单线程，多线程，动态库这三种，而这三种又分别有一个debug版本，这样就一共有6个版本的CRT库可以进行编译。微软分别称它们为ST model, MT model, DLL model, XST model, XMT model以及XDLL model。我们的目的就是将这些版本都编译出来。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff8000;"&gt;编译的准备工作&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在编译之前，还需要做几件工作。&lt;/p&gt;&lt;ol&gt;&lt;li&gt;确保你的nmake是可以工作的。&lt;/li&gt;&lt;li&gt;从VC6安装文件/CD-ROM相关目录底下，找到下面3个文件，并拷贝到对应源码目录中，对应我这里目录为&amp;ldquo;d:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\&amp;rdquo;。&lt;ul&gt;&lt;li&gt;MAKEFILE&lt;/li&gt;&lt;li&gt;MAKEFILE.INC&lt;/li&gt;&lt;li&gt;MAKEFILE.SUB&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;修改MAKEFILE文件。 搜索&lt;strong&gt;Winver.h&lt;/strong&gt;所在的每一行，如果有&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;$(V6TOOLS)\include\winver.h \&lt;/p&gt;&lt;/blockquote&gt;则删除该行，一共有6处。（都是DLL编译时出现的）&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;当这些工作都做完之后，你就可以开始编译了，当然，有可能会出现其他问题，比如我就在编译DLL版本的时候遇到了一点问题，但是微软提供的需要进行修改的部分就是这么多了。&lt;/p&gt;&lt;p&gt;下面我们将6个版本分开来编译，这样看得更清楚。进入源码目录，然后分别输入下面的命令，并查看输出&lt;/p&gt;&lt;ol&gt;&lt;li&gt;ST&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;d:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC&amp;gt;nmake st&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;编译结果&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;所有编译出来的产出都在build目录底下，编出的一堆obj文件位于st_obj目录下，这个我们就不去管了。主要是产生的lib文件：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;libc.lib&lt;/li&gt;&lt;li&gt;libci.lib&lt;/li&gt;&lt;li&gt;libcp.lib&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;MT&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;d:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC&amp;gt;nmake mt&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;编译结果&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;ul&gt;&lt;li&gt;libcmt.lib&lt;/li&gt;&lt;li&gt;libcimt.lib&lt;/li&gt;&lt;li&gt;libcpmt.lib&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;DLL&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;d:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC&amp;gt;nmake dll&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;编译结果，最后编译会出现一些warning，但是没有问题，按照微软的说法，在编译CRT的时候出现这些，是正常的。(信息过多，这里只取部分警告信息)&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;link -nologo -filealign:4096 @build\intel\dll_obj\linki.rsp &lt;br /&gt;.\sample_i.def : warning LNK4102: export of deleting destructor "public: virtual &lt;br /&gt;void * __thiscall exception::`vector deleting destructor'(unsigned int)"; image &lt;br /&gt;may not run correctly &lt;br /&gt;.\sample_i.def : warning LNK4102: export of deleting destructor "public: virtual &lt;br /&gt;void * __thiscall filebuf::`vector deleting destructor'(unsigned int)"; image m &lt;br /&gt;ay not run correctly &lt;br /&gt;.\sample_i.def : warning LNK4102: export of deleting destructor "public: virtual &lt;br /&gt;void * __thiscall fstream::`vector deleting destructor'(unsigned int)"; image m &lt;br /&gt;ay not run correctly&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;结果&lt;/p&gt;&lt;table style="width: 561px;" border="1" cellspacing="0" cellpadding="2"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align="center" valign="top" width="94"&gt;LIB文件&lt;/td&gt;&lt;td align="center" valign="top" width="94"&gt;DLL文件&lt;/td&gt;&lt;td align="center" valign="top" width="109"&gt;MAP文件&lt;/td&gt;&lt;td align="center" valign="top" width="101"&gt;RES文件&lt;/td&gt;&lt;td align="center" valign="top" width="161"&gt;等价对应文件(LIB)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center" valign="top" width="94"&gt;_sample_.lib&lt;/td&gt;&lt;td align="center" valign="top" width="94"&gt;_sample_.dll&lt;/td&gt;&lt;td align="center" valign="top" width="109"&gt;_sample_.map&lt;/td&gt;&lt;td align="center" valign="top" width="101"&gt;_sample_.res&lt;/td&gt;&lt;td align="center" valign="top" width="161"&gt;MSVCRT.LIB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center" valign="top" width="94"&gt;sample_i.lib&lt;/td&gt;&lt;td align="center" valign="top" width="94"&gt;sample_i.dll&lt;/td&gt;&lt;td align="center" valign="top" width="109"&gt;sample_i.map&lt;/td&gt;&lt;td align="center" valign="top" width="101"&gt;sample_i.res&lt;/td&gt;&lt;td align="center" valign="top" width="161"&gt;MSVCIRT.LIB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center" valign="top" width="94"&gt;sample_p.lib&lt;/td&gt;&lt;td align="center" valign="top" width="94"&gt;sample_p.dll&lt;/td&gt;&lt;td align="center" valign="top" width="109"&gt;sample_p.map&lt;/td&gt;&lt;td align="center" valign="top" width="101"&gt;sample_p.res&lt;/td&gt;&lt;td align="center" valign="top" width="161"&gt;MSVCPRT.LIB&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/li&gt;&lt;li&gt;XST&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;d:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC&amp;gt;nmake xst&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;编译结果&lt;/p&gt;&lt;table style="width: 400px;" border="1" cellspacing="0" cellpadding="2"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align="center" valign="top" width="199"&gt;LIB文件&lt;/td&gt;&lt;td align="center" valign="top" width="199"&gt;PDB文件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center" valign="top" width="199"&gt;libcd.lib&lt;/td&gt;&lt;td align="center" valign="top" width="199"&gt;libcd.pdb&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center" valign="top" width="199"&gt;libcid.lib&lt;/td&gt;&lt;td align="center" valign="top" width="199"&gt;libcid.pdb&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center" valign="top" width="199"&gt;libcpd.lib&lt;/td&gt;&lt;td align="center" valign="top" width="200"&gt;libcpd.pdb&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/li&gt;&lt;li&gt;XMT&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;d:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC&amp;gt;nmake xmt&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;编译结果&lt;/p&gt;&lt;table style="width: 402px;" border="1" cellspacing="0" cellpadding="2"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align="center" valign="top" width="200"&gt;LIB文件&lt;/td&gt;&lt;td align="center" valign="top" width="200"&gt;PDB文件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center" valign="top" width="200"&gt;libcmtd.lib&lt;/td&gt;&lt;td align="center" valign="top" width="200"&gt;libcmtd.pdb&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center" valign="top" width="200"&gt;libcimtd.lib&lt;/td&gt;&lt;td align="center" valign="top" width="200"&gt;libcimtd.pdb&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center" valign="top" width="200"&gt;libcpmtd.lib&lt;/td&gt;&lt;td align="center" valign="top" width="200"&gt;libcpmtd.pdb&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/li&gt;&lt;li&gt;XDLL&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;d:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC&amp;gt;nmake xdll&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;编译结果&lt;/p&gt;&lt;table style="width: 620px;" border="1" cellspacing="0" cellpadding="2"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align="center" valign="top" width="96"&gt;LIB文件&lt;/td&gt;&lt;td align="center" valign="top" width="96"&gt;DLL文件&lt;/td&gt;&lt;td align="center" valign="top" width="111"&gt;MAP文件&lt;/td&gt;&lt;td align="center" valign="top" width="95"&gt;RES文件&lt;/td&gt;&lt;td align="center" valign="top" width="91"&gt;PDB文件&lt;/td&gt;&lt;td align="center" valign="top" width="129"&gt;等价对应文件(LIB)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center" valign="top" width="97"&gt;_sampld_.lib&lt;/td&gt;&lt;td align="center" valign="top" width="97"&gt;_sampld_.dll&lt;/td&gt;&lt;td align="center" valign="top" width="111"&gt;_sampld_.map&lt;/td&gt;&lt;td align="center" valign="top" width="95"&gt;_sampld_.res&lt;/td&gt;&lt;td align="center" valign="top" width="91"&gt;_sampld_.pdb&lt;/td&gt;&lt;td align="center" valign="top" width="129"&gt;MSVCRTD.LIB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center" valign="top" width="97"&gt;sampld_i.lib&lt;/td&gt;&lt;td align="center" valign="top" width="97"&gt;sampled_i.dll&lt;/td&gt;&lt;td align="center" valign="top" width="111"&gt;sampled_i.map&lt;/td&gt;&lt;td align="center" valign="top" width="95"&gt;sampled_i.res&lt;/td&gt;&lt;td align="center" valign="top" width="91"&gt;sampld_i.pdb&lt;/td&gt;&lt;td align="center" valign="top" width="129"&gt;MSVCIRTD.LIB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center" valign="top" width="97"&gt;sampld_p.lib&lt;/td&gt;&lt;td align="center" valign="top" width="97"&gt;sampled_p.dll&lt;/td&gt;&lt;td align="center" valign="top" width="111"&gt;sampled_p.map&lt;/td&gt;&lt;td align="center" valign="top" width="95"&gt;sampled_p.res&lt;/td&gt;&lt;td align="center" valign="top" width="91"&gt;sampld_p.pdb&lt;/td&gt;&lt;td align="center" valign="top" width="129"&gt;MSVCPRTD.LIB&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;参考：&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;a title="http://msdn.microsoft.com/zh-cn/library/k9a8ehy3(v=vs.80).aspx" href="http://msdn.microsoft.com/zh-cn/library/k9a8ehy3(v=vs.80).aspx"&gt;http://msdn.microsoft.com/zh-cn/library/k9a8ehy3(v=vs.80).aspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="http://support.microsoft.com/kb/315535/zh-cn" href="http://support.microsoft.com/kb/315535/zh-cn"&gt;http://support.microsoft.com/kb/315535/zh-cn&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/bx6y9dab(v=vs.80).aspx" href="http://msdn.microsoft.com/en-us/library/bx6y9dab(v=vs.80).aspx"&gt;http://msdn.microsoft.com/en-us/library/bx6y9dab(v=vs.80).aspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="http://blog.csdn.net/yy13210520/archive/2011/03/03/6220333.aspx" href="http://blog.csdn.net/yy13210520/archive/2011/03/03/6220333.aspx"&gt;http://blog.csdn.net/yy13210520/archive/2011/03/03/6220333.aspx&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;img src="http://www.cnblogs.com/cnyao/aggbug/2089381.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cnyao/archive/2011/06/24/win32sdk8_compileCRT.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cnyao/archive/2011/06/23/winsdk7_nocrt.html</id><title type="text">从零开始，学习windows编程（7）--不使用CRT库的程序</title><summary type="text">从前面几篇，我们已经得到一些结论。程序是可以自定义入口的，但是如果在入口中使用了一些CRT相关的函数，而没有正确的进行初始化工作的话，即使编译不出问题，在运行时也会出现内存错误等问题的。那我们可以写出完全不用到CRT库的程序吗？当然可以，既然CRT库也是微软写的，甚至我们可以用另外一个CRT库来代替它。不过这个算是另外一个话题了。先看看不使用CRT库的hello world是啥样的吧。不使用C运行时库的测试代码#include &lt;windows.h&gt;DWORD StringLen(const char * str){ const char *eos = str; while( *e</summary><published>2011-06-23T12:00:00Z</published><updated>2011-06-23T12:00:00Z</updated><author><name>cnyao</name><uri>http://www.cnblogs.com/cnyao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cnyao/archive/2011/06/23/winsdk7_nocrt.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cnyao/archive/2011/06/23/winsdk7_nocrt.html"/><content type="html">&lt;p&gt;从前面几篇，我们已经得到一些结论。&lt;/p&gt;&lt;p&gt;程序是可以自定义入口的，但是如果在入口中使用了一些CRT相关的函数，而没有正确的进行初始化工作的话，即使编译不出问题，在运行时也会出现内存错误等问题的。&lt;/p&gt;&lt;p&gt;那我们可以写出完全不用到CRT库的程序吗？当然可以，既然CRT库也是微软写的，甚至我们可以用另外一个CRT库来代替它。不过这个算是另外一个话题了。先看看不使用CRT库的hello world是啥样的吧。&lt;/p&gt;&lt;p&gt;不使用C运行时库的测试代码&lt;/p&gt;#include &amp;lt;windows.h&amp;gt;&lt;br/&gt;&lt;br/&gt;DWORD StringLen(const char * str)&lt;br/&gt;{&lt;br/&gt;        const char *eos = str;&lt;br/&gt;        while( *eos++ ) ;&lt;br/&gt;        return( (DWORD)(eos - str - 1) );&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;void WriteString(const char * str)&lt;br/&gt;{&lt;br/&gt;        HANDLE hOut;&lt;br/&gt;        DWORD Length;&lt;br/&gt;        DWORD result;&lt;br/&gt;        hOut=GetStdHandle(STD_OUTPUT_HANDLE);&lt;br/&gt;        Length=StringLen(str);&lt;br/&gt;        WriteFile(hOut,str,Length,&amp;amp;result,0);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;int myentry(void)&lt;br/&gt;{&lt;br/&gt;        WriteString("Hello World!");&lt;br/&gt;        ExitProcess(0);&lt;br/&gt;        return 0;&lt;br/&gt;}&lt;p&gt;编译:&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;cl /c /Zl myentrytest.c&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;链接：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;link /entry:myentry /subsystem:console myentrytest.obj kernel32.lib&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;最终得到可执行文件myentrytest.exe。&lt;/p&gt;&lt;p&gt;执行效果与printf出来的效果相同，但是其中用到的原理却是很不一样的。&lt;/p&gt;&lt;p&gt;这里，我们就接触到了三个函数，这三个函数可以不通过CRT库直接使用，并且不造成任何问题，这三个函数都是所谓的Windows API。这三个API都是kernel32提供的。通过直接调用windows API，可以使用到操作系统的功能，并成功绕过CRT库。尽管我们平时不太会使用到这样的技巧，但是有时接触到这样的代码或自己编码时有这样的要求，也是可能的。当然，要完全绕过CRT库，就需要提取出所编写程序要使用到CRT库提供功能的所有函数，并使用windows API来同等代替，这样花费的时间和重复做轮子也没什么两样，不过，如果要真的对系统有一定了解，还是有一定意义的。&lt;/p&gt;&lt;p&gt;这里介绍一下windows API：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;b&gt;视窗操作系统应用程序接口&lt;/b&gt;（Windows API），有非正式的简称法为&lt;b&gt;WinAPI&lt;/b&gt;，是&lt;a href="http://zh.wikipedia.org/wiki/%E5%BE%AE%E8%BD%AF"&gt;微软&lt;/a&gt;对于&lt;a href="http://zh.wikipedia.org/wiki/Windows"&gt;Windows&lt;/a&gt;&lt;a href="http://zh.wikipedia.org/wiki/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F"&gt;操作系统&lt;/a&gt;中可用的核心&lt;a href="http://zh.wikipedia.org/wiki/API"&gt;应用程序编程接口&lt;/a&gt;的称法。它被设计为各种语言的程序调用，也是&lt;a href="http://zh.wikipedia.org/wiki/%E5%BA%94%E7%94%A8%E8%BD%AF%E4%BB%B6"&gt;应用软件&lt;/a&gt;与Windows系统最直接的交互方式。大多数&lt;a href="http://zh.wikipedia.org/wiki/%E9%A9%B1%E5%8A%A8%E7%A8%8B%E5%BA%8F"&gt;驱动程序&lt;/a&gt;所需要的对Windows系统的更底层次访问接口，由所用版本的Windows的&lt;a href="http://zh.wikipedia.org/wiki/Native_API"&gt;Native API&lt;/a&gt;来提供接口。&lt;/p&gt;&lt;p&gt;Windows有一个&lt;a href="http://zh.wikipedia.org/wiki/Windows_SDK"&gt;软件开发包&lt;/a&gt;（SDK, software development kit）提供相应的文档和工具，以使程序员开发使用Windows API的软件和利用Windows技术。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Windows API所提供的功能可以归为七类：&lt;sup&gt;&lt;a href="http://zh.wikipedia.org/wiki/Windows_API#cite_note-msdn-overview-3"&gt;[4]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;ul&gt;&lt;li&gt;基础服务（Base Services）&lt;sup&gt;&lt;a href="http://zh.wikipedia.org/wiki/Windows_API#cite_note-msdn-base-4"&gt;[5]&lt;/a&gt;&lt;/sup&gt;，提供对Windows系统可用的基础资源的访问接口。比如象：&lt;a href="http://zh.wikipedia.org/wiki/%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F"&gt;文件系统&lt;/a&gt;（file system）、&lt;a href="http://zh.wikipedia.org/wiki/%E5%A4%96%E9%83%A8%E8%AE%BE%E5%A4%87"&gt;外部设备&lt;/a&gt;（device）、，&lt;a href="http://zh.wikipedia.org/wiki/%E8%A1%8C%E7%A8%8B"&gt;行程&lt;/a&gt;（process）、&lt;a href="http://zh.wikipedia.org/wiki/%E7%BA%BF%E7%A8%8B"&gt;线程&lt;/a&gt;（thread）以及访问&lt;a href="http://zh.wikipedia.org/wiki/%E6%B3%A8%E5%86%8C%E8%A1%A8"&gt;注册表&lt;/a&gt;（Windows registry）和&lt;a href="http://zh.wikipedia.org/w/index.php?title=%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86%E6%9C%BA%E5%88%B6&amp;amp;action=edit&amp;amp;redlink=1"&gt;错误处理机制&lt;/a&gt;（error handling）。这些功能接口位于，16位元Windows下的&lt;tt&gt;kernel.exe&lt;/tt&gt;、&lt;tt&gt;krnl286.exe&lt;/tt&gt;或&lt;tt&gt;krnl386.exe&lt;/tt&gt;系统文件中；以及32位元Windows下的 &lt;tt&gt;kernel32.dll&lt;/tt&gt;和&lt;tt&gt;advapi32.dll&lt;/tt&gt;中。 &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://zh.wikipedia.org/wiki/%E5%9B%BE%E5%BD%A2%E8%AE%BE%E5%A4%87%E6%8E%A5%E5%8F%A3"&gt;图形设备接口&lt;/a&gt;（GDI）&lt;sup&gt;&lt;a href="http://zh.wikipedia.org/wiki/Windows_API#cite_note-msdn-gdi-5"&gt;[6]&lt;/a&gt;&lt;/sup&gt;，提供功能为：输出图形内容到&lt;a href="http://zh.wikipedia.org/wiki/%E6%98%BE%E7%A4%BA%E5%99%A8"&gt;显示器&lt;/a&gt;、&lt;a href="http://zh.wikipedia.org/wiki/%E6%89%93%E5%8D%B0%E6%9C%BA"&gt;打印机&lt;/a&gt;以及其他外部输出设备。它位于16位元Windows下的&lt;tt&gt;gdi.exe&lt;/tt&gt;；以及32位元Windows下的&lt;tt&gt;gdi32.dll&lt;/tt&gt;。 &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;图形化用户界面（&lt;a href="http://zh.wikipedia.org/wiki/GUI"&gt;GUI&lt;/a&gt;）&lt;sup&gt;&lt;a href="http://zh.wikipedia.org/wiki/Windows_API#cite_note-msdn-ui-6"&gt;[7]&lt;/a&gt;&lt;/sup&gt;，提供的功能有创建和管理屏幕和大多数基本控件（control），比如&lt;a href="http://zh.wikipedia.org/wiki/%E6%8C%89%E9%92%AE"&gt;按钮&lt;/a&gt;和&lt;a href="http://zh.wikipedia.org/w/index.php?title=%E6%BB%9A%E5%8A%A8%E6%9D%A1&amp;amp;action=edit&amp;amp;redlink=1"&gt;滚动条&lt;/a&gt;。接收&lt;a href="http://zh.wikipedia.org/wiki/%E9%BC%A0%E6%A0%87"&gt;鼠标&lt;/a&gt;和&lt;a href="http://zh.wikipedia.org/wiki/%E9%94%AE%E7%9B%98"&gt;键盘&lt;/a&gt;输入，以及其他与GUI有关的功能。这些调用接口位于：16位元Windows下的&lt;tt&gt;user.exe&lt;/tt&gt;，以及32位元Windows下的&lt;tt&gt;user32.dll&lt;/tt&gt;。从&lt;a href="http://zh.wikipedia.org/wiki/Windows_XP"&gt;Windows XP&lt;/a&gt;版本之后，基本控件和通用对话框控件（Common Control Library）的调用接口放在&lt;tt&gt;comctl32.dll&lt;/tt&gt;中。 &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;通用对话框链接库（Common Dialog Box Library）&lt;sup&gt;&lt;a href="http://zh.wikipedia.org/wiki/Windows_API#cite_note-msdn-comdlg-7"&gt;[8]&lt;/a&gt;&lt;/sup&gt;，为应用程序提供标准对话框，比如打开／保存文件对话框、颜色对画框和字体对话框等等。这个链接库位于：16位元Windows下的&lt;tt&gt;commdlg.dll&lt;/tt&gt;中，以及32位元Windows下&lt;tt&gt;comdlg32.dll&lt;/tt&gt;中。它被归类为User Interface API之下。 &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;通用控件链接库（Common Control Library）&lt;sup&gt;&lt;a href="http://zh.wikipedia.org/wiki/Windows_API#cite_note-msdn-ccl-8"&gt;[9]&lt;/a&gt;&lt;/sup&gt;，为应用程序提供接口来访问操作系统提供的一些高级控件。比如像：&lt;a href="http://zh.wikipedia.org/w/index.php?title=%E7%8A%B6%E6%80%81%E6%A0%8F&amp;amp;action=edit&amp;amp;redlink=1"&gt;状态栏&lt;/a&gt;（status bar）、进度条（progress bars）、&lt;a href="http://zh.wikipedia.org/wiki/%E5%B7%A5%E5%85%B7%E6%A0%8F"&gt;工具栏&lt;/a&gt;（toolbar）和&lt;a href="http://zh.wikipedia.org/wiki/%E6%A0%87%E7%AD%BE"&gt;标签&lt;/a&gt;（tab）。这个链接库位于：16位元Windows下的&lt;tt&gt;commctrl.dll&lt;/tt&gt;中，以及32位元Windows下&lt;tt&gt;comctl32.dll&lt;/tt&gt;中。。它被归类为User Interface API之下。 &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Windows外壳（Windows Shell）&lt;sup&gt;&lt;a href="http://zh.wikipedia.org/wiki/Windows_API#cite_note-msdn-shell-9"&gt;[10]&lt;/a&gt;&lt;/sup&gt;&lt;sup&gt;&lt;a href="http://zh.wikipedia.org/wiki/Windows_API#cite_note-msdn-shell2-10"&gt;[11]&lt;/a&gt;&lt;/sup&gt;，作为Windows API的组成部分，不仅允许应用程序访问&lt;a href="http://zh.wikipedia.org/w/index.php?title=%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9Fshell&amp;amp;action=edit&amp;amp;redlink=1"&gt;操作系统shell&lt;/a&gt;提供的功能，还对之有所改进和增强。它位于16位元Windows下的&lt;tt&gt;shell.dll&lt;/tt&gt;中，以及32位元Windows下的&lt;tt&gt;shell32.dll&lt;/tt&gt;中（&lt;a href="http://zh.wikipedia.org/wiki/Windows_95"&gt;Windows 95&lt;/a&gt;则在 &lt;tt&gt;shlwapi.dll&lt;/tt&gt;中）。 它被归类为User Interface API之下。 &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;网络服务（Network Services）&lt;sup&gt;&lt;a href="http://zh.wikipedia.org/wiki/Windows_API#cite_note-msdn-network-11"&gt;[12]&lt;/a&gt;&lt;/sup&gt;，为访问操作系统提供的多种&lt;a href="http://zh.wikipedia.org/wiki/%E7%BD%91%E7%BB%9C"&gt;网络&lt;/a&gt; 功能提供接口。它包括&lt;a href="http://zh.wikipedia.org/w/index.php?title=NetBIOS&amp;amp;action=edit&amp;amp;redlink=1"&gt;NetBIOS&lt;/a&gt;、&lt;a href="http://zh.wikipedia.org/w/index.php?title=Winsock&amp;amp;action=edit&amp;amp;redlink=1"&gt;Winsock&lt;/a&gt;、&lt;a href="http://zh.wikipedia.org/w/index.php?title=NetDDE&amp;amp;action=edit&amp;amp;redlink=1"&gt;NetDDE&lt;/a&gt;及&lt;a href="http://zh.wikipedia.org/wiki/RPC"&gt;RPC&lt;/a&gt;等。&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;p&gt;这里，暂时就这么多了，你，见过自定义入口的程序吗？可以拿出来和大家共享吗？&lt;/p&gt;&lt;p&gt;参考：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://zh.wikipedia.org/wiki/Windows_API"&gt;http://zh.wikipedia.org/wiki/Windows_API&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;img src="http://www.cnblogs.com/cnyao/aggbug/2088404.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cnyao/archive/2011/06/23/winsdk7_nocrt.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cnyao/archive/2011/06/21/win32sdk_o1.html</id><title type="text">从零开始，学习windows编程外篇（1）--分析lib文件</title><summary type="text">大家都知道，lib文件是很多obj文件合在一起得到的一个静态库文件。那某一个特定的lib文件，到底是由哪些obj文件组成的呢？有一个工具可以帮到你，它的名字叫做lib.exe。还是用LIBC.LIB来举例。我电脑上这个lib文件的位置是在“d:\Program Files\Microsoft Visual Studio\VC98\Lib\LIBC.LIB”，进入这个目录。所有的lib使用选项：d:\Program Files\Microsoft Visual Studio\VC98\Lib&gt;lib /? Microsoft (R) Library Manager Version 6.00</summary><published>2011-06-21T08:14:00Z</published><updated>2011-06-21T08:14:00Z</updated><author><name>cnyao</name><uri>http://www.cnblogs.com/cnyao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cnyao/archive/2011/06/21/win32sdk_o1.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cnyao/archive/2011/06/21/win32sdk_o1.html"/><content type="html">&lt;p&gt;大家都知道，lib文件是很多obj文件合在一起得到的一个静态库文件。那某一个特定的lib文件，到底是由哪些obj文件组成的呢？&lt;/p&gt;&lt;p&gt;有一个工具可以帮到你，它的名字叫做lib.exe。&lt;/p&gt;&lt;p&gt;还是用LIBC.LIB来举例。我电脑上这个lib文件的位置是在&amp;ldquo;d:\Program Files\Microsoft Visual Studio\VC98\Lib\LIBC.LIB&amp;rdquo;，进入这个目录。&lt;/p&gt;&lt;p&gt;所有的lib使用选项：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;d:\Program Files\Microsoft Visual Studio\VC98\Lib&amp;gt;lib /?     &lt;br /&gt;Microsoft (R) Library Manager Version 6.00.8447      &lt;br /&gt;Copyright (C) Microsoft Corp 1992-1998. All rights reserved. &lt;/p&gt;&lt;p&gt;usage: LIB [options] [files] &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; options: &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /CONVERT     &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /DEBUGTYPE:CV      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /DEF[:filename]      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /EXPORT:symbol      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /EXTRACT:membername      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /INCLUDE:symbol      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /LIBPATH:dir      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /LINK50COMPAT      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /LIST[:filename]      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /MACHINE:{ALPHA|ARM|IX86|MIPS|MIPS16|MIPSR41XX|PPC|SH3|SH4}      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /NAME:filename      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /NODEFAULTLIB[:library]      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /NOLOGO      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /OUT:filename      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /REMOVE:membername      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /SUBSYSTEM:{NATIVE|WINDOWS|CONSOLE|WINDOWSCE|POSIX}[,#[.##]]      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /VERBOSE&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;可以使用list来显示其中的obj文件。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;d:\Program Files\Microsoft Visual Studio\VC98\Lib&amp;gt;lib /list libc.lib&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;整个列表比较长，所以我又做了个重定向，将输入放到log文件中了。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;d:\Program Files\Microsoft Visual Studio\VC98\Lib&amp;gt;lib /list libc.lib &amp;gt; d:\test\libc.log&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;最终输出有600多行，所以折叠起来，大家可以展开看。&lt;/p&gt;&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Microsoft (R) Library Manager Version 6.00.8447&lt;br/&gt;Copyright (C) Microsoft Corp 1992-1998. All rights reserved.&lt;br/&gt;&lt;br/&gt;..\build\intel\st_obj\util.obj&lt;br/&gt;..\build\intel\st_obj\matherr.obj&lt;br/&gt;..\build\intel\st_obj\ldexp.obj&lt;br/&gt;..\build\intel\st_obj\ieeemisc.obj&lt;br/&gt;..\build\intel\st_obj\frexp.obj&lt;br/&gt;..\build\intel\st_obj\fpexcept.obj&lt;br/&gt;..\build\intel\st_obj\bessel.obj&lt;br/&gt;..\build\intel\st_obj\xmmi2_fp_emul.obj&lt;br/&gt;..\build\intel\st_obj\xmmi_fp_emul.obj&lt;br/&gt;..\build\intel\st_obj\sqrt.obj&lt;br/&gt;..\build\intel\st_obj\pow.obj&lt;br/&gt;..\build\intel\st_obj\log10.obj&lt;br/&gt;..\build\intel\st_obj\log.obj&lt;br/&gt;..\build\intel\st_obj\tan.obj&lt;br/&gt;..\build\intel\st_obj\cos.obj&lt;br/&gt;..\build\intel\st_obj\sin.obj&lt;br/&gt;..\build\intel\st_obj\atan.obj&lt;br/&gt;..\build\intel\st_obj\acos.obj&lt;br/&gt;..\build\intel\st_obj\asin.obj&lt;br/&gt;..\build\intel\st_obj\testfdiv.obj&lt;br/&gt;..\build\intel\st_obj\powhlp.obj&lt;br/&gt;..\build\intel\st_obj\modf.obj&lt;br/&gt;..\build\intel\st_obj\ieee87.obj&lt;br/&gt;..\build\intel\st_obj\hypot.obj&lt;br/&gt;..\build\intel\st_obj\huge.obj&lt;br/&gt;..\build\intel\st_obj\genexcep.obj&lt;br/&gt;..\build\intel\st_obj\ftol.obj&lt;br/&gt;..\build\intel\st_obj\fsqrt.obj&lt;br/&gt;..\build\intel\st_obj\frnd.obj&lt;br/&gt;..\build\intel\st_obj\fpctrl.obj&lt;br/&gt;..\build\intel\st_obj\floor.obj&lt;br/&gt;..\build\intel\st_obj\filter_simd.obj&lt;br/&gt;..\build\intel\st_obj\filter.obj&lt;br/&gt;..\build\intel\st_obj\fabs.obj&lt;br/&gt;..\build\intel\st_obj\common.obj&lt;br/&gt;..\build\intel\st_obj\ceil.obj&lt;br/&gt;..\build\intel\st_obj\adj_fdiv.obj&lt;br/&gt;..\build\intel\st_obj\87trigh.obj&lt;br/&gt;..\build\intel\st_obj\87triga.obj&lt;br/&gt;..\build\intel\st_obj\87trig.obj&lt;br/&gt;..\build\intel\st_obj\87tran.obj&lt;br/&gt;..\build\intel\st_obj\87sqrt.obj&lt;br/&gt;..\build\intel\st_obj\87fmod.obj&lt;br/&gt;..\build\intel\st_obj\87except.obj&lt;br/&gt;..\build\intel\st_obj\87disp.obj&lt;br/&gt;..\build\intel\st_obj\87ctrigh.obj&lt;br/&gt;..\build\intel\st_obj\87ctriga.obj&lt;br/&gt;..\build\intel\st_obj\87ctran.obj&lt;br/&gt;..\build\intel\st_obj\87cdisp.obj&lt;br/&gt;..\build\intel\st_obj\fltinf.obj&lt;br/&gt;..\build\intel\st_obj\x10fout.obj&lt;br/&gt;..\build\intel\st_obj\tenpow.obj&lt;br/&gt;..\build\intel\st_obj\strgtold.obj&lt;br/&gt;..\build\intel\st_obj\mantold.obj&lt;br/&gt;..\build\intel\st_obj\intrncvt.obj&lt;br/&gt;..\build\intel\st_obj\fpinit.obj&lt;br/&gt;..\build\intel\st_obj\cvt.obj&lt;br/&gt;..\build\intel\st_obj\constpow.obj&lt;br/&gt;..\build\intel\st_obj\cfout.obj&lt;br/&gt;..\build\intel\st_obj\cfin.obj&lt;br/&gt;build\intel\st_obj\wutime.obj&lt;br/&gt;build\intel\st_obj\wstrtime.obj&lt;br/&gt;build\intel\st_obj\wstrdate.obj&lt;br/&gt;build\intel\st_obj\wctime.obj&lt;br/&gt;build\intel\st_obj\wasctime.obj&lt;br/&gt;build\intel\st_obj\wcsftime.obj&lt;br/&gt;build\intel\st_obj\utime.obj&lt;br/&gt;build\intel\st_obj\tzset.obj&lt;br/&gt;build\intel\st_obj\timeset.obj&lt;br/&gt;build\intel\st_obj\time.obj&lt;br/&gt;build\intel\st_obj\systime.obj&lt;br/&gt;build\intel\st_obj\strtime.obj&lt;br/&gt;build\intel\st_obj\strdate.obj&lt;br/&gt;build\intel\st_obj\strftime.obj&lt;br/&gt;build\intel\st_obj\mktime.obj&lt;br/&gt;build\intel\st_obj\localtim.obj&lt;br/&gt;build\intel\st_obj\gmtime.obj&lt;br/&gt;build\intel\st_obj\ftime.obj&lt;br/&gt;build\intel\st_obj\dtoxtime.obj&lt;br/&gt;build\intel\st_obj\difftime.obj&lt;br/&gt;build\intel\st_obj\days.obj&lt;br/&gt;build\intel\st_obj\ctime.obj&lt;br/&gt;build\intel\st_obj\clock.obj&lt;br/&gt;build\intel\st_obj\asctime.obj&lt;br/&gt;build\intel\st_obj\tcmap\mbslen.obj&lt;br/&gt;build\intel\st_obj\tcmap\nset.obj&lt;br/&gt;build\intel\st_obj\tcmap\nicoll.obj&lt;br/&gt;build\intel\st_obj\tcmap\nicmp.obj&lt;br/&gt;build\intel\st_obj\tcmap\ncpy.obj&lt;br/&gt;build\intel\st_obj\tcmap\ncoll.obj&lt;br/&gt;build\intel\st_obj\tcmap\ncmp.obj&lt;br/&gt;build\intel\st_obj\tcmap\ncat.obj&lt;br/&gt;build\intel\st_obj\tcmap\nbset.obj&lt;br/&gt;build\intel\st_obj\tcmap\nbicoll.obj&lt;br/&gt;build\intel\st_obj\tcmap\nbicmp.obj&lt;br/&gt;build\intel\st_obj\tcmap\nbcpy.obj&lt;br/&gt;build\intel\st_obj\tcmap\nbcoll.obj&lt;br/&gt;build\intel\st_obj\tcmap\nbcmp.obj&lt;br/&gt;build\intel\st_obj\tcmap\nbcat.obj&lt;br/&gt;build\intel\st_obj\tcmap\_mbscpy.obj&lt;br/&gt;build\intel\st_obj\tcmap\_mbclen.obj&lt;br/&gt;build\intel\st_obj\tcmap\len.obj&lt;br/&gt;build\intel\st_obj\tcmap\icoll.obj&lt;br/&gt;build\intel\st_obj\tcmap\coll.obj&lt;br/&gt;build\intel\st_obj\tcmap\icmp.obj&lt;br/&gt;build\intel\st_obj\tcmap\cmp.obj&lt;br/&gt;build\intel\st_obj\tcmap\upr.obj&lt;br/&gt;build\intel\st_obj\tcmap\lwr.obj&lt;br/&gt;build\intel\st_obj\tcmap\spnp.obj&lt;br/&gt;build\intel\st_obj\tcmap\ninc.obj&lt;br/&gt;build\intel\st_obj\tcmap\nextc.obj&lt;br/&gt;build\intel\st_obj\tcmap\nccnt.obj&lt;br/&gt;build\intel\st_obj\tcmap\nbcnt.obj&lt;br/&gt;build\intel\st_obj\tcmap\inc.obj&lt;br/&gt;build\intel\st_obj\tcmap\dec.obj&lt;br/&gt;build\intel\st_obj\tcmap\set.obj&lt;br/&gt;build\intel\st_obj\tcmap\rev.obj&lt;br/&gt;build\intel\st_obj\tcmap\tok.obj&lt;br/&gt;build\intel\st_obj\tcmap\str.obj&lt;br/&gt;build\intel\st_obj\tcmap\spn.obj&lt;br/&gt;build\intel\st_obj\tcmap\rchr.obj&lt;br/&gt;build\intel\st_obj\tcmap\pbrk.obj&lt;br/&gt;build\intel\st_obj\tcmap\cspn.obj&lt;br/&gt;build\intel\st_obj\tcmap\chr.obj&lt;br/&gt;build\intel\st_obj\wcsxfrm.obj&lt;br/&gt;build\intel\st_obj\wcsupr.obj&lt;br/&gt;build\intel\st_obj\wcstok.obj&lt;br/&gt;build\intel\st_obj\wcsstr.obj&lt;br/&gt;build\intel\st_obj\wcsspn.obj&lt;br/&gt;build\intel\st_obj\wcsset.obj&lt;br/&gt;build\intel\st_obj\wcsrev.obj&lt;br/&gt;build\intel\st_obj\wcsrchr.obj&lt;br/&gt;build\intel\st_obj\wcspbrk.obj&lt;br/&gt;build\intel\st_obj\wcsnset.obj&lt;br/&gt;build\intel\st_obj\wcsnicol.obj&lt;br/&gt;build\intel\st_obj\wcsnicmp.obj&lt;br/&gt;build\intel\st_obj\wcsncpy.obj&lt;br/&gt;build\intel\st_obj\wcsncoll.obj&lt;br/&gt;build\intel\st_obj\wcsncmp.obj&lt;br/&gt;build\intel\st_obj\wcsncat.obj&lt;br/&gt;build\intel\st_obj\wcslwr.obj&lt;br/&gt;build\intel\st_obj\wcslen.obj&lt;br/&gt;build\intel\st_obj\wcsicoll.obj&lt;br/&gt;build\intel\st_obj\wcsicmp.obj&lt;br/&gt;build\intel\st_obj\wcsdup.obj&lt;br/&gt;build\intel\st_obj\wcscspn.obj&lt;br/&gt;build\intel\st_obj\wcscoll.obj&lt;br/&gt;build\intel\st_obj\wcscmp.obj&lt;br/&gt;build\intel\st_obj\wcschr.obj&lt;br/&gt;build\intel\st_obj\wcscat.obj&lt;br/&gt;build\intel\st_obj\strxfrm.obj&lt;br/&gt;build\intel\st_obj\strupr.obj&lt;br/&gt;build\intel\st_obj\strtok.obj&lt;br/&gt;build\intel\st_obj\strnicol.obj&lt;br/&gt;build\intel\st_obj\strncoll.obj&lt;br/&gt;build\intel\st_obj\strlwr.obj&lt;br/&gt;build\intel\st_obj\stricoll.obj&lt;br/&gt;build\intel\st_obj\strcoll.obj&lt;br/&gt;build\intel\st_obj\strstr.obj&lt;br/&gt;build\intel\st_obj\strspn.obj&lt;br/&gt;build\intel\st_obj\strset.obj&lt;br/&gt;build\intel\st_obj\strrev.obj&lt;br/&gt;build\intel\st_obj\strrchr.obj&lt;br/&gt;build\intel\st_obj\strpbrk.obj&lt;br/&gt;build\intel\st_obj\strnset.obj&lt;br/&gt;build\intel\st_obj\strnicmp.obj&lt;br/&gt;build\intel\st_obj\strncpy.obj&lt;br/&gt;build\intel\st_obj\strncmp.obj&lt;br/&gt;build\intel\st_obj\strncat.obj&lt;br/&gt;build\intel\st_obj\strlen.obj&lt;br/&gt;build\intel\st_obj\stricmp.obj&lt;br/&gt;build\intel\st_obj\strdup.obj&lt;br/&gt;build\intel\st_obj\strcspn.obj&lt;br/&gt;build\intel\st_obj\strcmp.obj&lt;br/&gt;build\intel\st_obj\strchr.obj&lt;br/&gt;build\intel\st_obj\strcat.obj&lt;br/&gt;build\intel\st_obj\memset.obj&lt;br/&gt;build\intel\st_obj\memmove.obj&lt;br/&gt;build\intel\st_obj\memicmp.obj&lt;br/&gt;build\intel\st_obj\memccpy.obj&lt;br/&gt;build\intel\st_obj\memcmp.obj&lt;br/&gt;build\intel\st_obj\memchr.obj&lt;br/&gt;build\intel\st_obj\memcpy.obj&lt;br/&gt;build\intel\st_obj\ncommode.obj&lt;br/&gt;build\intel\st_obj\wtmpfile.obj&lt;br/&gt;build\intel\st_obj\wtempnam.obj&lt;br/&gt;build\intel\st_obj\wscanf.obj&lt;br/&gt;build\intel\st_obj\wprintf.obj&lt;br/&gt;build\intel\st_obj\wpopen.obj&lt;br/&gt;build\intel\st_obj\woutput.obj&lt;br/&gt;build\intel\st_obj\_wopen.obj&lt;br/&gt;build\intel\st_obj\winput.obj&lt;br/&gt;build\intel\st_obj\wfreopen.obj&lt;br/&gt;build\intel\st_obj\wfopen.obj&lt;br/&gt;build\intel\st_obj\wfdopen.obj&lt;br/&gt;build\intel\st_obj\vwprintf.obj&lt;br/&gt;build\intel\st_obj\vswprint.obj&lt;br/&gt;build\intel\st_obj\vsnwprnt.obj&lt;br/&gt;build\intel\st_obj\vsnprint.obj&lt;br/&gt;build\intel\st_obj\vsprintf.obj&lt;br/&gt;build\intel\st_obj\vfwprint.obj&lt;br/&gt;build\intel\st_obj\vfprintf.obj&lt;br/&gt;build\intel\st_obj\vprintf.obj&lt;br/&gt;build\intel\st_obj\ungetwc.obj&lt;br/&gt;build\intel\st_obj\ungetc.obj&lt;br/&gt;build\intel\st_obj\tmpfile.obj&lt;br/&gt;build\intel\st_obj\tempnam.obj&lt;br/&gt;build\intel\st_obj\swscanf.obj&lt;br/&gt;build\intel\st_obj\swprintf.obj&lt;br/&gt;build\intel\st_obj\stream.obj&lt;br/&gt;build\intel\st_obj\sscanf.obj&lt;br/&gt;build\intel\st_obj\sprintf.obj&lt;br/&gt;build\intel\st_obj\snwprint.obj&lt;br/&gt;build\intel\st_obj\snprintf.obj&lt;br/&gt;build\intel\st_obj\setvbuf.obj&lt;br/&gt;build\intel\st_obj\setbuf.obj&lt;br/&gt;build\intel\st_obj\setmaxf.obj&lt;br/&gt;build\intel\st_obj\scanf.obj&lt;br/&gt;build\intel\st_obj\rmtmp.obj&lt;br/&gt;build\intel\st_obj\rewind.obj&lt;br/&gt;build\intel\st_obj\putws.obj&lt;br/&gt;build\intel\st_obj\putw.obj&lt;br/&gt;build\intel\st_obj\puts.obj&lt;br/&gt;build\intel\st_obj\printf.obj&lt;br/&gt;build\intel\st_obj\popen.obj&lt;br/&gt;build\intel\st_obj\output.obj&lt;br/&gt;build\intel\st_obj\input.obj&lt;br/&gt;build\intel\st_obj\getws.obj&lt;br/&gt;build\intel\st_obj\getw.obj&lt;br/&gt;build\intel\st_obj\gets.obj&lt;br/&gt;build\intel\st_obj\fwscanf.obj&lt;br/&gt;build\intel\st_obj\fwrite.obj&lt;br/&gt;build\intel\st_obj\fwprintf.obj&lt;br/&gt;build\intel\st_obj\ftelli64.obj&lt;br/&gt;build\intel\st_obj\ftell.obj&lt;br/&gt;build\intel\st_obj\fsetpos.obj&lt;br/&gt;build\intel\st_obj\fseeki64.obj&lt;br/&gt;build\intel\st_obj\fseek.obj&lt;br/&gt;build\intel\st_obj\fscanf.obj&lt;br/&gt;build\intel\st_obj\freopen.obj&lt;br/&gt;build\intel\st_obj\fread.obj&lt;br/&gt;build\intel\st_obj\fprintf.obj&lt;br/&gt;build\intel\st_obj\fopen.obj&lt;br/&gt;build\intel\st_obj\fgetpos.obj&lt;br/&gt;build\intel\st_obj\fflush.obj&lt;br/&gt;build\intel\st_obj\fdopen.obj&lt;br/&gt;build\intel\st_obj\fclose.obj&lt;br/&gt;build\intel\st_obj\cscanf.obj&lt;br/&gt;build\intel\st_obj\cprintf.obj&lt;br/&gt;build\intel\st_obj\closeall.obj&lt;br/&gt;build\intel\st_obj\clearerr.obj&lt;br/&gt;build\intel\st_obj\_sftbuf.obj&lt;br/&gt;build\intel\st_obj\_open.obj&lt;br/&gt;build\intel\st_obj\_getbuf.obj&lt;br/&gt;build\intel\st_obj\_freebuf.obj&lt;br/&gt;build\intel\st_obj\_flswbuf.obj&lt;br/&gt;build\intel\st_obj\_flsbuf.obj&lt;br/&gt;build\intel\st_obj\_file.obj&lt;br/&gt;build\intel\st_obj\_filwbuf.obj&lt;br/&gt;build\intel\st_obj\_filbuf.obj&lt;br/&gt;build\intel\st_obj\fputwchr.obj&lt;br/&gt;build\intel\st_obj\fputws.obj&lt;br/&gt;build\intel\st_obj\fputwc.obj&lt;br/&gt;build\intel\st_obj\fputchar.obj&lt;br/&gt;build\intel\st_obj\fputs.obj&lt;br/&gt;build\intel\st_obj\fputc.obj&lt;br/&gt;build\intel\st_obj\fileno.obj&lt;br/&gt;build\intel\st_obj\fgetwchr.obj&lt;br/&gt;build\intel\st_obj\fgetws.obj&lt;br/&gt;build\intel\st_obj\fgetwc.obj&lt;br/&gt;build\intel\st_obj\fgets.obj&lt;br/&gt;build\intel\st_obj\fgetchar.obj&lt;br/&gt;build\intel\st_obj\fgetc.obj&lt;br/&gt;build\intel\st_obj\feoferr.obj&lt;br/&gt;build\intel\st_obj\fp8.obj&lt;br/&gt;build\intel\st_obj\atlssup.obj&lt;br/&gt;build\intel\st_obj\wwincrt0.obj&lt;br/&gt;build\intel\st_obj\wwild.obj&lt;br/&gt;build\intel\st_obj\wwncmdln.obj&lt;br/&gt;build\intel\st_obj\wstdenvp.obj&lt;br/&gt;build\intel\st_obj\wstdargv.obj&lt;br/&gt;build\intel\st_obj\wincrt0.obj&lt;br/&gt;build\intel\st_obj\wincmdln.obj&lt;br/&gt;build\intel\st_obj\wild.obj&lt;br/&gt;build\intel\st_obj\wcrt0.obj&lt;br/&gt;build\intel\st_obj\tlssup.obj&lt;br/&gt;build\intel\st_obj\tidtable.obj&lt;br/&gt;build\intel\st_obj\threadex.obj&lt;br/&gt;build\intel\st_obj\thread.obj&lt;br/&gt;build\intel\st_obj\stdenvp.obj&lt;br/&gt;build\intel\st_obj\stdargv.obj&lt;br/&gt;build\intel\st_obj\mlock.obj&lt;br/&gt;build\intel\st_obj\dllmain.obj&lt;br/&gt;build\intel\st_obj\dllcrt0.obj&lt;br/&gt;build\intel\st_obj\crt0msg.obj&lt;br/&gt;build\intel\st_obj\crt0init.obj&lt;br/&gt;build\intel\st_obj\crt0fp.obj&lt;br/&gt;build\intel\st_obj\crt0dat.obj&lt;br/&gt;build\intel\st_obj\crt0.obj&lt;br/&gt;build\intel\st_obj\chkstk.obj&lt;br/&gt;build\intel\st_obj\_wstargv.obj&lt;br/&gt;build\intel\st_obj\_setargv.obj&lt;br/&gt;build\intel\st_obj\wtombenv.obj&lt;br/&gt;build\intel\st_obj\wrt2err.obj&lt;br/&gt;build\intel\st_obj\wsplitpa.obj&lt;br/&gt;build\intel\st_obj\wsetloca.obj&lt;br/&gt;build\intel\st_obj\wsetenv.obj&lt;br/&gt;build\intel\st_obj\wsearche.obj&lt;br/&gt;build\intel\st_obj\wputenv.obj&lt;br/&gt;build\intel\st_obj\wperror.obj&lt;br/&gt;build\intel\st_obj\wmakepat.obj&lt;br/&gt;build\intel\st_obj\wgetpath.obj&lt;br/&gt;build\intel\st_obj\wgetenv.obj&lt;br/&gt;build\intel\st_obj\winxfltr.obj&lt;br/&gt;build\intel\st_obj\winsig.obj&lt;br/&gt;build\intel\st_obj\w_str.obj&lt;br/&gt;build\intel\st_obj\w_map.obj&lt;br/&gt;build\intel\st_obj\w_loc.obj&lt;br/&gt;build\intel\st_obj\w_env.obj&lt;br/&gt;build\intel\st_obj\w_cmp.obj&lt;br/&gt;build\intel\st_obj\umask.obj&lt;br/&gt;build\intel\st_obj\syserr.obj&lt;br/&gt;build\intel\st_obj\strerror.obj&lt;br/&gt;build\intel\st_obj\_strerr.obj&lt;br/&gt;build\intel\st_obj\splitpat.obj&lt;br/&gt;build\intel\st_obj\setlocal.obj&lt;br/&gt;build\intel\st_obj\setenv.obj&lt;br/&gt;build\intel\st_obj\searchen.obj&lt;br/&gt;build\intel\st_obj\rotr.obj&lt;br/&gt;build\intel\st_obj\rotl.obj&lt;br/&gt;build\intel\st_obj\rand.obj&lt;br/&gt;build\intel\st_obj\qsort.obj&lt;br/&gt;build\intel\st_obj\putenv.obj&lt;br/&gt;build\intel\st_obj\purevirt.obj&lt;br/&gt;build\intel\st_obj\perror.obj&lt;br/&gt;build\intel\st_obj\nlsdata3.obj&lt;br/&gt;build\intel\st_obj\nlsdata2.obj&lt;br/&gt;build\intel\st_obj\nlsdata1.obj&lt;br/&gt;build\intel\st_obj\onexit.obj&lt;br/&gt;build\intel\st_obj\mbtowenv.obj&lt;br/&gt;build\intel\st_obj\makepath.obj&lt;br/&gt;build\intel\st_obj\lsearch.obj&lt;br/&gt;build\intel\st_obj\lfind.obj&lt;br/&gt;build\intel\st_obj\ldiv.obj&lt;br/&gt;build\intel\st_obj\lconv.obj&lt;br/&gt;build\intel\st_obj\lcnvinit.obj&lt;br/&gt;build\intel\st_obj\labs.obj&lt;br/&gt;build\intel\st_obj\inittime.obj&lt;br/&gt;build\intel\st_obj\initnum.obj&lt;br/&gt;build\intel\st_obj\initmon.obj&lt;br/&gt;build\intel\st_obj\inithelp.obj&lt;br/&gt;build\intel\st_obj\initctyp.obj&lt;br/&gt;build\intel\st_obj\initcoll.obj&lt;br/&gt;build\intel\st_obj\getqloc.obj&lt;br/&gt;build\intel\st_obj\getpath.obj&lt;br/&gt;build\intel\st_obj\getenv.obj&lt;br/&gt;build\intel\st_obj\errmode.obj&lt;br/&gt;build\intel\st_obj\dbgrpt.obj&lt;br/&gt;build\intel\st_obj\dbgnew.obj&lt;br/&gt;build\intel\st_obj\dbgdel.obj&lt;br/&gt;build\intel\st_obj\dbghook.obj&lt;br/&gt;build\intel\st_obj\dbgheap.obj&lt;br/&gt;build\intel\st_obj\div.obj&lt;br/&gt;build\intel\st_obj\ctype.obj&lt;br/&gt;build\intel\st_obj\crtmbox.obj&lt;br/&gt;build\intel\st_obj\cmiscdat.obj&lt;br/&gt;build\intel\st_obj\charmax.obj&lt;br/&gt;build\intel\st_obj\bsearch.obj&lt;br/&gt;build\intel\st_obj\aw_com.obj&lt;br/&gt;build\intel\st_obj\assert.obj&lt;br/&gt;build\intel\st_obj\abs.obj&lt;br/&gt;build\intel\st_obj\abort.obj&lt;br/&gt;build\intel\st_obj\a_str.obj&lt;br/&gt;build\intel\st_obj\a_map.obj&lt;br/&gt;build\intel\st_obj\a_loc.obj&lt;br/&gt;build\intel\st_obj\a_env.obj&lt;br/&gt;build\intel\st_obj\a_cmp.obj&lt;br/&gt;build\intel\st_obj\setjmpex.obj&lt;br/&gt;build\intel\st_obj\setjmp3.obj&lt;br/&gt;build\intel\st_obj\setjmp.obj&lt;br/&gt;build\intel\st_obj\sehsupp.obj&lt;br/&gt;build\intel\st_obj\longjmp.obj&lt;br/&gt;build\intel\st_obj\exsup3.obj&lt;br/&gt;build\intel\st_obj\exsup2.obj&lt;br/&gt;build\intel\st_obj\exsup.obj&lt;br/&gt;build\intel\st_obj\chkesp.obj&lt;br/&gt;build\intel\st_obj\tombbmbc.obj&lt;br/&gt;build\intel\st_obj\tojisjms.obj&lt;br/&gt;build\intel\st_obj\mbtoupr.obj&lt;br/&gt;build\intel\st_obj\mbtolwr.obj&lt;br/&gt;build\intel\st_obj\mbtokata.obj&lt;br/&gt;build\intel\st_obj\mbtohira.obj&lt;br/&gt;build\intel\st_obj\mbsupr.obj&lt;br/&gt;build\intel\st_obj\mbstok.obj&lt;br/&gt;build\intel\st_obj\mbsstr.obj&lt;br/&gt;build\intel\st_obj\mbsspnp.obj&lt;br/&gt;build\intel\st_obj\mbsspn.obj&lt;br/&gt;build\intel\st_obj\mbsset.obj&lt;br/&gt;build\intel\st_obj\mbsrev.obj&lt;br/&gt;build\intel\st_obj\mbsrchr.obj&lt;br/&gt;build\intel\st_obj\mbspbrk.obj&lt;br/&gt;build\intel\st_obj\mbsnset.obj&lt;br/&gt;build\intel\st_obj\mbsninc.obj&lt;br/&gt;build\intel\st_obj\mbsnicol.obj&lt;br/&gt;build\intel\st_obj\mbsnicmp.obj&lt;br/&gt;build\intel\st_obj\mbsnextc.obj&lt;br/&gt;build\intel\st_obj\mbsncpy.obj&lt;br/&gt;build\intel\st_obj\mbsncoll.obj&lt;br/&gt;build\intel\st_obj\mbsncmp.obj&lt;br/&gt;build\intel\st_obj\mbsnccnt.obj&lt;br/&gt;build\intel\st_obj\mbsncat.obj&lt;br/&gt;build\intel\st_obj\mbsnbset.obj&lt;br/&gt;build\intel\st_obj\mbsnbico.obj&lt;br/&gt;build\intel\st_obj\mbsnbicm.obj&lt;br/&gt;build\intel\st_obj\mbsnbcpy.obj&lt;br/&gt;build\intel\st_obj\mbsnbcol.obj&lt;br/&gt;build\intel\st_obj\mbsnbcnt.obj&lt;br/&gt;build\intel\st_obj\mbsnbcmp.obj&lt;br/&gt;build\intel\st_obj\mbsnbcat.obj&lt;br/&gt;build\intel\st_obj\mbslwr.obj&lt;br/&gt;build\intel\st_obj\mbslen.obj&lt;br/&gt;build\intel\st_obj\mbsinc.obj&lt;br/&gt;build\intel\st_obj\mbsicoll.obj&lt;br/&gt;build\intel\st_obj\mbsicmp.obj&lt;br/&gt;build\intel\st_obj\mbsdec.obj&lt;br/&gt;build\intel\st_obj\mbscspn.obj&lt;br/&gt;build\intel\st_obj\mbscoll.obj&lt;br/&gt;build\intel\st_obj\mbscmp.obj&lt;br/&gt;build\intel\st_obj\mbschr.obj&lt;br/&gt;build\intel\st_obj\mbsbtype.obj&lt;br/&gt;build\intel\st_obj\mbctype.obj&lt;br/&gt;build\intel\st_obj\mbclevel.obj&lt;br/&gt;build\intel\st_obj\mbclen.obj&lt;br/&gt;build\intel\st_obj\mbccpy.obj&lt;br/&gt;build\intel\st_obj\mbbtype.obj&lt;br/&gt;build\intel\st_obj\ismbupr.obj&lt;br/&gt;build\intel\st_obj\ismbstr.obj&lt;br/&gt;build\intel\st_obj\ismbspc.obj&lt;br/&gt;build\intel\st_obj\ismbsle.obj&lt;br/&gt;build\intel\st_obj\ismbpunc.obj&lt;br/&gt;build\intel\st_obj\ismbprn.obj&lt;br/&gt;build\intel\st_obj\ismblwr.obj&lt;br/&gt;build\intel\st_obj\ismblgl.obj&lt;br/&gt;build\intel\st_obj\ismbknj.obj&lt;br/&gt;build\intel\st_obj\ismbgrph.obj&lt;br/&gt;build\intel\st_obj\ismbdgt.obj&lt;br/&gt;build\intel\st_obj\ismbbyte.obj&lt;br/&gt;build\intel\st_obj\ismbalph.obj&lt;br/&gt;build\intel\st_obj\ismbalnm.obj&lt;br/&gt;build\intel\st_obj\mbsdup.obj&lt;br/&gt;build\intel\st_obj\mbscat.obj&lt;br/&gt;build\intel\st_obj\wopen.obj&lt;br/&gt;build\intel\st_obj\outp.obj&lt;br/&gt;build\intel\st_obj\inp.obj&lt;br/&gt;build\intel\st_obj\wmktemp.obj&lt;br/&gt;build\intel\st_obj\wcreat.obj&lt;br/&gt;build\intel\st_obj\putch.obj&lt;br/&gt;build\intel\st_obj\getch.obj&lt;br/&gt;build\intel\st_obj\cputs.obj&lt;br/&gt;build\intel\st_obj\cgets.obj&lt;br/&gt;build\intel\st_obj\write.obj&lt;br/&gt;build\intel\st_obj\txtmode.obj&lt;br/&gt;build\intel\st_obj\telli64.obj&lt;br/&gt;build\intel\st_obj\tell.obj&lt;br/&gt;build\intel\st_obj\setmode.obj&lt;br/&gt;build\intel\st_obj\read.obj&lt;br/&gt;build\intel\st_obj\pipe.obj&lt;br/&gt;build\intel\st_obj\osfinfo.obj&lt;br/&gt;build\intel\st_obj\open.obj&lt;br/&gt;build\intel\st_obj\mktemp.obj&lt;br/&gt;build\intel\st_obj\lseeki64.obj&lt;br/&gt;build\intel\st_obj\lseek.obj&lt;br/&gt;build\intel\st_obj\locking.obj&lt;br/&gt;build\intel\st_obj\isatty.obj&lt;br/&gt;build\intel\st_obj\ioinit.obj&lt;br/&gt;build\intel\st_obj\initcon.obj&lt;br/&gt;build\intel\st_obj\fstati64.obj&lt;br/&gt;build\intel\st_obj\fstat.obj&lt;br/&gt;build\intel\st_obj\fleni64.obj&lt;br/&gt;build\intel\st_obj\flength.obj&lt;br/&gt;build\intel\st_obj\eof.obj&lt;br/&gt;build\intel\st_obj\dup2.obj&lt;br/&gt;build\intel\st_obj\dup.obj&lt;br/&gt;build\intel\st_obj\creat.obj&lt;br/&gt;build\intel\st_obj\commit.obj&lt;br/&gt;build\intel\st_obj\close.obj&lt;br/&gt;build\intel\st_obj\chsize.obj&lt;br/&gt;build\intel\st_obj\ullshr.obj&lt;br/&gt;build\intel\st_obj\ullrem.obj&lt;br/&gt;build\intel\st_obj\ulldiv.obj&lt;br/&gt;build\intel\st_obj\llshr.obj&lt;br/&gt;build\intel\st_obj\llshl.obj&lt;br/&gt;build\intel\st_obj\llrem.obj&lt;br/&gt;build\intel\st_obj\llmul.obj&lt;br/&gt;build\intel\st_obj\lldiv.obj&lt;br/&gt;build\intel\st_obj\new.obj&lt;br/&gt;build\intel\st_obj\_newmode.obj&lt;br/&gt;build\intel\st_obj\delete.obj&lt;br/&gt;build\intel\st_obj\new_mode.obj&lt;br/&gt;build\intel\st_obj\setnewh.obj&lt;br/&gt;build\intel\st_obj\handler.obj&lt;br/&gt;build\intel\st_obj\sbheap.obj&lt;br/&gt;build\intel\st_obj\realloc.obj&lt;br/&gt;build\intel\st_obj\msize.obj&lt;br/&gt;build\intel\st_obj\malloc.obj&lt;br/&gt;build\intel\st_obj\heapwalk.obj&lt;br/&gt;build\intel\st_obj\heapused.obj&lt;br/&gt;build\intel\st_obj\hpabort.obj&lt;br/&gt;build\intel\st_obj\heapmin.obj&lt;br/&gt;build\intel\st_obj\heapinit.obj&lt;br/&gt;build\intel\st_obj\heapchk.obj&lt;br/&gt;build\intel\st_obj\heapadd.obj&lt;br/&gt;build\intel\st_obj\free.obj&lt;br/&gt;build\intel\st_obj\expand.obj&lt;br/&gt;build\intel\st_obj\calloc.obj&lt;br/&gt;build\intel\st_obj\align.obj&lt;br/&gt;build\intel\st_obj\wsystem.obj&lt;br/&gt;build\intel\st_obj\wspwnvpe.obj&lt;br/&gt;build\intel\st_obj\wspawnvp.obj&lt;br/&gt;build\intel\st_obj\wspawnve.obj&lt;br/&gt;build\intel\st_obj\wspawnv.obj&lt;br/&gt;build\intel\st_obj\wspwnlpe.obj&lt;br/&gt;build\intel\st_obj\wspawnlp.obj&lt;br/&gt;build\intel\st_obj\wspawnle.obj&lt;br/&gt;build\intel\st_obj\wspawnl.obj&lt;br/&gt;build\intel\st_obj\wexecvpe.obj&lt;br/&gt;build\intel\st_obj\wexecvp.obj&lt;br/&gt;build\intel\st_obj\wexecve.obj&lt;br/&gt;build\intel\st_obj\wexecv.obj&lt;br/&gt;build\intel\st_obj\wexeclpe.obj&lt;br/&gt;build\intel\st_obj\wexeclp.obj&lt;br/&gt;build\intel\st_obj\wexecle.obj&lt;br/&gt;build\intel\st_obj\wexecl.obj&lt;br/&gt;build\intel\st_obj\wdospawn.obj&lt;br/&gt;build\intel\st_obj\wcenvarg.obj&lt;br/&gt;build\intel\st_obj\wait.obj&lt;br/&gt;build\intel\st_obj\system.obj&lt;br/&gt;build\intel\st_obj\spawnvpe.obj&lt;br/&gt;build\intel\st_obj\spawnvp.obj&lt;br/&gt;build\intel\st_obj\spawnve.obj&lt;br/&gt;build\intel\st_obj\spawnv.obj&lt;br/&gt;build\intel\st_obj\spawnlpe.obj&lt;br/&gt;build\intel\st_obj\spawnlp.obj&lt;br/&gt;build\intel\st_obj\spawnle.obj&lt;br/&gt;build\intel\st_obj\spawnl.obj&lt;br/&gt;build\intel\st_obj\loaddll.obj&lt;br/&gt;build\intel\st_obj\getproc.obj&lt;br/&gt;build\intel\st_obj\execvpe.obj&lt;br/&gt;build\intel\st_obj\execvp.obj&lt;br/&gt;build\intel\st_obj\execve.obj&lt;br/&gt;build\intel\st_obj\execv.obj&lt;br/&gt;build\intel\st_obj\execlpe.obj&lt;br/&gt;build\intel\st_obj\execlp.obj&lt;br/&gt;build\intel\st_obj\execle.obj&lt;br/&gt;build\intel\st_obj\execl.obj&lt;br/&gt;build\intel\st_obj\dospawn.obj&lt;br/&gt;build\intel\st_obj\fileinfo.obj&lt;br/&gt;build\intel\st_obj\cenvarg.obj&lt;br/&gt;build\intel\st_obj\typname.obj&lt;br/&gt;build\intel\st_obj\typinfo.obj&lt;br/&gt;build\intel\st_obj\stdexcpt.obj&lt;br/&gt;build\intel\st_obj\rtti.obj&lt;br/&gt;build\intel\st_obj\undname.obj&lt;br/&gt;build\intel\st_obj\ehvecdtr.obj&lt;br/&gt;build\intel\st_obj\ehveccvb.obj&lt;br/&gt;build\intel\st_obj\ehvecctr.obj&lt;br/&gt;build\intel\st_obj\validate.obj&lt;br/&gt;build\intel\st_obj\user.obj&lt;br/&gt;build\intel\st_obj\unhandld.obj&lt;br/&gt;build\intel\st_obj\throw.obj&lt;br/&gt;build\intel\st_obj\hooks.obj&lt;br/&gt;build\intel\st_obj\frame.obj&lt;br/&gt;build\intel\st_obj\ehprolog2.obj&lt;br/&gt;build\intel\st_obj\ehprolog.obj&lt;br/&gt;build\intel\st_obj\lowhelpr.obj&lt;br/&gt;build\intel\st_obj\trnsctrl.obj&lt;br/&gt;build\intel\st_obj\wunlink.obj&lt;br/&gt;build\intel\st_obj\wstati64.obj&lt;br/&gt;build\intel\st_obj\wstat.obj&lt;br/&gt;build\intel\st_obj\wrmdir.obj&lt;br/&gt;build\intel\st_obj\wrename.obj&lt;br/&gt;build\intel\st_obj\wmkdir.obj&lt;br/&gt;build\intel\st_obj\wgetcwd.obj&lt;br/&gt;build\intel\st_obj\wfullpat.obj&lt;br/&gt;build\intel\st_obj\wchmod.obj&lt;br/&gt;build\intel\st_obj\wchdir.obj&lt;br/&gt;build\intel\st_obj\waccess.obj&lt;br/&gt;build\intel\st_obj\unlink.obj&lt;br/&gt;build\intel\st_obj\stati64.obj&lt;br/&gt;build\intel\st_obj\stat.obj&lt;br/&gt;build\intel\st_obj\rmdir.obj&lt;br/&gt;build\intel\st_obj\rename.obj&lt;br/&gt;build\intel\st_obj\mterrno.obj&lt;br/&gt;build\intel\st_obj\mkdir.obj&lt;br/&gt;build\intel\st_obj\getpid.obj&lt;br/&gt;build\intel\st_obj\getcwd.obj&lt;br/&gt;build\intel\st_obj\fullpath.obj&lt;br/&gt;build\intel\st_obj\drive.obj&lt;br/&gt;build\intel\st_obj\dosmap.obj&lt;br/&gt;build\intel\st_obj\chdir.obj&lt;br/&gt;build\intel\st_obj\chmod.obj&lt;br/&gt;build\intel\st_obj\access.obj&lt;br/&gt;build\intel\st_obj\wfndfi64.obj&lt;br/&gt;build\intel\st_obj\wfindfil.obj&lt;br/&gt;build\intel\st_obj\enable.obj&lt;br/&gt;build\intel\st_obj\slbeep.obj&lt;br/&gt;build\intel\st_obj\seterrm.obj&lt;br/&gt;build\intel\st_obj\findfi64.obj&lt;br/&gt;build\intel\st_obj\findfile.obj&lt;br/&gt;build\intel\st_obj\drivfree.obj&lt;br/&gt;build\intel\st_obj\drivemap.obj&lt;br/&gt;build\intel\st_obj\xtow.obj&lt;br/&gt;build\intel\st_obj\xtoa.obj&lt;br/&gt;build\intel\st_obj\wtox.obj&lt;br/&gt;build\intel\st_obj\wctomb.obj&lt;br/&gt;build\intel\st_obj\wcstombs.obj&lt;br/&gt;build\intel\st_obj\wcstol.obj&lt;br/&gt;build\intel\st_obj\wcstod.obj&lt;br/&gt;build\intel\st_obj\towupper.obj&lt;br/&gt;build\intel\st_obj\towlower.obj&lt;br/&gt;build\intel\st_obj\toupper.obj&lt;br/&gt;build\intel\st_obj\tolower.obj&lt;br/&gt;build\intel\st_obj\swab.obj&lt;br/&gt;build\intel\st_obj\strtol.obj&lt;br/&gt;build\intel\st_obj\strtod.obj&lt;br/&gt;build\intel\st_obj\mbtowc.obj&lt;br/&gt;build\intel\st_obj\mbstowcs.obj&lt;br/&gt;build\intel\st_obj\mblen.obj&lt;br/&gt;build\intel\st_obj\iswctype.obj&lt;br/&gt;build\intel\st_obj\isctype.obj&lt;br/&gt;build\intel\st_obj\gcvt.obj&lt;br/&gt;build\intel\st_obj\fcvt.obj&lt;br/&gt;build\intel\st_obj\atox.obj&lt;br/&gt;build\intel\st_obj\atof.obj&lt;br/&gt;build\intel\st_obj\_wctype.obj&lt;br/&gt;build\intel\st_obj\_mbslen.obj&lt;br/&gt;build\intel\st_obj\_fptostr.obj&lt;br/&gt;build\intel\st_obj\_ctype.obj&lt;br/&gt;&lt;/div&gt;&lt;/p&gt;&lt;p&gt;从这里也可以看出，所有合在里面的obj文件，都是在/build/intel/st_obj/目录下面的。也就验证了libc.lib是给单线程静态库使用的说法。&lt;/p&gt;&lt;p&gt;另外，使用lib命令还可以将需要的obj文件从lib文件中分离出来。这里解压的时候，最好是先将lib文件拷贝到一个临时目录下，不要放在VC原来的lib目录下操作。我这里放在d:\test目录进行。目标是解出一个crt0.obj文件。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;D:\test&amp;gt;lib /EXTRACT:build\intel\st_obj\crt0.obj libc.lib     &lt;br /&gt;Microsoft (R) Library Manager Version 6.00.8447      &lt;br /&gt;Copyright (C) Microsoft Corp 1992-1998. All rights reserved.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;之后，就可以用dumpbin来观察解出来的obj文件了。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;D:\test&amp;gt;dumpbin crt0.obj     &lt;br /&gt;Microsoft (R) COFF Binary File Dumper Version 6.00.8447      &lt;br /&gt;Copyright (C) Microsoft Corp 1992-1998. All rights reserved. &lt;/p&gt;&lt;p&gt;Dump of file crt0.obj &lt;/p&gt;&lt;p&gt;File Type: COFF OBJECT &lt;/p&gt;&lt;p&gt;&amp;nbsp; Summary &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C .bss     &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 8 .data      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 20 .debug$F      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; C .rdata      &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 128 .text&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;这里使用/all选项出来的内容过多，大家可以自己去看输出，这里就不贴出来了。只是提供一个思路和方法。&lt;/p&gt;&lt;p&gt;另外，使用dumpbin命令，还可以看到lib文件中的函数，具体可以用linkermember选项。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;D:\test&amp;gt;dumpbin /linkermember libc.lib&amp;gt;func.log&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;同样因为内容过多，大家还是自己去看，可以找一下_mainCRTStartup。&lt;/p&gt;&lt;p&gt;注意：&lt;/p&gt;&lt;p&gt;第8行，第1850行，第4334行有一个分隔。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cnyao/aggbug/2086133.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cnyao/archive/2011/06/21/win32sdk_o1.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cnyao/archive/2011/06/20/win32sdkp6_link.html</id><title type="text">从零开始，学习windows编程(6)--改换entry，link错误的简单分析</title><summary type="text">还是那个hello.c程序，我们将其小修改一下，来开始今天的话题。1 #include &lt;stdio.h&gt;2 3 int myentry()4 {5 printf("hello world");6 return 0;7 }可以看到，我将原来main的位置换成了myentry，这会有什么结果发生呢？D:\test&gt;cl /c hello.c Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86 Copyright (C) Microsoft Corp 1984-</summary><published>2011-06-20T05:24:00Z</published><updated>2011-06-20T05:24:00Z</updated><author><name>cnyao</name><uri>http://www.cnblogs.com/cnyao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cnyao/archive/2011/06/20/win32sdkp6_link.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cnyao/archive/2011/06/20/win32sdkp6_link.html"/><content type="html">&lt;p&gt;还是那个hello.c程序，我们将其小修改一下，来开始今天的话题。&lt;/p&gt;&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt; &lt;span style="color: #000000;"&gt;#include &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;stdio.h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; myentry()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;4&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;5&lt;/span&gt; &lt;span style="color: #000000;"&gt;    printf(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;hello world&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;6&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;7&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;可以看到，我将原来main的位置换成了myentry，这会有什么结果发生呢？&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;D:\test&amp;gt;cl /c hello.c    &lt;br /&gt;Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86    &lt;br /&gt;Copyright (C) Microsoft Corp 1984-1998. All rights reserved. &lt;/p&gt;&lt;p&gt;hello.c&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;OK，没有问题，生成了hello.obj。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;D:\test&amp;gt;link hello.obj    &lt;br /&gt;Microsoft (R) Incremental Linker Version 6.00.8447    &lt;br /&gt;Copyright (C) Microsoft Corp 1992-1998. All rights reserved. &lt;/p&gt;&lt;p&gt;LIBC.lib(crt0.obj) : error LNK2001: unresolved external symbol _main    &lt;br /&gt;hello.exe : fatal error LNK1120: 1 unresolved externals&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;link过程出现了问题，报了一个LINK2001错误。这个错误在MSDN上是这么说的：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;b&gt;unresolved external symbol "&lt;i&gt;symbol&lt;/i&gt;"&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Code references something (such as a function, variable, or label) that the linker can't find in the libraries and object files.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Possible causes&lt;/b&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;What the code asks for doesn't exist (the symbol is spelled incorrectly or uses the wrong case, for example). &lt;/li&gt;&lt;li&gt;The code asks for the wrong thing (you are using mixed versions of the libraries, some from one version of the product, others from another version). &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This error message is followed by fatal error &lt;a href="http://msdn.microsoft.com/en-us/library/z98k84c3%28v=vs.71%29.aspx"&gt;LNK1120&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;具体原因，其实结合前面几篇的知识，就可以很容易的推理出来。如果大家有兴趣，可以试着先推理一下，再看下面的分析过程，这样理解更深刻一些。&lt;/p&gt;&lt;p&gt;对于LINK错误，应该算是C/C++特有的，而且比较麻烦，难以理解和解决的一类错误。C语言还好一些，到了C++中，LINK错误常常会带一些&amp;ldquo;乱码&amp;rdquo;符号，就更让初次接触到的童鞋们摸不到头脑了。正好借这一个小例子，来看一下思路。&lt;/p&gt;&lt;p&gt;首先，我们使用cl从hello.c生成了hello.obj文件，由于没有加上/Zl选项，所以生成的hello.obj文件还是带有两个defaultlib的，一个为libc.lib，还有一个oldnames.lib。这样，在LINK的时候，会将hello.obj与libc.lib进行链接，而libc.lib是很多obj合在一起形成的，里面有crt0.c生成的名为crt0.obj文件。回想我们上次看到的crt0.c的源码文件，里面函数为mainCRTStartup，在mainCRTStartup函数中调用到main函数了，main函数这个external symbol没有找到（其他函数如_heap_init。。。看来都是找到了），所以报出来一个LNK2001错误，告诉用户，main这个symbol没有找到，您把它忘哪儿啦。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff8000; font-size: small;" size="3" color="#ff8000"&gt;相关扩展&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #804040;" color="#804040"&gt;&lt;strong&gt;link时使用/entry选项选定入口&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;D:\test&amp;gt;cl /c hello.c    &lt;br /&gt;Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86    &lt;br /&gt;Copyright (C) Microsoft Corp 1984-1998. All rights reserved. &lt;/p&gt;&lt;p&gt;hello.c &lt;/p&gt;&lt;p&gt;D:\test&amp;gt;link /entry:myentry hello.obj    &lt;br /&gt;Microsoft (R) Incremental Linker Version 6.00.8447    &lt;br /&gt;Copyright (C) Microsoft Corp 1992-1998. All rights reserved. &lt;/p&gt;&lt;p&gt;LIBC.lib(crt0.obj) : error LNK2001: unresolved external symbol _main    &lt;br /&gt;hello.exe : fatal error LNK1120: 1 unresolved externals&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;其他不变，在link的时候加上/entry选项，结果还是和原来一样。因此，可以确定，link过程需要将所有的符号找到其所，而不像编译过程可以&amp;ldquo;打马虎眼&amp;rdquo;，即使是有一些external的也可以不理。另外，不管这个函数有没有&amp;ldquo;使用&amp;rdquo;到，都必须被link程序找到。这里的&amp;ldquo;使用&amp;rdquo;意思为执行过程中，执行到它。可以再看一个例子：&lt;/p&gt;&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #000000;"&gt;#include &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;stdio.h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; myentry()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;    printf(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;hello world&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; main()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;    myentry();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; test()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt; &lt;span style="color: #000000;"&gt;    nofunc();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;从上面的代码可以看到，在默认编译链接的情况下，test函数是没有被调用到的，而其中的nofunc函数是没有定义的。我们来对其做一下编译链接。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;D:\test&amp;gt;cl /c hello.c    &lt;br /&gt;Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86    &lt;br /&gt;Copyright (C) Microsoft Corp 1984-1998. All rights reserved. &lt;/p&gt;&lt;p&gt;hello.c &lt;/p&gt;&lt;p&gt;D:\test&amp;gt;link hello.obj    &lt;br /&gt;Microsoft (R) Incremental Linker Version 6.00.8447    &lt;br /&gt;Copyright (C) Microsoft Corp 1992-1998. All rights reserved. &lt;/p&gt;&lt;p&gt;hello.obj : error LNK2001: unresolved external symbol _nofunc    &lt;br /&gt;hello.exe : fatal error LNK1120: 1 unresolved externals&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;可以看到，link的时候，找不到nofunc这个symbol，从而报错。&lt;/p&gt;&lt;p&gt;这也是C/C++的一个比其他语言麻烦的地方，有编译时、链接时和运行时的划分，这样子清晰了，但是概念也多了，如果再加上隐藏了一些东西的实现和原理，理解起来就更不容易了。&lt;/p&gt;&lt;p&gt;&lt;span style="color: #804040;" color="#804040"&gt;&lt;strong&gt;使用/Zl选项&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;如果对myentry代码使用/Zl选项。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;D:\test&amp;gt;cl /c /Zl hello.c    &lt;br /&gt;Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86    &lt;br /&gt;Copyright (C) Microsoft Corporation.&amp;nbsp; All rights reserved. &lt;/p&gt;&lt;p&gt;hello.c &lt;/p&gt;&lt;p&gt;D:\test&amp;gt;link hello.obj    &lt;br /&gt;Microsoft (R) Incremental Linker Version 9.00.21022.08    &lt;br /&gt;Copyright (C) Microsoft Corporation.&amp;nbsp; All rights reserved. &lt;/p&gt;&lt;p&gt;LINK : fatal error LNK1561: entry point must be defined&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;此时，则出现LNK1561错误。MSDN上对应的解释为：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;b&gt;entry point must be defined&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The linker did not find an entry point. You may have intended to link as a DLL, in which case you should link with the &lt;a href="http://msdn.microsoft.com/en-us/library/527z7zfs%28v=VS.71%29.aspx"&gt;/DLL&lt;/a&gt; option. You may have also forgotten to specify the name of the entry point; link with the &lt;a href="http://msdn.microsoft.com/en-us/library/f9t8842e%28v=VS.71%29.aspx"&gt;/ENTRY&lt;/a&gt; option. &lt;/p&gt;&lt;p&gt;Otherwise, you should include a main, wmain, WinMain, or wMain function in your code.&lt;/p&gt;&lt;p&gt;If you using &lt;a href="http://msdn.microsoft.com/en-us/library/7ykb2k5f%28v=VS.71%29.aspx"&gt;LIB&lt;/a&gt; and intend to build a .dll, one reason for this error is that you supplied a .def file. If so, remove the .def file from the build.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;因为/Zl去掉了defaultlib，所以link直接就是hello.obj，而不会去链接libc.lib，因为默认定义的entry symbol为mainCRTStartup，此时没有libc.lib，里面的mainCRTStartup也就没有，所以会提示出没有定义entry point错误。&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;Way1：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;照MSDN上面的解释，我们再来将main函数使用上，然后做编译/Zl，以及链接工作会怎样呢？&lt;/p&gt;&lt;p&gt;首先将myentry改为main。之后：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;D:\test&amp;gt;cl /c /Zl hello.c    &lt;br /&gt;Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86    &lt;br /&gt;Copyright (C) Microsoft Corp 1984-1998. All rights reserved. &lt;/p&gt;&lt;p&gt;hello.c &lt;/p&gt;&lt;p&gt;D:\test&amp;gt;link hello.obj    &lt;br /&gt;Microsoft (R) Incremental Linker Version 6.00.8447    &lt;br /&gt;Copyright (C) Microsoft Corp 1992-1998. All rights reserved. &lt;/p&gt;&lt;p&gt;hello.obj : error LNK2001: unresolved external symbol _printf    &lt;br /&gt;LINK : error LNK2001: unresolved external symbol _mainCRTStartup    &lt;br /&gt;hello.exe : fatal error LNK1120: 2 unresolved externals&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;此时的错误又不相同，这里出现寻找不到printf和mainCRTStartup的链接错误。&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;Way2：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;将/entry选项指定为myentry。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;D:\test&amp;gt;cl /c /Zl hello.c    &lt;br /&gt;Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86    &lt;br /&gt;Copyright (C) Microsoft Corp 1984-1998. All rights reserved. &lt;/p&gt;&lt;p&gt;hello.c &lt;/p&gt;&lt;p&gt;D:\test&amp;gt;link /entry:myentry hello.obj    &lt;br /&gt;Microsoft (R) Incremental Linker Version 6.00.8447    &lt;br /&gt;Copyright (C) Microsoft Corp 1992-1998. All rights reserved. &lt;/p&gt;&lt;p&gt;LINK : fatal error LNK1221: a subsystem can't be inferred and must be defined&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;又出现一个新错误，LNK1221。来看看解释：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;b&gt;a subsystem can&amp;rsquo;t be inferred and must be defined&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The linker does not have enough information to infer which subsystem you will target your application.&lt;/p&gt;&lt;p&gt;To fix this error, use the &lt;a href="http://msdn.microsoft.com/en-us/library/aa278557%28v=vs.60%29.aspx"&gt;/SUBSYSTEM&lt;/a&gt; option.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;看来link的时候，还可以根据搜到的symbol以及定义的entry来自动判断编译出来的目标应用的subsystem，关于subsystem，似乎只有windows下面有这个编译选项，加上来再看一下。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;D:\test&amp;gt;link /entry:myentry /subsystem:console hello.obj    &lt;br /&gt;Microsoft (R) Incremental Linker Version 6.00.8447    &lt;br /&gt;Copyright (C) Microsoft Corp 1992-1998. All rights reserved. &lt;/p&gt;&lt;p&gt;hello.obj : error LNK2001: unresolved external symbol _printf    &lt;br /&gt;hello.exe : fatal error LNK1120: 1 unresolved externals&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;OK，当加上之后，也出现了LNK2001错误，比上面要少一个_mainCRTStartup，还需要一个_printf。&lt;/p&gt;&lt;p&gt;&lt;span style="color: #0000ff;" color="#0000ff"&gt;Way3：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;而综合上面两种方法，将way1和way2合起来使用，使用main函数代替掉myentry的源码，然后将main设置entry point。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;D:\test&amp;gt;cl /c /Zl hello.c    &lt;br /&gt;Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86    &lt;br /&gt;Copyright (C) Microsoft Corp 1984-1998. All rights reserved. &lt;/p&gt;&lt;p&gt;hello.c &lt;/p&gt;&lt;p&gt;D:\test&amp;gt;link /entry:main hello.obj    &lt;br /&gt;Microsoft (R) Incremental Linker Version 6.00.8447    &lt;br /&gt;Copyright (C) Microsoft Corp 1992-1998. All rights reserved. &lt;/p&gt;&lt;p&gt;hello.obj : error LNK2001: unresolved external symbol _printf    &lt;br /&gt;hello.exe : fatal error LNK1120: 1 unresolved externals&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;此时的结果与way2相同，都是找不到printf这个symbol，而printf的实现的确是在libc.lib中的。&lt;/p&gt;&lt;p&gt;解决上面的问题很简单，只要链接libc.lib即可（当然，对于运行时还是有问题的，具体看上一篇的执行结果）。而不指定entry，同时使用main，出现的结果有mainCRTStartup链接不到的提示，说明link的时候链接器找到main，也从它的认识，认为入口为mainCRTStartup，但是找不到该symbol，所以报了这么一个错误。这也是常常让初学者摸不到头脑的一个错误。&lt;/p&gt;&lt;p&gt;参考：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/f6xx1b1z%28v=vs.71%29.aspx" href="http://msdn.microsoft.com/en-us/library/f6xx1b1z%28v=vs.71%29.aspx"&gt;http://msdn.microsoft.com/en-us/library/f6xx1b1z%28v=vs.71%29.aspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/ky737ya4%28v=VS.71%29.aspx" href="http://msdn.microsoft.com/en-us/library/ky737ya4%28v=VS.71%29.aspx"&gt;http://msdn.microsoft.com/en-us/library/ky737ya4%28v=VS.71%29.aspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/aa235394%28v=vs.60%29.aspx" href="http://msdn.microsoft.com/en-us/library/aa235394%28v=vs.60%29.aspx"&gt;http://msdn.microsoft.com/en-us/library/aa235394%28v=vs.60%29.aspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="http://delxu.wordpress.com/2008/11/02/windows%E7%9A%84%E7%8E%AF%E5%A2%83%E5%AD%90%E7%B3%BB%E7%BB%9F/" href="http://delxu.wordpress.com/2008/11/02/windows%E7%9A%84%E7%8E%AF%E5%A2%83%E5%AD%90%E7%B3%BB%E7%BB%9F/"&gt;http://delxu.wordpress.com/2008/11/02/windows%E7%9A%84%E7%8E%AF%E5%A2%83%E5%AD%90%E7%B3%BB%E7%BB%9F/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="http://hi.baidu.com/cyclone/blog/item/96624a90fb4ca081a977a4db.html" href="http://hi.baidu.com/cyclone/blog/item/96624a90fb4ca081a977a4db.html"&gt;http://hi.baidu.com/cyclone/blog/item/96624a90fb4ca081a977a4db.html&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;img src="http://www.cnblogs.com/cnyao/aggbug/2085158.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cnyao/archive/2011/06/20/win32sdkp6_link.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cnyao/archive/2011/06/18/win32sdkp5_entry.html</id><title type="text">从零开始，学习windows编程（5）--修改入口不为mainCRTStartup</title><summary type="text">上次讲到，如果在VC的console程序中，入口不为mainCRTStartup，会出现什么后果？我们就先将入口设置为main函数。1 #include &lt;stdio.h&gt;2 3 int main()4 {5 printf("hello world\n");6 return 0;7 }先通过GUI来设置一下，创建一个win32 console Application。 代码还是差不多，打印字符串编译链接运行，当然没问题。修改入口，在”project”-&gt;”setting”出现的对话框中，Link选项中，在”Entry-point symbol”中输入mai</summary><published>2011-06-18T13:40:00Z</published><updated>2011-06-18T13:40:00Z</updated><author><name>cnyao</name><uri>http://www.cnblogs.com/cnyao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cnyao/archive/2011/06/18/win32sdkp5_entry.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cnyao/archive/2011/06/18/win32sdkp5_entry.html"/><content type="html">&lt;p&gt;上次讲到，如果在VC的console程序中，入口不为mainCRTStartup，会出现什么后果？&lt;/p&gt;&lt;p&gt;我们就先将入口设置为main函数。&lt;/p&gt;&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt; &lt;span style="color: #000000;"&gt;#include &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;stdio.h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; main()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;4&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;5&lt;/span&gt; &lt;span style="color: #000000;"&gt;    printf(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;hello world\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;6&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;7&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;先通过GUI来设置一下，创建一个win32 console Application。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnyao/201106/20110618213903762.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnyao/201106/201106182139109852.png" width="602" border="0" height="390" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;代码还是差不多，打印字符串&lt;/p&gt;&lt;p&gt;编译链接运行，当然没问题。&lt;/p&gt;&lt;p&gt;修改入口，在&amp;rdquo;project&amp;rdquo;-&amp;gt;&amp;rdquo;setting&amp;rdquo;出现的对话框中，Link选项中，在&amp;rdquo;Entry-point symbol&amp;rdquo;中输入main。即定义好入口为main函数。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnyao/201106/201106182139162705.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnyao/201106/201106182139285421.png" width="636" border="0" height="419" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Rebuild，编译链接，没有问题。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;Deleting intermediate files and output files for project 'Hello - Win32 Debug'.    &lt;br /&gt;--------------------Configuration: Hello - Win32 Debug--------------------    &lt;br /&gt;Compiling...    &lt;br /&gt;main.cpp    &lt;br /&gt;Linking... &lt;/p&gt;&lt;p&gt;Hello.exe - 0 error(s), 0 warning(s)&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;运行，出现问题。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnyao/201106/201106182139333375.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnyao/201106/20110618213941712.png" width="641" border="0" height="367" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;来看一下到底是哪里出现了问题。&lt;/p&gt;&lt;p&gt;运行debug版本，切到出错部分。VC界面为：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnyao/201106/201106182139518704.png"&gt;&lt;img style="display: inline; border: 0px;" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/cnyao/201106/201106182140052632.png" width="743" border="0" height="438" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;不知道大家有没有看得清楚，我将call stack单独列在这里，也就是上图中标红线的部分。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;NTDLL! 7c9100e8()    &lt;br /&gt;_heap_alloc_base(unsigned int 0x00001030) line 161    &lt;br /&gt;_heap_alloc_dbg(unsigned int 0x00001000, int 0x00000002, const char * 0x00420c1c `string', int 0x0000003b) line 367 + 9 bytes    &lt;br /&gt;_nh_malloc_dbg(unsigned int 0x00001000, int 0x00000000, int 0x00000002, const char * 0x00420c1c `string', int 0x0000003b) line 242 + 21 bytes    &lt;br /&gt;_malloc_dbg(unsigned int 0x00001000, int 0x00000002, const char * 0x00420c1c `string', int 0x0000003b) line 163 + 27 bytes    &lt;br /&gt;_getbuf(_iobuf * 0x00422a58) line 59 + 19 bytes    &lt;br /&gt;_flsbuf(int 0x00000068, _iobuf * 0x00422a58) line 153 + 9 bytes    &lt;br /&gt;write_char(int 0x00000068, _iobuf * 0x00422a58, int * 0x0012fd10) line 1083 + 75 bytes    &lt;br /&gt;_output(_iobuf * 0x00422a58, const char * 0x0042001d, char * 0x0012ff74) line 393 + 21 bytes    &lt;br /&gt;printf(const char * 0x0042001c `string') line 60 + 18 bytes    &lt;br /&gt;main() line 5 + 10 bytes    &lt;br /&gt;KERNEL32! 7c817077()&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;可以看到，出错部分是在NTDLL中的某个汇编代码中，但是根源是在printf，printf调用到这部分的时候，结果在_heap_alloc_base的时候出错了，_heap_alloc_base从字面意义上面就可以看出是在堆上分配内存的。&lt;/p&gt;&lt;p&gt;从上面一章，我们又可以得到mainCRTStartup函数在main函数之前调用，其中做了很多初始化工作，其中有一个函数调用叫做_heap_init，是用来创建和初始化CRT堆。而如果直接用main来做入口的话，则没有做这些init工作。&lt;/p&gt;&lt;p&gt;刚刚是通过GUI来创建的，而通过命令行，前面cl编译是一样的，link的时候使用&lt;/p&gt;&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt; &lt;span style="color: #000000;"&gt;d:&lt;/span&gt;&lt;span style="color: #000000;"&gt;\&lt;/span&gt;&lt;span style="color: #000000;"&gt;test&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;link &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;entry&lt;/span&gt;&lt;span style="color: #800000;"&gt;:main&lt;/span&gt;&lt;span style="color: #000000;"&gt; hello&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;obj&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt; &lt;span style="color: #000000;"&gt;Microsoft &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;R&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt; Incremental Linker Version &lt;/span&gt;&lt;span style="color: #000000;"&gt;6.00&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;8168&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt; &lt;span style="color: #000000;"&gt;Copyright &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;C&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt; Microsoft Corp &lt;/span&gt;&lt;span style="color: #000000;"&gt;1992&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;1998&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt; All rights reserved&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;同样的效果。&lt;/p&gt;&lt;p&gt;另外，如果不用main，用另外一个函数，比如myentry，会出现什么情况呢？你可以先试试，下一篇来具体说明一下~&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cnyao/aggbug/2084409.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cnyao/archive/2011/06/18/win32sdkp5_entry.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cnyao/archive/2011/06/14/windowsprogramming_4.html</id><title type="text">从零开始，学习windows编程(4)--从libc.lib开始</title><summary type="text">从上一篇文章中，大家已经了解到有C运行时库这个概念，这个不算是新东西，但是一般都隐藏在幕后，C/C++语言教学的时候不讲，windows/linux编程的时候似乎也不会专门讲到。不过它一般是我们C/C++编程中默认会使用的一个重要部分。回想想，我们随手打出的strcpy, memset, memcpy等等，不就是C运行时库所提供出来的东西吗？既然这样，就要好好研究一下这个东西了。前面已经说过，针对单线程/多线程，静态/动态链接，是否是debug版本，VC6的C运行时库提供了6个版本。具体可以看下面的截图。 而其中每一个选择对应的LIB文件，在上一篇中已经有一个列表介绍了，这里就不重复写了。这里</summary><published>2011-06-14T12:30:00Z</published><updated>2011-06-14T12:30:00Z</updated><author><name>cnyao</name><uri>http://www.cnblogs.com/cnyao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cnyao/archive/2011/06/14/windowsprogramming_4.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cnyao/archive/2011/06/14/windowsprogramming_4.html"/><content type="html">&lt;p&gt;从上一篇文章中，大家已经了解到有C运行时库这个概念，这个不算是新东西，但是一般都隐藏在幕后，C/C++语言教学的时候不讲，windows/linux编程的时候似乎也不会专门讲到。不过它一般是我们C/C++编程中默认会使用的一个重要部分。回想想，我们随手打出的strcpy, memset, memcpy等等，不就是C运行时库所提供出来的东西吗？&lt;/p&gt;&lt;p&gt;既然这样，就要好好研究一下这个东西了。&lt;/p&gt;&lt;p&gt;前面已经说过，针对单线程/多线程，静态/动态链接，是否是debug版本，VC6的C运行时库提供了6个版本。具体可以看下面的截图。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnyao/201106/201106142030025479.png"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/cnyao/201106/201106142030056366.png" alt="image" title="image" style="display: inline; border-width: 0px;" width="735" border="0" height="488" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;而其中每一个选择对应的LIB文件，在上一篇中已经有一个列表介绍了，这里就不重复写了。这里也不全部一下子将所有的都研究一下，还是按照由浅入深的原则，从最简单的部分开始，当然，也会在牵涉到其他部分的时候，进行一定的说明。&lt;/p&gt;&lt;p&gt;最简单的当然是Single-Threaded，同时也是static link的了。其对应的文件为LIBC.LIB。对应CL的编译选项为/ML。&lt;/p&gt;&lt;p&gt;既然要研究这个LIB文件，那当然是有源码最好了，jjhou不是说过，&amp;ldquo;源码面前，了无秘密&amp;rdquo;吗。那我们在哪里找到有源码呢？&lt;/p&gt;&lt;p&gt;只要你安装了VC6，它就带有CRT的源码，具体目录和你安装VC6的目录有关，在我电脑上的路径为&amp;ldquo;d:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\&amp;rdquo;，你进去之后会发现，里面有不少熟悉的名字，如&amp;ldquo;MATH.H&amp;rdquo;、&amp;ldquo;STDIO.H&amp;rdquo;、&amp;ldquo;STDLIB.H&amp;rdquo;、&amp;ldquo;STRING.H&amp;rdquo;等，由于C运行时库被C++运行时库包含，所以这里面还有C++标准库的代码，所以还能看到&amp;ldquo;IOSTREAM&amp;rdquo;、&amp;ldquo;CSTDIO&amp;rdquo;、&amp;ldquo;algorithm&amp;rdquo;等C++的std头文件。&lt;/p&gt;&lt;p&gt;这里就出现了一个问题，这里的文件有成百上千个，我们一个个全部看是不可能的，那如何找出关键的部分来呢？&lt;/p&gt;&lt;p&gt;如果还对上一篇的分析有印象，并且带有问题的同学，应该很容易联想到，我们在link不带有defaultlibs信息的hello.obj文件时，出现了两个LINK2001错误，分别是找不到_printf和_mainCRTStartup这两个symbol文件。&lt;/p&gt;&lt;p&gt;编译器CL在编译C程序的时候，内部将需要编译的函数前面加上下划线(_)用来标识，_printf具体指的就是printf函数，_mainCRTStartup则是mainCRTStartup，是在哪里使用的呢？&lt;/p&gt;&lt;p&gt;我们已经知道，printf函数和mainCRTStartup函数的实现都是在LIBC.LIB中，printf，是我们main函数中用来打印信息的，而mainCRTStartup，则是hello.exe的入口(entry point)。&lt;/p&gt;&lt;p&gt;&lt;span size="3" color="#ff8000" style="color: #ff8000; font-size: small;"&gt;&lt;strong&gt;入口&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;学过C语言的人都知道，有一个main函数，是一个程序的入口。不管怎样，main函数是特殊的。在TCPL (&amp;ldquo;The C programming Language&amp;rdquo; by K&amp;amp;R) 的1.1章节，介绍Hello World的时候说的一段话：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;Now, for some explanations about the program itself. A C program, whatever its size, consists of &lt;em&gt;functions&lt;/em&gt; and &lt;em&gt;variables&lt;/em&gt;. A function contains &lt;em&gt;statements&lt;/em&gt; that specify the computing operations to be done, and variables store values used during the computation. C functions are like the subroutines and functions in Fortran or the procedures and functions of Pascal. Our example is a function named &lt;tt&gt;main&lt;/tt&gt;. Normally you are at liberty to give functions whatever names you like, but &amp;ldquo;&lt;tt&gt;main&amp;rdquo;&lt;/tt&gt; is special - your program begins executing at the beginning of main. This means that every program must have a &lt;tt&gt;main&lt;/tt&gt; somewhere. &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;因为这一段话，因为这本书的经典，很多人包括我思路都很难转变。一直都认为main就是C程序的入口函数。不过，真的是这样吗？&lt;/p&gt;&lt;p&gt;使用汇编的童鞋都知道，汇编的入口函数只是一个符号，是可以随意定义的，之后就从入口开始，PC一条条的开始执行汇编代码。对于C程序来说，main也是一个符号而已，不过这个符号与汇编的_start有些区别，_start可以用其他符号直接代替，而在windows系统下，VC开发的环境中，我们的hello.exe的main函数之前还有一个mainCRTStartup（呼，好多限制条件，好绕口&amp;hellip;&amp;hellip;）。&lt;/p&gt;&lt;p&gt;&lt;span size="3" color="#ff8000" style="color: #ff8000; font-size: small;"&gt;&lt;strong&gt;crt0.c&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;为什么需要mainCRTStartup呢，我们还是要看一下源码实现。先搜索到mainCRTStartup所在的文件，为crt0.c，其全部代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;/***&lt;br/&gt;*crt0.c - C runtime initialization routine&lt;br/&gt;*&lt;br/&gt;*       Copyright (c) 1989-1997, Microsoft Corporation. All rights reserved.&lt;br/&gt;*&lt;br/&gt;*Purpose:&lt;br/&gt;*       This the actual startup routine for apps.  It calls the user's main&lt;br/&gt;*       routine [w]main() or [w]WinMain after performing C Run-Time Library&lt;br/&gt;*       initialization.&lt;br/&gt;*&lt;br/&gt;*       (With ifdef's, this source file also provides the source code for&lt;br/&gt;*       wcrt0.c, the startup routine for console apps with wide characters,&lt;br/&gt;*       wincrt0.c, the startup routine for Windows apps, and wwincrt0.c,&lt;br/&gt;*       the startup routine for Windows apps with wide characters.)&lt;br/&gt;*&lt;br/&gt;*******************************************************************************/&lt;br/&gt;&lt;br/&gt;#ifdef _WIN32&lt;br/&gt;&lt;br/&gt;#ifndef CRTDLL&lt;br/&gt;&lt;br/&gt;#include &amp;lt;cruntime.h&amp;gt;&lt;br/&gt;#include &amp;lt;dos.h&amp;gt;&lt;br/&gt;#include &amp;lt;internal.h&amp;gt;&lt;br/&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br/&gt;#include &amp;lt;string.h&amp;gt;&lt;br/&gt;#include &amp;lt;rterr.h&amp;gt;&lt;br/&gt;#include &amp;lt;windows.h&amp;gt;&lt;br/&gt;#include &amp;lt;awint.h&amp;gt;&lt;br/&gt;#include &amp;lt;tchar.h&amp;gt;&lt;br/&gt;#include &amp;lt;dbgint.h&amp;gt;&lt;br/&gt;&lt;br/&gt;/*&lt;br/&gt; * wWinMain is not yet defined in winbase.h. When it is, this should be&lt;br/&gt; * removed.&lt;br/&gt; */&lt;br/&gt;&lt;br/&gt;int&lt;br/&gt;WINAPI&lt;br/&gt;wWinMain(&lt;br/&gt;    HINSTANCE hInstance,&lt;br/&gt;    HINSTANCE hPrevInstance,&lt;br/&gt;    LPWSTR lpCmdLine,&lt;br/&gt;    int nShowCmd&lt;br/&gt;    );&lt;br/&gt;&lt;br/&gt;#ifdef WPRFLAG&lt;br/&gt;_TUCHAR * __cdecl _wwincmdln(void);&lt;br/&gt;#else  /* WPRFLAG */&lt;br/&gt;_TUCHAR * __cdecl _wincmdln(void);&lt;br/&gt;#endif  /* WPRFLAG */&lt;br/&gt;&lt;br/&gt;/*&lt;br/&gt; * command line, environment, and a few other globals&lt;br/&gt; */&lt;br/&gt;&lt;br/&gt;#ifdef WPRFLAG&lt;br/&gt;wchar_t *_wcmdln;           /* points to wide command line */&lt;br/&gt;#else  /* WPRFLAG */&lt;br/&gt;char *_acmdln;              /* points to command line */&lt;br/&gt;#endif  /* WPRFLAG */&lt;br/&gt;&lt;br/&gt;char *_aenvptr = NULL;      /* points to environment block */&lt;br/&gt;wchar_t *_wenvptr = NULL;   /* points to wide environment block */&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;void (__cdecl * _aexit_rtn)(int) = _exit;   /* RT message return procedure */&lt;br/&gt;&lt;br/&gt;static void __cdecl fast_error_exit(int);   /* Error exit via ExitProcess */&lt;br/&gt;&lt;br/&gt;/*&lt;br/&gt; * _error_mode and _apptype, together, determine how error messages are&lt;br/&gt; * written out.&lt;br/&gt; */&lt;br/&gt;int __error_mode = _OUT_TO_DEFAULT;&lt;br/&gt;#ifdef _WINMAIN_&lt;br/&gt;int __app_type = _GUI_APP;&lt;br/&gt;#else  /* _WINMAIN_ */&lt;br/&gt;int __app_type = _CONSOLE_APP;&lt;br/&gt;#endif  /* _WINMAIN_ */&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;/***&lt;br/&gt;*BaseProcessStartup(PVOID Peb)&lt;br/&gt;*&lt;br/&gt;*Purpose:&lt;br/&gt;*       This routine does the C runtime initialization, calls main(), and&lt;br/&gt;*       then exits.  It never returns.&lt;br/&gt;*&lt;br/&gt;*Entry:&lt;br/&gt;*       PVOID Peb - pointer to Win32 Process Environment Block (not used)&lt;br/&gt;*&lt;br/&gt;*Exit:&lt;br/&gt;*       This function never returns.&lt;br/&gt;*&lt;br/&gt;*******************************************************************************/&lt;br/&gt;&lt;br/&gt;#ifdef _WINMAIN_&lt;br/&gt;&lt;br/&gt;#ifdef WPRFLAG&lt;br/&gt;void wWinMainCRTStartup(&lt;br/&gt;#else  /* WPRFLAG */&lt;br/&gt;void WinMainCRTStartup(&lt;br/&gt;#endif  /* WPRFLAG */&lt;br/&gt;&lt;br/&gt;#else  /* _WINMAIN_ */&lt;br/&gt;&lt;br/&gt;#ifdef WPRFLAG&lt;br/&gt;void wmainCRTStartup(&lt;br/&gt;#else  /* WPRFLAG */&lt;br/&gt;void mainCRTStartup(&lt;br/&gt;#endif  /* WPRFLAG */&lt;br/&gt;&lt;br/&gt;#endif  /* _WINMAIN_ */&lt;br/&gt;        void&lt;br/&gt;        )&lt;br/&gt;&lt;br/&gt;{&lt;br/&gt;        int mainret;&lt;br/&gt;&lt;br/&gt;#ifdef _WINMAIN_&lt;br/&gt;        _TUCHAR *lpszCommandLine;&lt;br/&gt;        STARTUPINFO StartupInfo;&lt;br/&gt;#endif  /* _WINMAIN_ */&lt;br/&gt;&lt;br/&gt;        /*&lt;br/&gt;         * Get the full Win32 version&lt;br/&gt;         */&lt;br/&gt;        _osver = GetVersion();&lt;br/&gt;&lt;br/&gt;        _winminor = (_osver &amp;gt;&amp;gt; 8) &amp;amp; 0x00FF ;&lt;br/&gt;        _winmajor = _osver &amp;amp; 0x00FF ;&lt;br/&gt;        _winver = (_winmajor &amp;lt;&amp;lt; 8) + _winminor;&lt;br/&gt;        _osver = (_osver &amp;gt;&amp;gt; 16) &amp;amp; 0x00FFFF ;&lt;br/&gt;&lt;br/&gt;#ifdef _MT&lt;br/&gt;        if ( !_heap_init(1) )               /* initialize heap */&lt;br/&gt;#else  /* _MT */&lt;br/&gt;        if ( !_heap_init(0) )               /* initialize heap */&lt;br/&gt;#endif  /* _MT */&lt;br/&gt;            fast_error_exit(_RT_HEAPINIT);  /* write message and die */&lt;br/&gt;&lt;br/&gt;#ifdef _MT&lt;br/&gt;        if( !_mtinit() )                    /* initialize multi-thread */&lt;br/&gt;            fast_error_exit(_RT_THREAD);    /* write message and die */&lt;br/&gt;#endif  /* _MT */&lt;br/&gt;&lt;br/&gt;        /*&lt;br/&gt;         * Guard the remainder of the initialization code and the call&lt;br/&gt;         * to user's main, or WinMain, function in a __try/__except&lt;br/&gt;         * statement.&lt;br/&gt;         */&lt;br/&gt;&lt;br/&gt;        __try {&lt;br/&gt;&lt;br/&gt;            _ioinit();                      /* initialize lowio */&lt;br/&gt;&lt;br/&gt;#ifdef WPRFLAG&lt;br/&gt;            /* get wide cmd line info */&lt;br/&gt;            _wcmdln = (wchar_t *)__crtGetCommandLineW();&lt;br/&gt;&lt;br/&gt;            /* get wide environ info */&lt;br/&gt;            _wenvptr = (wchar_t *)__crtGetEnvironmentStringsW();&lt;br/&gt;&lt;br/&gt;            _wsetargv();&lt;br/&gt;            _wsetenvp();&lt;br/&gt;#else  /* WPRFLAG */&lt;br/&gt;            /* get cmd line info */&lt;br/&gt;            _acmdln = (char *)GetCommandLineA();&lt;br/&gt;&lt;br/&gt;            /* get environ info */&lt;br/&gt;            _aenvptr = (char *)__crtGetEnvironmentStringsA();&lt;br/&gt;&lt;br/&gt;            _setargv();&lt;br/&gt;            _setenvp();&lt;br/&gt;#endif  /* WPRFLAG */&lt;br/&gt;&lt;br/&gt;            _cinit();                       /* do C data initialize */&lt;br/&gt;&lt;br/&gt;#ifdef _WINMAIN_&lt;br/&gt;&lt;br/&gt;            StartupInfo.dwFlags = 0;&lt;br/&gt;            GetStartupInfo( &amp;amp;StartupInfo );&lt;br/&gt;&lt;br/&gt;#ifdef WPRFLAG&lt;br/&gt;            lpszCommandLine = _wwincmdln();&lt;br/&gt;            mainret = wWinMain(&lt;br/&gt;#else  /* WPRFLAG */&lt;br/&gt;            lpszCommandLine = _wincmdln();&lt;br/&gt;            mainret = WinMain(&lt;br/&gt;#endif  /* WPRFLAG */&lt;br/&gt;                               GetModuleHandleA(NULL),&lt;br/&gt;                               NULL,&lt;br/&gt;                               lpszCommandLine,&lt;br/&gt;                               StartupInfo.dwFlags &amp;amp; STARTF_USESHOWWINDOW&lt;br/&gt;                                    ? StartupInfo.wShowWindow&lt;br/&gt;                                    : SW_SHOWDEFAULT&lt;br/&gt;                             );&lt;br/&gt;#else  /* _WINMAIN_ */&lt;br/&gt;&lt;br/&gt;#ifdef WPRFLAG&lt;br/&gt;            __winitenv = _wenviron;&lt;br/&gt;            mainret = wmain(__argc, __wargv, _wenviron);&lt;br/&gt;#else  /* WPRFLAG */&lt;br/&gt;            __initenv = _environ;&lt;br/&gt;            mainret = main(__argc, __argv, _environ);&lt;br/&gt;#endif  /* WPRFLAG */&lt;br/&gt;&lt;br/&gt;#endif  /* _WINMAIN_ */&lt;br/&gt;            exit(mainret);&lt;br/&gt;        }&lt;br/&gt;        __except ( _XcptFilter(GetExceptionCode(), GetExceptionInformation()) )&lt;br/&gt;        {&lt;br/&gt;            /*&lt;br/&gt;             * Should never reach here&lt;br/&gt;             */&lt;br/&gt;            _exit( GetExceptionCode() );&lt;br/&gt;&lt;br/&gt;        } /* end of try - except */&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;/***&lt;br/&gt;*_amsg_exit(rterrnum) - Fast exit fatal errors&lt;br/&gt;*&lt;br/&gt;*Purpose:&lt;br/&gt;*       Exit the program with error code of 255 and appropriate error&lt;br/&gt;*       message.&lt;br/&gt;*&lt;br/&gt;*Entry:&lt;br/&gt;*       int rterrnum - error message number (amsg_exit only).&lt;br/&gt;*&lt;br/&gt;*Exit:&lt;br/&gt;*       Calls exit() (for integer divide-by-0) or _exit() indirectly&lt;br/&gt;*       through _aexit_rtn [amsg_exit].&lt;br/&gt;*       For multi-thread: calls _exit() function&lt;br/&gt;*&lt;br/&gt;*Exceptions:&lt;br/&gt;*&lt;br/&gt;*******************************************************************************/&lt;br/&gt;&lt;br/&gt;void __cdecl _amsg_exit (&lt;br/&gt;        int rterrnum&lt;br/&gt;        )&lt;br/&gt;{&lt;br/&gt;#ifdef _WINMAIN_&lt;br/&gt;        if ( __error_mode == _OUT_TO_STDERR )&lt;br/&gt;#else  /* _WINMAIN_ */&lt;br/&gt;        if ( __error_mode != _OUT_TO_MSGBOX )&lt;br/&gt;#endif  /* _WINMAIN_ */&lt;br/&gt;            _FF_MSGBANNER();    /* write run-time error banner */&lt;br/&gt;&lt;br/&gt;        _NMSG_WRITE(rterrnum);  /* write message */&lt;br/&gt;        _aexit_rtn(255);        /* normally _exit(255) */&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;/***&lt;br/&gt;*fast_error_exit(rterrnum) - Faster exit fatal errors&lt;br/&gt;*&lt;br/&gt;*Purpose:&lt;br/&gt;*       Exit the process with error code of 255 and appropriate error&lt;br/&gt;*       message.&lt;br/&gt;*&lt;br/&gt;*Entry:&lt;br/&gt;*       int rterrnum - error message number (amsg_exit only).&lt;br/&gt;*&lt;br/&gt;*Exit:&lt;br/&gt;*       Calls ExitProcess.&lt;br/&gt;*&lt;br/&gt;*Exceptions:&lt;br/&gt;*&lt;br/&gt;*******************************************************************************/&lt;br/&gt;&lt;br/&gt;static void __cdecl fast_error_exit (&lt;br/&gt;        int rterrnum&lt;br/&gt;        )&lt;br/&gt;{&lt;br/&gt;#ifdef _WINMAIN_&lt;br/&gt;        if ( __error_mode == _OUT_TO_STDERR )&lt;br/&gt;#else  /* _WINMAIN_ */&lt;br/&gt;        if ( __error_mode != _OUT_TO_MSGBOX )&lt;br/&gt;#endif  /* _WINMAIN_ */&lt;br/&gt;            _FF_MSGBANNER();    /* write run-time error banner */&lt;br/&gt;&lt;br/&gt;        _NMSG_WRITE(rterrnum);  /* write message */&lt;br/&gt;        ExitProcess(255);       /* normally _exit(255) */&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;#ifndef WPRFLAG&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;#endif  /* WPRFLAG */&lt;br/&gt;&lt;br/&gt;#endif  /* CRTDLL */&lt;br/&gt;&lt;br/&gt;#else  /* _WIN32 */&lt;br/&gt;&lt;br/&gt;#include &amp;lt;cruntime.h&amp;gt;&lt;br/&gt;#include &amp;lt;internal.h&amp;gt;&lt;br/&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br/&gt;#include &amp;lt;msdos.h&amp;gt;&lt;br/&gt;#include &amp;lt;string.h&amp;gt;&lt;br/&gt;#include &amp;lt;setjmp.h&amp;gt;&lt;br/&gt;#include &amp;lt;dbgint.h&amp;gt;&lt;br/&gt;#include &amp;lt;macos\types.h&amp;gt;&lt;br/&gt;#include &amp;lt;macos\segload.h&amp;gt;&lt;br/&gt;#include &amp;lt;macos\gestalte.h&amp;gt;&lt;br/&gt;#include &amp;lt;macos\osutils.h&amp;gt;&lt;br/&gt;#include &amp;lt;macos\traps.h&amp;gt;&lt;br/&gt;#include &amp;lt;mpw.h&amp;gt;&lt;br/&gt;&lt;br/&gt;static void __cdecl Inherit(void);  /* local function */&lt;br/&gt;&lt;br/&gt;int __cdecl main(int, char **, char **);             /*generated by compiler*/&lt;br/&gt;&lt;br/&gt;unsigned long _GetShellStack(void);&lt;br/&gt;&lt;br/&gt;static char * __cdecl _p2cstr_internal ( unsigned char * str );&lt;br/&gt;&lt;br/&gt;extern MPWBLOCK * _pMPWBlock;&lt;br/&gt;extern int __argc;&lt;br/&gt;extern char **__argv;&lt;br/&gt;&lt;br/&gt;/***&lt;br/&gt;*__crt0()&lt;br/&gt;*&lt;br/&gt;*Purpose:&lt;br/&gt;*       This routine does the C runtime initialization, calls main(), and&lt;br/&gt;*       then exits.  It never returns.&lt;br/&gt;*&lt;br/&gt;*Entry:&lt;br/&gt;*&lt;br/&gt;*Exit:&lt;br/&gt;*       This function never returns.&lt;br/&gt;*&lt;br/&gt;*******************************************************************************/&lt;br/&gt;&lt;br/&gt;void __cdecl __crt0 (&lt;br/&gt;        )&lt;br/&gt;{&lt;br/&gt;        int mainret;&lt;br/&gt;        char szPgmName[32];&lt;br/&gt;        char *pArg;&lt;br/&gt;        char *argv[2];&lt;br/&gt;&lt;br/&gt;#ifndef _M_MPPC&lt;br/&gt;        void *pv;&lt;br/&gt;&lt;br/&gt;        /* This is the magic stuff that MPW tools do to get info from MPW*/&lt;br/&gt;&lt;br/&gt;        pv = (void *)*(int *)0x316;&lt;br/&gt;        if (pv != NULL &amp;amp;&amp;amp; !((int)pv &amp;amp; 1) &amp;amp;&amp;amp; *(int *)pv == 'MPGM') {&lt;br/&gt;            pv = (void *)*++(int *)pv;&lt;br/&gt;            if (pv != NULL &amp;amp;&amp;amp; *(short *)pv == 'SH') {&lt;br/&gt;                _pMPWBlock = (MPWBLOCK *)pv;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;#endif  /* _M_MPPC */&lt;br/&gt;&lt;br/&gt;        _environ = NULL;&lt;br/&gt;        if (_pMPWBlock == NULL) {&lt;br/&gt;            __argc = 1;&lt;br/&gt;            memcpy(szPgmName, (char *)0x910, sizeof(szPgmName));&lt;br/&gt;            pArg = _p2cstr_internal(szPgmName);&lt;br/&gt;            argv[0] = pArg;&lt;br/&gt;            argv[1] = NULL;&lt;br/&gt;            __argv = argv;&lt;br/&gt;&lt;br/&gt;#ifndef _M_MPPC&lt;br/&gt;            _shellStack = 0;                        /* force ExitToShell */&lt;br/&gt;#endif  /* _M_MPPC */&lt;br/&gt;        }&lt;br/&gt;#ifndef _M_MPPC&lt;br/&gt;        else {&lt;br/&gt;            _shellStack = _GetShellStack();        //return current a6, or first a6&lt;br/&gt;            _shellStack += 4;                      //a6 + 4 is the stack pointer we want&lt;br/&gt;            __argc = _pMPWBlock-&amp;gt;argc;&lt;br/&gt;            __argv = _pMPWBlock-&amp;gt;argv;&lt;br/&gt;&lt;br/&gt;            Inherit();       /* Inherit file handles - env is set up by _envinit if needed */&lt;br/&gt;        }&lt;br/&gt;#endif  /* _M_MPPC */&lt;br/&gt;&lt;br/&gt;        /*&lt;br/&gt;         * call run time initializer&lt;br/&gt;         */&lt;br/&gt;        __cinit();&lt;br/&gt;&lt;br/&gt;        mainret = main(__argc, __argv, _environ);&lt;br/&gt;        exit(mainret);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;#ifndef _M_MPPC&lt;br/&gt;/***&lt;br/&gt;*Inherit() - obtain and process info on inherited file handles.&lt;br/&gt;*&lt;br/&gt;*Purpose:&lt;br/&gt;*&lt;br/&gt;*       Locates and interprets MPW std files.  For files we just save the&lt;br/&gt;*       file handles.   For the console we save the device table address so&lt;br/&gt;*       we can do console I/O.  In the latter case, FDEV is set in the _osfile&lt;br/&gt;*       array.&lt;br/&gt;*&lt;br/&gt;*Entry:&lt;br/&gt;*       Address of MPW param table&lt;br/&gt;*&lt;br/&gt;*Exit:&lt;br/&gt;*       No return value.&lt;br/&gt;*&lt;br/&gt;*Exceptions:&lt;br/&gt;*&lt;br/&gt;*******************************************************************************/&lt;br/&gt;&lt;br/&gt;static void __cdecl Inherit (&lt;br/&gt;        void&lt;br/&gt;        )&lt;br/&gt;{&lt;br/&gt;        MPWFILE *pFile;&lt;br/&gt;        int i;&lt;br/&gt;        pFile = _pMPWBlock-&amp;gt;pFile;&lt;br/&gt;        if (pFile == NULL) {&lt;br/&gt;            return;&lt;br/&gt;        }&lt;br/&gt;        for (i = 0; i &amp;lt; 3; i++) {&lt;br/&gt;            switch ((pFile-&amp;gt;pDevice)-&amp;gt;name) {&lt;br/&gt;                case 'ECON':&lt;br/&gt;                    _osfile[i] |= FDEV | FOPEN;&lt;br/&gt;                    _osfhnd[i] = (int)pFile;&lt;br/&gt;                    break;&lt;br/&gt;&lt;br/&gt;                case 'FSYS':&lt;br/&gt;                    _osfile[i] |= FOPEN;&lt;br/&gt;                    _osfhnd[i] = (*(pFile-&amp;gt;ppFInfo))-&amp;gt;ioRefNum;&lt;br/&gt;                    break;&lt;br/&gt;            }&lt;br/&gt;            pFile++;&lt;br/&gt;        }&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;#endif  /* _M_MPPC */&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;static char * __cdecl _p2cstr_internal (&lt;br/&gt;        unsigned char * str&lt;br/&gt;        )&lt;br/&gt;{&lt;br/&gt;        unsigned char *pchSrc;&lt;br/&gt;        unsigned char *pchDst;&lt;br/&gt;        int  cch;&lt;br/&gt;&lt;br/&gt;        if ( str &amp;amp;&amp;amp; *str ) {&lt;br/&gt;            pchDst = str;&lt;br/&gt;            pchSrc = str + 1;&lt;br/&gt;&lt;br/&gt;            for ( cch=*pchDst; cch; --cch ) {&lt;br/&gt;                *pchDst++ = *pchSrc++;&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;            *pchDst = '\0';&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        return( str );&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;#endif  /* _WIN32 */&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span color="#ff8000" style="color: #ff8000;"&gt;用到的宏&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;可以看到，里面使用了很多的宏，同时还涉及到一些例如wWinMainCRTStartup，WinMainCRTStartup，wmainCRTStartup以及我们现在需要查看的mainCRTStartup。根据不同的宏来选用不同的代码实现。&lt;/p&gt;&lt;ol&gt;&lt;li&gt;_WIN32 &lt;/li&gt;&lt;li&gt;CRTDLL &lt;/li&gt;&lt;li&gt;WPRFLAG &lt;/li&gt;&lt;li&gt;_WINMAIN_ &lt;/li&gt;&lt;li&gt;_MT &lt;/li&gt;&lt;li&gt;_M_MPPC &lt;/li&gt;&lt;/ol&gt;&lt;table width="680" border="1" cellpadding="2" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="background-color: #b6b6b6;" valign="top"&gt;宏定义&lt;/td&gt;&lt;td style="background-color: #b6b6b6;" valign="top"&gt;说明&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="205"&gt;&lt;b&gt;_WIN32&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" width="473"&gt;Defined for applications for Win32 and Win64. Always defined.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="205"&gt;CRTDLL&lt;/td&gt;&lt;td valign="top" width="473"&gt;未在官方MSDN上找到，应为MSVCRT.DLL的相关宏&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="205"&gt;WPRFLAG&lt;/td&gt;&lt;td valign="top" width="473"&gt;未找到说明，应为unicode版的相关宏（默认为Multibyte）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="205"&gt;_WINMAIN_&lt;/td&gt;&lt;td valign="top" width="473"&gt;未找到说明，应为windows窗体程序（默认为console程序）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="205"&gt;&lt;b&gt;_MT&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" width="473"&gt;Defined when &lt;a href="http://msdn.microsoft.com/en-us/library/2kzt1wy3%28v=VS.71%29.aspx"&gt;/MD or /MDd&lt;/a&gt; (Multithreaded DLL) or &lt;a href="http://msdn.microsoft.com/en-us/library/2kzt1wy3%28v=VS.71%29.aspx"&gt;/MT or /MTd&lt;/a&gt; (Multithreaded) is specified.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="205"&gt;&lt;b&gt;_M_MPPC&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" width="473"&gt;Defined for Power Macintosh platforms (no longer supported).&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;&lt;span color="#ff8000" style="color: #ff8000;"&gt;整理之后的代码&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;因为我们这里分析的是mainCRTStartup，用的是命令行程序，非unicode版本，单线程，非PPC。所以可以将对应的一些宏去掉，最终整理得到的代码（不包含辅助函数）为：&lt;/p&gt;&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;  1&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;**&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  2&lt;/span&gt; &lt;span style="color: #008000;"&gt;*crt0.c - C runtime initialization routine&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  3&lt;/span&gt; &lt;span style="color: #008000;"&gt;*&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  4&lt;/span&gt; &lt;span style="color: #008000;"&gt;*       Copyright (c) 1989-1997, Microsoft Corporation. All rights reserved.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  5&lt;/span&gt; &lt;span style="color: #008000;"&gt;*&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  6&lt;/span&gt; &lt;span style="color: #008000;"&gt;*Purpose:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  7&lt;/span&gt; &lt;span style="color: #008000;"&gt;*       This the actual startup routine for apps.  It calls the user's main&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  8&lt;/span&gt; &lt;span style="color: #008000;"&gt;*       routine [w]main() or [w]WinMain after performing C Run-Time Library&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  9&lt;/span&gt; &lt;span style="color: #008000;"&gt;*       initialization.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 10&lt;/span&gt; &lt;span style="color: #008000;"&gt;*&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 11&lt;/span&gt; &lt;span style="color: #008000;"&gt;*       (With ifdef's, this source file also provides the source code for&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 12&lt;/span&gt; &lt;span style="color: #008000;"&gt;*       wcrt0.c, the startup routine for console apps with wide characters,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 13&lt;/span&gt; &lt;span style="color: #008000;"&gt;*       wincrt0.c, the startup routine for Windows apps, and wwincrt0.c,&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 14&lt;/span&gt; &lt;span style="color: #008000;"&gt;*       the startup routine for Windows apps with wide characters.)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 15&lt;/span&gt; &lt;span style="color: #008000;"&gt;*&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 16&lt;/span&gt; &lt;span style="color: #008000;"&gt;******************************************************************************&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 17&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 18&lt;/span&gt; &lt;span style="color: #000000;"&gt;#include &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;cruntime.h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 19&lt;/span&gt; &lt;span style="color: #000000;"&gt;#include &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;dos.h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 20&lt;/span&gt; &lt;span style="color: #000000;"&gt;#include &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;internal&lt;/span&gt;&lt;span style="color: #000000;"&gt;.h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 21&lt;/span&gt; &lt;span style="color: #000000;"&gt;#include &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;stdlib.h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 22&lt;/span&gt; &lt;span style="color: #000000;"&gt;#include &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;.h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 23&lt;/span&gt; &lt;span style="color: #000000;"&gt;#include &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;rterr.h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 24&lt;/span&gt; &lt;span style="color: #000000;"&gt;#include &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;windows.h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 25&lt;/span&gt; &lt;span style="color: #000000;"&gt;#include &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;awint.h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 26&lt;/span&gt; &lt;span style="color: #000000;"&gt;#include &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;tchar.h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 27&lt;/span&gt; &lt;span style="color: #000000;"&gt;#include &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;dbgint.h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 28&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 29&lt;/span&gt; &lt;span style="color: #000000;"&gt;_TUCHAR &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; __cdecl _wincmdln(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 30&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 31&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 32&lt;/span&gt; &lt;span style="color: #008000;"&gt; * command line, environment, and a few other globals&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 33&lt;/span&gt; &lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 34&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;_acmdln;              &lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; points to command line &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 35&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 36&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;_aenvptr &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; NULL;      &lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; points to environment block &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 37&lt;/span&gt; &lt;span style="color: #000000;"&gt;wchar_t &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;_wenvptr &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; NULL;   &lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; points to wide environment block &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 38&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 39&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 40&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; (__cdecl &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; _aexit_rtn)(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; _exit;   &lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; RT message return procedure &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 41&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 42&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; __cdecl fast_error_exit(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;);   &lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; Error exit via ExitProcess &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 43&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 44&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 45&lt;/span&gt; &lt;span style="color: #008000;"&gt; * _error_mode and _apptype, together, determine how error messages are&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 46&lt;/span&gt; &lt;span style="color: #008000;"&gt; * written out.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 47&lt;/span&gt; &lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 48&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; __error_mode &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; _OUT_TO_DEFAULT;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 49&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; __app_type &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; _CONSOLE_APP;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 50&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 51&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 52&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;**&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 53&lt;/span&gt; &lt;span style="color: #008000;"&gt;*BaseProcessStartup(PVOID Peb)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 54&lt;/span&gt; &lt;span style="color: #008000;"&gt;*&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 55&lt;/span&gt; &lt;span style="color: #008000;"&gt;*Purpose:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 56&lt;/span&gt; &lt;span style="color: #008000;"&gt;*       This routine does the C runtime initialization, calls main(), and&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 57&lt;/span&gt; &lt;span style="color: #008000;"&gt;*       then exits.  It never returns.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 58&lt;/span&gt; &lt;span style="color: #008000;"&gt;*&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 59&lt;/span&gt; &lt;span style="color: #008000;"&gt;*Entry:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 60&lt;/span&gt; &lt;span style="color: #008000;"&gt;*       PVOID Peb - pointer to Win32 Process Environment Block (not used)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 61&lt;/span&gt; &lt;span style="color: #008000;"&gt;*&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 62&lt;/span&gt; &lt;span style="color: #008000;"&gt;*Exit:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 63&lt;/span&gt; &lt;span style="color: #008000;"&gt;*       This function never returns.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 64&lt;/span&gt; &lt;span style="color: #008000;"&gt;*&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 65&lt;/span&gt; &lt;span style="color: #008000;"&gt;******************************************************************************&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 66&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 67&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; mainCRTStartup(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 68&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 69&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; mainret;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 70&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 71&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 72&lt;/span&gt; &lt;span style="color: #008000;"&gt;         * Get the full Win32 version&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 73&lt;/span&gt; &lt;span style="color: #008000;"&gt;         &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 74&lt;/span&gt; &lt;span style="color: #000000;"&gt;        _osver &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetVersion();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 75&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 76&lt;/span&gt; &lt;span style="color: #000000;"&gt;        _winminor &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (_osver &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;8&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0x00FF&lt;/span&gt;&lt;span style="color: #000000;"&gt; ;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 77&lt;/span&gt; &lt;span style="color: #000000;"&gt;        _winmajor &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; _osver &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0x00FF&lt;/span&gt;&lt;span style="color: #000000;"&gt; ;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 78&lt;/span&gt; &lt;span style="color: #000000;"&gt;        _winver &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (_winmajor &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;8&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; _winminor;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 79&lt;/span&gt; &lt;span style="color: #000000;"&gt;        _osver &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (_osver &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;16&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0x00FFFF&lt;/span&gt;&lt;span style="color: #000000;"&gt; ;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 80&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 81&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; ( &lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;_heap_init(&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;) )               &lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; initialize heap &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 82&lt;/span&gt; &lt;span style="color: #000000;"&gt;            fast_error_exit(_RT_HEAPINIT);  &lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; write message and die &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 83&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 84&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 85&lt;/span&gt; &lt;span style="color: #008000;"&gt;         * Guard the remainder of the initialization code and the call&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 86&lt;/span&gt; &lt;span style="color: #008000;"&gt;         * to user's main, or WinMain, function in a __try/__except&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 87&lt;/span&gt; &lt;span style="color: #008000;"&gt;         * statement.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 88&lt;/span&gt; &lt;span style="color: #008000;"&gt;         &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 89&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 90&lt;/span&gt; &lt;span style="color: #000000;"&gt;        __try {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 91&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 92&lt;/span&gt; &lt;span style="color: #000000;"&gt;            _ioinit();                      &lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; initialize lowio &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 93&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 94&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; get cmd line info &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 95&lt;/span&gt; &lt;span style="color: #000000;"&gt;            _acmdln &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;)GetCommandLineA();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 96&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 97&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; get environ info &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 98&lt;/span&gt; &lt;span style="color: #000000;"&gt;            _aenvptr &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;)__crtGetEnvironmentStringsA();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 99&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;100&lt;/span&gt; &lt;span style="color: #000000;"&gt;            _setargv();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;101&lt;/span&gt; &lt;span style="color: #000000;"&gt;            _setenvp();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;102&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;103&lt;/span&gt; &lt;span style="color: #000000;"&gt;            _cinit();                       &lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; do C data initialize &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;104&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;105&lt;/span&gt; &lt;span style="color: #000000;"&gt;        __initenv &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; _environ;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;106&lt;/span&gt; &lt;span style="color: #000000;"&gt;            mainret &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; main(__argc, __argv, _environ);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;107&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;108&lt;/span&gt; &lt;span style="color: #000000;"&gt;            exit(mainret);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;109&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;110&lt;/span&gt; &lt;span style="color: #000000;"&gt;        __except ( _XcptFilter(GetExceptionCode(), GetExceptionInformation()) )&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;111&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;112&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;113&lt;/span&gt; &lt;span style="color: #008000;"&gt;             * Should never reach here&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;114&lt;/span&gt; &lt;span style="color: #008000;"&gt;             &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;115&lt;/span&gt; &lt;span style="color: #000000;"&gt;            _exit( GetExceptionCode() );&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;116&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;117&lt;/span&gt; &lt;span style="color: #000000;"&gt;        } &lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; end of try - except &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;118&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;p&gt;这样，就可以分析一下得到的代码了。同时，从代码中可以看到微软的编码风格，学习到一部分。&lt;/p&gt;&lt;p&gt;在mainCRTStartup()函数中，主要调用了GetVersion, _heap_init, fast_error_exit, _ioinit, GetCommandLineA, __crtGetEnvironmentStringsA, _setargv, _setenvp, _cinit, exit，以及最重要的main函数。&lt;/p&gt;&lt;p&gt;其中fast_error_exit位于crt0.c中，实现如下&lt;/p&gt;&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; __cdecl fast_error_exit (&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; rterrnum&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;        )&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;#ifdef _WINMAIN_&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; ( __error_mode &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; _OUT_TO_STDERR )&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#else&lt;/span&gt;&lt;span style="color: #000000;"&gt;  /* _WINMAIN_ */&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; ( __error_mode &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; _OUT_TO_MSGBOX )&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt;&lt;span style="color: #000000;"&gt;  /* _WINMAIN_ */&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;            _FF_MSGBANNER();    &lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; write run-time error banner &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #000000;"&gt;        _NMSG_WRITE(rterrnum);  &lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; write message &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;span style="color: #000000;"&gt;        ExitProcess(&lt;/span&gt;&lt;span style="color: #800080;"&gt;255&lt;/span&gt;&lt;span style="color: #000000;"&gt;);       &lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; normally _exit(255) &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;p&gt;其他一些函数所在的文件或者说明如下，感兴趣的同学可以自行研究，这里因为篇幅原因，就不一一展开了。&lt;/p&gt;&lt;table width="614" border="1" cellpadding="2" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="224"&gt;函数名&lt;/td&gt;&lt;td valign="top" width="121"&gt;文件&lt;/td&gt;&lt;td valign="top" width="266"&gt;说明&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="225"&gt;GetVersion&lt;/td&gt;&lt;td valign="top" width="121"&gt;win32 API&lt;/td&gt;&lt;td valign="top" width="266"&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="225"&gt;_heap_init&lt;/td&gt;&lt;td valign="top" width="121"&gt;Heapinit.c&lt;/td&gt;&lt;td valign="top" width="266"&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="225"&gt;_ioinit&lt;/td&gt;&lt;td valign="top" width="121"&gt;Ioinit.c&lt;/td&gt;&lt;td valign="top" width="266"&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="225"&gt;GetCommandLineA&lt;/td&gt;&lt;td valign="top" width="121"&gt;win32 API&lt;/td&gt;&lt;td valign="top" width="266"&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="225"&gt;__crtGetEnvironmentStringsA&lt;/td&gt;&lt;td valign="top" width="121"&gt;A_env.c&lt;/td&gt;&lt;td valign="top" width="266"&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="225"&gt;_setargv&lt;/td&gt;&lt;td valign="top" width="121"&gt;Setargv.c&lt;/td&gt;&lt;td valign="top" width="266"&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="225"&gt;_setenvp&lt;/td&gt;&lt;td valign="top" width="121"&gt;Stdenvp.c&lt;/td&gt;&lt;td valign="top" width="266"&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="225"&gt;_cinit&lt;/td&gt;&lt;td valign="top" width="121"&gt;Crt0dat.c&lt;/td&gt;&lt;td valign="top" width="266"&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="225"&gt;exit&lt;/td&gt;&lt;td valign="top" width="121"&gt;Crt0dat.c&lt;/td&gt;&lt;td valign="top" width="266"&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;由此可见，mainCRTStartup为main函数做了一些初始化的工作，包括创建heap，初始化low IO，以及命令行参数和环境变量的获取，和初始化C runtime Data。&lt;/p&gt;&lt;p&gt;至于内部的实现细节，因为时间关系，还没有具体去研究，暂时就先放在这里，等研究有一些心得再加到这里来。&lt;/p&gt;&lt;p&gt;当没有做这些初始化工作，而直接使用main作为入口函数的话，是会出现很多问题的，具体在下一篇写吧。&lt;/p&gt;&lt;p&gt;由于涉及到的这部分，网络上面的参考较少，自己揣摩出来居多，有错误难免，希望大家批评指正。&lt;/p&gt;&lt;p&gt;参考：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.a3gs.com/BookViews.asp?InfoID=2629&amp;amp;ClassID=819"&gt;http://www.a3gs.com/BookViews.asp?InfoID=2629&amp;amp;ClassID=819&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/b0084kay(v=VS.71).aspx"&gt;http://msdn.microsoft.com/en-us/library/b0084kay(v=VS.71).aspx&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/f9t8842e(v=vs.71).aspx"&gt;http://msdn.microsoft.com/en-us/library/f9t8842e(v=vs.71).aspx&lt;/a&gt; &lt;/li&gt;&lt;/ol&gt;&lt;img src="http://www.cnblogs.com/cnyao/aggbug/2080942.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cnyao/archive/2011/06/14/windowsprogramming_4.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cnyao/archive/2011/06/10/win32sdkp3_helloc.html</id><title type="text">从零开始，学习windows编程（3）—hello.c的疑惑</title><summary type="text">上一篇，我们问了几个问题，这一篇就从hello.c的各个方面来研究研究，等到这一篇的结束来看这些疑惑有哪些是可以解答了的，当然还有一些可能要放到后面解决了……。既然要抽丝剥茧，就要从手头已有的线索出发，同时加上搜索到的知识，以及自己的思考，任何问题的解决都是通过这个路径（当然，老板除外，老板这种生物只需要发出指令，然后得到结果就OK了……）。我们现在有的，是一个hello.c文件，通过cl命令就可以生成目标hello.exe文件。那我们就可以研究一下cl这个东西。CL解释CL.EXE（或cl.exe，似乎windows的文件系统对于大小写是不敏感的），是何许人也呢？直接引用微软的说辞吧（htt</summary><published>2011-06-10T06:32:00Z</published><updated>2011-06-10T06:32:00Z</updated><author><name>cnyao</name><uri>http://www.cnblogs.com/cnyao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cnyao/archive/2011/06/10/win32sdkp3_helloc.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cnyao/archive/2011/06/10/win32sdkp3_helloc.html"/><content type="html">&lt;p&gt;上一篇，我们问了几个问题，这一篇就从hello.c的各个方面来研究研究，等到这一篇的结束来看这些疑惑有哪些是可以解答了的，当然还有一些可能要放到后面解决了&amp;hellip;&amp;hellip;。&lt;/p&gt;&lt;p&gt;既然要抽丝剥茧，就要从手头已有的线索出发，同时加上搜索到的知识，以及自己的思考，任何问题的解决都是通过这个路径（当然，老板除外，老板这种生物只需要发出指令，然后得到结果就OK了&amp;hellip;&amp;hellip;）。&lt;/p&gt;&lt;p&gt;我们现在有的，是一个hello.c文件，通过cl命令就可以生成目标hello.exe文件。&lt;/p&gt;&lt;p&gt;那我们就可以研究一下cl这个东西。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff8000;" color="#ff8000"&gt;CL解释&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;CL.EXE（或cl.exe，似乎windows的文件系统对于大小写是不敏感的），是何许人也呢？直接引用微软的说辞吧（&lt;a title="http://msdn.microsoft.com/en-us/library/9s7c9wdw(v=vs.71).aspx" href="http://msdn.microsoft.com/en-us/library/9s7c9wdw(v=vs.71).aspx"&gt;http://msdn.microsoft.com/en-us/library/9s7c9wdw(v=vs.71).aspx&lt;/a&gt;）。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;CL.exe is a 32-bit tool that controls the Microsoft C and C++ compilers and linker. The compilers produce Common Object File Format (COFF) object (.obj) files. The linker produces executable (.exe) files or dynamic-link libraries (DLLs).&lt;/p&gt;&lt;p&gt;Note that all compiler options are case sensitive.&lt;/p&gt;&lt;p&gt;To compile without linking, use &lt;a href="http://msdn.microsoft.com/en-us/library/8we9bhf4%28v=vs.71%29.aspx"&gt;/c&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;因为VC6的版本说明没有找到，这里的说明文字是Visual studio 2003的CL.EXE说明，不过都是一样的。从上面的说明可以看到CL是用来控制微软C和C++编译器（compiler）和链接器（linker），一共做了两件事情。编译器会生成COFF文件格式的目标文件（.obj）；链接器会生成可执行文件（.exe）或者动态链接库文件（DLLs）。&lt;/p&gt;&lt;p&gt;对比我们之前的做法，的确是执行cl命令之后，生成了一个hello.obj文件和一个hello.exe文件。&lt;/p&gt;&lt;p&gt;另外在最后，还说明了一下，使用/c选项，则可以不进行链接过程。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff8000;" color="#ff8000"&gt;CL选项&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;那cl还有哪些选项呢？使用cl /?来看看。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #000000;"&gt;d:&lt;/span&gt;&lt;span style="color: #000000;"&gt;\&lt;/span&gt;&lt;span style="color: #000000;"&gt;test&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;cl &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;?&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;Microsoft &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;R&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;32&lt;/span&gt;&lt;span style="color: #000000;"&gt;-bit C&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;C&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt; Optimizing Compiler Version &lt;/span&gt;&lt;span style="color: #000000;"&gt;12.00&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;8168&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; 8&lt;/span&gt;&lt;span style="color: #000000;"&gt;0x86&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;Copyright &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;C&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt; Microsoft Corp &lt;/span&gt;&lt;span style="color: #000000;"&gt;1984&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;1998&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt; All rights reserved&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;                          C&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;C&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt; COMPILER OPTIONS&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;                              -OPTIMIZATION-&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;O1 minimize space                       &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Op[-] improve floating-pt consistency&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;O2 maximize speed                       &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Os favor code space&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Oa assume no aliasing                   &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Ot favor code speed&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Ob&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;n&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; inline expansion &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;default n&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Ow assume cross-function aliasing&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Od disable optimizations &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;default&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Ox maximum opts&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;(/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Ogityb1 &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Gs&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Og enable global optimization           &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Oy[-] enable frame pointer omission&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Oi enable intrinsic functions&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;span style="color: #000000;"&gt;                             -CODE GENERATION-&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;G3 optimize &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;80386&lt;/span&gt;&lt;span style="color: #000000;"&gt;                   &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Gy separate functions &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; linker&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;G4 optimize &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;80486&lt;/span&gt;&lt;span style="color: #000000;"&gt;                   &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Ge force stack checking &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; all funcs&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;G5 optimize &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; Pentium                 &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Gs[num] disable stack checking calls&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;G6 optimize &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; Pentium Pro             &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Gh enable hook function &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;call&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;GB optimize &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; blended model &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;default&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;GR[-] enable C&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt; RTTI&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Gd __cdecl calling convention           &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;GX[-] enable C&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt; EH &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;same as &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;EHsc&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Gr __fastcall calling convention        &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Gi[-] enable incremental compilation&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Gz __stdcall calling convention         &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Gm[-] enable minimal rebuild&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;GA optimize &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; Windows Application     &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;EHs enable synchronous C&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt; EH&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;GD optimize &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; Windows DLL             &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;EHa enable asynchronous C&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt; EH&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Gf enable string pooling                &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;EHc extern &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;C&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; defaults to nothrow&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;GF enable read-only string pooling      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;QIfdiv[-] enable Pentium FDIV fix&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;32&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;GZ enable runtime &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;debug&lt;/span&gt;&lt;span style="color: #000000;"&gt; checks          &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;QI0f[-] enable Pentium &lt;/span&gt;&lt;span style="color: #000000;"&gt;0x0f&lt;/span&gt;&lt;span style="color: #000000;"&gt; fix&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;33&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;34&lt;/span&gt; &lt;span style="color: #000000;"&gt;                              -OUTPUT &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;FILES&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;35&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;36&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Fa[file] name assembly listing file     &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Fo&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;file&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; name object file&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;37&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;FA[sc] configure assembly listing       &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Fp&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;file&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; name precompiled header file&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;38&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Fd[file] name &lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;PDB file                 &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Fr[file] name source browser file&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;39&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Fe&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;file&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; name executable file           &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;FR[file] name extended &lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;SBR file&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;40&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Fm[file] name map file&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;41&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;42&lt;/span&gt; &lt;span style="color: #000000;"&gt;                              -PREPROCESSOR-&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;43&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;44&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;C don't strip comments                  &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;FI&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;file&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; name forced include file&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;45&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;D&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;name&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;{&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;|&lt;/span&gt;&lt;span style="color: #000000;"&gt;#&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;text&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; define macro         &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;U&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;name&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; remove predefined macro&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;46&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;E preprocess to stdout                  &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;u remove all predefined macros&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;47&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;EP preprocess to stdout&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt; no &lt;/span&gt;&lt;span style="color: #000000;"&gt;#&lt;/span&gt;&lt;span style="color: #000000;"&gt;line       &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;I&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;dir&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; add to include search &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;path&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;48&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;P preprocess to file                    &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;X ignore &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;standard places&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;49&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;50&lt;/span&gt; &lt;span style="color: #000000;"&gt;                                -LANGUAGE-&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;51&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;52&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Zi enable debugging information         &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Zl omit default library name in &lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;OBJ&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;53&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;ZI enable Edit and Continue &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;debug&lt;/span&gt;&lt;span style="color: #000000;"&gt; info  &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Zg generate function prototypes&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;54&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;55&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Z7 enable old-style &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;debug&lt;/span&gt;&lt;span style="color: #000000;"&gt; info          &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Zs syntax check only&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;56&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Zd line number debugging info only      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;vd{&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;|&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;} disable&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;enable vtordisp&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;57&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Zp[n] pack structs &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;on&lt;/span&gt;&lt;span style="color: #000000;"&gt; n-byte boundary   &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;vm&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;x&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;type&lt;/span&gt;&lt;span style="color: #000000;"&gt; of pointers to members&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;58&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Za disable extensions &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;implies &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Op&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;     &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;noBool disable &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; keyword&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;59&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Ze enable extensions &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;default&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;60&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;61&lt;/span&gt; &lt;span style="color: #000000;"&gt;                              -MISCELLANEOUS-&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;62&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;63&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;?&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;help &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;print&lt;/span&gt;&lt;span style="color: #000000;"&gt; this help message        &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;V&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt; version string&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;64&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;c compile only&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt; no link                 &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;w disable all warnings&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;65&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;H&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;num&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; max external name length         &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;W&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;n&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt; warning level &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;default n&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;66&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;J default char &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;type&lt;/span&gt;&lt;span style="color: #000000;"&gt; is unsigned         &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;WX treat warnings as errors&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;67&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;nologo suppress copyright message       &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Yc[file] create &lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;PCH file&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;68&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Tc&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;source file&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; compile file as &lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;c      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Yd put &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;debug&lt;/span&gt;&lt;span style="color: #000000;"&gt; info in every &lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;OBJ&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;69&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Tp&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;source file&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; compile file as &lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;cpp    &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Yu[file] &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;use&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;PCH file&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;70&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;TC compile all &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;files&lt;/span&gt;&lt;span style="color: #000000;"&gt; as &lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;c              &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;YX[file] automatic &lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;PCH&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;71&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;TP compile all &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;files&lt;/span&gt;&lt;span style="color: #000000;"&gt; as &lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;cpp            &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Zm&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;n&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; max memory alloc &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;% of default&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;72&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;73&lt;/span&gt; &lt;span style="color: #000000;"&gt;                                 -LINKING-&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;74&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;75&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;MD&lt;/span&gt;&lt;span style="color: #000000;"&gt; link with MSVCRT&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;LIB                 &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;MDd link with MSVCRTD&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;LIB &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;debug&lt;/span&gt;&lt;span style="color: #000000;"&gt; lib&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;76&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;ML link with LIBC&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;LIB                   &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;MLd link with LIBCD&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;LIB &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;debug&lt;/span&gt;&lt;span style="color: #000000;"&gt; lib&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;77&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;MT link with LIBCMT&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;LIB                 &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;MTd link with LIBCMTD&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;LIB &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;debug&lt;/span&gt;&lt;span style="color: #000000;"&gt; lib&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;78&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;LD Create &lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;DLL                          &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;F&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;num&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt; stack size&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;79&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;80&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;LDd Create &lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;DLL &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;debug&lt;/span&gt;&lt;span style="color: #000000;"&gt; libary            &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;link [linker options and libraries]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;具体可以看（&lt;a title="http://msdn.microsoft.com/en-us/library/19z1t1wy(v=VS.71).aspx" href="http://msdn.microsoft.com/en-us/library/19z1t1wy(v=VS.71).aspx"&gt;http://msdn.microsoft.com/en-us/library/19z1t1wy(v=VS.71).aspx&lt;/a&gt;）来了解。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff8000;" color="#ff8000"&gt;选项的具体使用&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;原来有这么多的选项。数了一下，有99个选项之多。每个选项都有自己的作用，就需要使用的时候去熟悉了，不过我们现在不需要了解这么多，我们就来看下/c选项好了。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;This option prevents the automatic call to LINK. Compiling with /c creates .obj files only. You must call LINK explicitly with the proper files and options to perform the linking phase of the build.&lt;/p&gt;&lt;p&gt;Any internal project created in the development environment uses the /c option by default.&lt;/p&gt;&lt;p&gt;&lt;b&gt;To set this compiler option in the Visual Studio development environment&lt;/b&gt;&lt;/p&gt;&lt;p&gt;This option is not available from within the development environment.&lt;/p&gt;&lt;p&gt;&lt;b&gt;To set this compiler option programmatically&lt;/b&gt;&lt;/p&gt;&lt;p&gt;This compiler option cannot be changed programmatically.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;要彻底理解它，就必须知道C语言到目标代码的过程。首先，C语言中有两种文件，一个.c文件（我们一般称之为源文件），一个.h文件（我们一般称之为头文件）。头文件一般会被源文件包含，而源文件会被编译成一个二进制中间文件，之后所有的二进制中间文件会通过链接器进行链接，形成一个可以在某个特定系统上执行的二进制可执行文件。&lt;/p&gt;&lt;p&gt;于是，C语言--&amp;gt;可执行代码可以明显的分为编译过程和链接过程，而由于C语言中一种特殊语法--&amp;ldquo;宏&amp;rdquo;的存在，所以还有一个预编译过程，在预编译过程中，C语言中的宏会被展开；同时，包含的头文件中的代码，会根据条件编译等，囊括到源文件中，这些工作做好后，给编译器的就是一份新的源码文件，供编译阶段使用。&lt;/p&gt;&lt;p&gt;另外，相信大家都知道，C语言是从汇编语言发展过来的，汇编是从机器码发展过来的，以前的编译器都是先将C语言编译成汇编语言，再将其解释成机器码就可以了。现代编译器除了做这个，还可以对代码进行优化。不过基本思想是一直没有变的。&lt;/p&gt;&lt;p&gt;而我们做C开发的时候，有时稍微看一下汇编之后的代码，对于计算机是如何执行程序的过程，会有更清晰的认识。&lt;/p&gt;&lt;p&gt;那么，用cl可以生成汇编代码吗？答案当然是肯定的。&lt;/p&gt;&lt;p&gt;在命令行输入cl /FA hello.c，看看生成了哪些东西？当然，如果你不要生成.exe文件，可以加上/c选项。&lt;/p&gt;&lt;p&gt;可以看到生成了.obj文件和.asm文件。&lt;/p&gt;&lt;p&gt;查看asm文件内容&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #000000;"&gt;TITLE hello.c&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;.386P&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;include listing.&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;inc&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;if @Version gt &lt;/span&gt;&lt;span style="color: #800080;"&gt;510&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;.model FLAT&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;else&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;_TEXT SEGMENT PARA USE32 PUBLIC &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;CODE&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;_TEXT ENDS&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;_DATA SEGMENT DWORD USE32 PUBLIC &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;DATA&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;_DATA ENDS&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;CONST SEGMENT DWORD USE32 PUBLIC &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;CONST&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #000000;"&gt;CONST ENDS&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;span style="color: #000000;"&gt;_BSS SEGMENT DWORD USE32 PUBLIC &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;BSS&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #000000;"&gt;_BSS ENDS&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;span style="color: #000000;"&gt;_TLS SEGMENT DWORD USE32 PUBLIC &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;TLS&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt; &lt;span style="color: #000000;"&gt;_TLS ENDS&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;span style="color: #000000;"&gt;FLAT GROUP _DATA, CONST, _BSS&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; &lt;span style="color: #000000;"&gt;ASSUME &lt;/span&gt;&lt;span style="color: #008080;"&gt;CS:&lt;/span&gt;&lt;span style="color: #000000;"&gt; FLAT, &lt;/span&gt;&lt;span style="color: #008080;"&gt;DS:&lt;/span&gt;&lt;span style="color: #000000;"&gt; FLAT, &lt;/span&gt;&lt;span style="color: #008080;"&gt;SS:&lt;/span&gt;&lt;span style="color: #000000;"&gt; FLAT&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt; &lt;span style="color: #000000;"&gt;endif&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt; &lt;span style="color: #000000;"&gt;PUBLIC _main&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt; &lt;span style="color: #000000;"&gt;EXTRN &lt;/span&gt;&lt;span style="color: #008080;"&gt;_printf:&lt;/span&gt;&lt;span style="color: #000000;"&gt;NEAR&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt; &lt;span style="color: #000000;"&gt;_DATA SEGMENT&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt; &lt;span style="color: #000000;"&gt;$SG336 DB &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;abcdefg.&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;, 0aH, 00H&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt; &lt;span style="color: #000000;"&gt;_DATA ENDS&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt; &lt;span style="color: #000000;"&gt;_TEXT SEGMENT&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt; &lt;span style="color: #000000;"&gt;_main PROC NEAR&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;&lt;span style="color: #008000;"&gt; File hello.c&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt; &lt;span style="color: #008000;"&gt;;&lt;/span&gt;&lt;span style="color: #008000;"&gt; Line 4&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;push&lt;/span&gt;&lt;span style="color: #000000;"&gt; ebp&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;mov&lt;/span&gt;&lt;span style="color: #000000;"&gt; ebp, esp&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;&lt;span style="color: #008000;"&gt; Line 5&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;32&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;push&lt;/span&gt;&lt;span style="color: #000000;"&gt; OFFSET &lt;/span&gt;&lt;span style="color: #008080;"&gt;FLAT:&lt;/span&gt;&lt;span style="color: #000000;"&gt;$SG336&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;33&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;call&lt;/span&gt;&lt;span style="color: #000000;"&gt; _printf&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;34&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt;&lt;span style="color: #000000;"&gt; esp, &lt;/span&gt;&lt;span style="color: #800080;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;35&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;&lt;span style="color: #008000;"&gt; Line 7&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;36&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;xor&lt;/span&gt;&lt;span style="color: #000000;"&gt; eax, eax&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;37&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;;&lt;/span&gt;&lt;span style="color: #008000;"&gt; Line 8&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;38&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;pop&lt;/span&gt;&lt;span style="color: #000000;"&gt; ebp&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;39&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;ret&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;40&lt;/span&gt; &lt;span style="color: #000000;"&gt;_main ENDP&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;41&lt;/span&gt; &lt;span style="color: #000000;"&gt;_TEXT ENDS&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;42&lt;/span&gt; &lt;span style="color: #000000;"&gt;END&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;这个汇编代码，仅仅用cl再进行编译，我还没有找到方法，所以这里就要引入一个新工具--ml，ml是MASM中编译汇编代码使用的编译器，同样，它也会调用到link，并且让它不调用link，使用的编译选项也是/c。&lt;p&gt;从cl和hello.c，我们引出了hello.obj，hello.asm，以及ml.exe，包括C语言到可执行文件的过程。下面先跳过ml，来看看链接过程。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff8000;" color="#ff8000"&gt;链接过程&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;链接过程也就是将.obj变成.exe的过程，使用的是link.exe。&lt;/p&gt;&lt;p&gt;直接使用cl /c hello.c产生的hello.obj文件，输入命令link hello.obj，直接就生成了.exe文件。&lt;/p&gt;&lt;p&gt;真简单~不过，且慢，我们有main函数，但是至少printf函数这个东西，是在哪里呢？&lt;/p&gt;&lt;p&gt;秘密就藏在生成的那个.obj文件中啦！如果用另外一个.obj文件（稍候我们会用另外一个hello.obj），那就会得到错误哦。&lt;/p&gt;&lt;p&gt;那我们打开obj文件来看看吧。怎么？还要看二进制文件？不用担心，看的还是英文字符，多说无用，还是看下就知道了。&lt;/p&gt;&lt;p&gt;这里我使用的是winhex，其实使用其他任何一个文本编辑器都是可以的，不过看二进制文件我还是习惯使用专门的二进制编辑器。截图用的picpick。顺便说明下。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cnyao/201106/201106101414047503.png"&gt;&lt;img style="display: inline; border-width: 0px;" title="helloobj" alt="helloobj" src="http://images.cnblogs.com/cnblogs_com/cnyao/201106/201106101414076098.png" height="451" width="580" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;左边是文件内容，主要看右边，红线划过的地方。看不清的同学可以看这里：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;-defaultlib:LIBC &amp;ndash;defaultlib:OLDNAMES&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;其实，链接过程会将所有的静态库和目标文件进行链接，而在这份hello.obj文件中，指定了两个default lib，一个为libc.lib，一个为oldnames.lib。而这两个lib文件又是何方神圣呢？&lt;/p&gt;&lt;p&gt;libc.lib为单线程静态C标准库（在cl中可使用/ML选项定义对其的链接），而oldnames.lib则是为了兼容微软以前的C/C++开发系统，基本不使用了，至少在我们这个hello.c编译链接成exe的过程中，可以忽略掉它。&lt;/p&gt;&lt;p&gt;其实，我们用一个很简单的方法可以知道我们的程序链接了哪些库。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #000000;"&gt;d:&lt;/span&gt;&lt;span style="color: #000000;"&gt;\&lt;/span&gt;&lt;span style="color: #000000;"&gt;test&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;link &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;verbose&lt;/span&gt;&lt;span style="color: #800000;"&gt;:lib&lt;/span&gt;&lt;span style="color: #000000;"&gt; hello&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;obj&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;Microsoft &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;R&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt; Incremental Linker Version &lt;/span&gt;&lt;span style="color: #000000;"&gt;6.00&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;8168&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;Copyright &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;C&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt; Microsoft Corp &lt;/span&gt;&lt;span style="color: #000000;"&gt;1992&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;1998&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt; All rights reserved&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;Searching Libraries&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;Searching D:&lt;/span&gt;&lt;span style="color: #000000;"&gt;\&lt;/span&gt;&lt;span style="color: #000000;"&gt;Program &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Files&lt;/span&gt;&lt;span style="color: #000000;"&gt;\&lt;/span&gt;&lt;span style="color: #000000;"&gt;Microsoft Visual Studio&lt;/span&gt;&lt;span style="color: #000000;"&gt;\&lt;/span&gt;&lt;span style="color: #000000;"&gt;VC98&lt;/span&gt;&lt;span style="color: #000000;"&gt;\&lt;/span&gt;&lt;span style="color: #000000;"&gt;lib&lt;/span&gt;&lt;span style="color: #000000;"&gt;\&lt;/span&gt;&lt;span style="color: #000000;"&gt;LIBC&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;lib:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;Searching D:&lt;/span&gt;&lt;span style="color: #000000;"&gt;\&lt;/span&gt;&lt;span style="color: #000000;"&gt;Program &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Files&lt;/span&gt;&lt;span style="color: #000000;"&gt;\&lt;/span&gt;&lt;span style="color: #000000;"&gt;Microsoft Visual Studio&lt;/span&gt;&lt;span style="color: #000000;"&gt;\&lt;/span&gt;&lt;span style="color: #000000;"&gt;VC98&lt;/span&gt;&lt;span style="color: #000000;"&gt;\&lt;/span&gt;&lt;span style="color: #000000;"&gt;lib&lt;/span&gt;&lt;span style="color: #000000;"&gt;\&lt;/span&gt;&lt;span style="color: #000000;"&gt;OLDNAMES&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;lib:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;Searching D:&lt;/span&gt;&lt;span style="color: #000000;"&gt;\&lt;/span&gt;&lt;span style="color: #000000;"&gt;Program &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;Files&lt;/span&gt;&lt;span style="color: #000000;"&gt;\&lt;/span&gt;&lt;span style="color: #000000;"&gt;Microsoft Platform SDK&lt;/span&gt;&lt;span style="color: #000000;"&gt;\&lt;/span&gt;&lt;span style="color: #000000;"&gt;Lib&lt;/span&gt;&lt;span style="color: #000000;"&gt;\.\&lt;/span&gt;&lt;span style="color: #000000;"&gt;kernel32&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;lib:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;Done Searching Libraries&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这里还可以使用一个小工具，叫做dumpbin的，可以利用它的选项来分析hello.obj文件，看到defaultlib，而不用打开文件自己查看。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #000000;"&gt;d:\test&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;dumpbin &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;DIRECTIVES hello.obj&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;Microsoft (R) COFF Binary File Dumper Version &lt;/span&gt;&lt;span style="color: #000000;"&gt;6.00&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;8168&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;Copyright (C) Microsoft Corp &lt;/span&gt;&lt;span style="color: #000000;"&gt;1992&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;1998&lt;/span&gt;&lt;span style="color: #000000;"&gt;. All rights reserved.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;Dump of file hello.obj&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;File Type: COFF OBJECT&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;Linker Directives&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-----------------&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;defaultlib:LIBC&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;defaultlib:OLDNAMES&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #000000;"&gt;Summary&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt; &lt;span style="color: #000000;"&gt;A .data&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;26&lt;/span&gt;&lt;span style="color: #000000;"&gt; .drectve&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;14&lt;/span&gt;&lt;span style="color: #000000;"&gt; .text&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;oldnames.lib我们可以略过，但是libc.lib我们还是需要了解的，今后要做VC相关项目，使用到第三方库的会经常用到。为了解释libc.lib，我们需要引入一个新的概念--&amp;ldquo;C语言运行库&amp;rdquo;，这里我们只讨论windows平台，VC中使用的被称为MSVC CRT。&lt;p&gt;另外还要牵涉到的一个概念就是线程。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff8000;" color="#ff8000"&gt;C语言运行时库(C Run-time Library)---CRT&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;要了解这个东西，就需要对C语言的发展史有一定的了解。C语言是在上世纪70年代在B语言的基础上被发明出来的，之后Dennis Ritchie 和 Brian Kernighan 就用C本身重写了90%以上的 UNIX 系统函数。并且把其中最常用的部分独立出来，形成头文件和对应的 LIBRARY，C run-time library 就是这样形成的。在类UNIX系统中，C运行库被认为是系统的一部分。&lt;/p&gt;&lt;p&gt;我们看看维基百科上面的定义吧&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;In &lt;a href="http://en.wikipedia.org/wiki/Computer_programming"&gt;computer programming&lt;/a&gt;, a &lt;b&gt;runtime library&lt;/b&gt; is a special &lt;a href="http://en.wikipedia.org/wiki/Program_library"&gt;program library&lt;/a&gt; used by a &lt;a href="http://en.wikipedia.org/wiki/Compiler"&gt;compiler&lt;/a&gt;, to implement functions built into a &lt;a href="http://en.wikipedia.org/wiki/Programming_language"&gt;programming language&lt;/a&gt;, during the execution (&lt;a href="http://en.wikipedia.org/wiki/Run_time_%28program_lifecycle_phase%29"&gt;runtime&lt;/a&gt;) of a &lt;a href="http://en.wikipedia.org/wiki/Computer_program"&gt;computer program&lt;/a&gt;. This often includes functions for input and output, or for memory management.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;而随着C语言的流行，出现了很多C编译器，也就有很多C运行时库的实现。主要有下面的几种&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/w/index.php?title=BSD_libc&amp;amp;action=edit&amp;amp;redlink=1"&gt;BSD libc&lt;/a&gt;, implementations distributed under &lt;a href="http://en.wikipedia.org/wiki/Berkeley_Software_Distribution"&gt;BSD&lt;/a&gt; operating systems. &lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/GNU_C_Library"&gt;GNU C Library&lt;/a&gt;, used in &lt;a href="http://en.wikipedia.org/wiki/GNU"&gt;GNU&lt;/a&gt;/&lt;a href="http://en.wikipedia.org/wiki/Linux"&gt;Linux&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/GNU"&gt;GNU&lt;/a&gt;/&lt;a href="http://en.wikipedia.org/wiki/HURD"&gt;HURD&lt;/a&gt;. &lt;/li&gt;&lt;li&gt;Dinkum C99 Library from &lt;a href="http://en.wikipedia.org/wiki/Dinkumware"&gt;Dinkumware&lt;/a&gt;, most common commercially licensed one&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Windows_library_files#Msvcrt.dll"&gt;Microsoft C Run-time Library&lt;/a&gt;, part of &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B"&gt;Microsoft Visual C++&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Dietlibc"&gt;dietlibc&lt;/a&gt;, an alternative small implementation of the C standard library (MMU-less) &lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/UClibc"&gt;uClibc&lt;/a&gt;, a C standard library for embedded &lt;a href="http://en.wikipedia.org/wiki/Linux"&gt;Linux&lt;/a&gt; systems (MMU-less) &lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Newlib"&gt;Newlib&lt;/a&gt;, a C standard library for embedded systems (MMU-less)&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Klibc"&gt;klibc&lt;/a&gt;, primarily for booting Linux systems. &lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/EGLIBC"&gt;EGLIBC&lt;/a&gt;, variant of glibc for embedded systems.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/w/index.php?title=Musl&amp;amp;action=edit&amp;amp;redlink=1"&gt;musl&lt;/a&gt;, another lightweight C standard library implementation for Linux systems&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;可以看到，我们现在讨论的Microsoft C Run-time Library也是其中的一种。在那个年代，线程还没有被应用到操作系统上，应用程序都是单线程的。所以最初的C Run-time Library都是单线程的。另外动态库的概念也是后期出现的，所以一开始C Run-time Library也只是静态链接。&lt;/p&gt;&lt;p&gt;随着时间的推移，计算机技术也在不断进步。C语言运行时库也根据单线程、多线程、静态链接、动态链接，是否需要debug信息的不同，分为不同的版本。在微软是MSVC CRT实现中，具体是按照表格中的实现来分类的（从VS2003 MSDN中摘录）。其中，静态链接有单线程和多线程版本，动态链接仅有多线程版本。&lt;/p&gt;&lt;table style="width: 743px; height: 256px;" frame="border" border="1" cellpadding="2" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="background-color: #b6b6b6;"&gt;C run-time library (without iostream or standard C++ library)&lt;/td&gt;&lt;td style="background-color: #b6b6b6;"&gt;Characteristics&lt;/td&gt;&lt;td style="background-color: #b6b6b6;"&gt;Option         &lt;br /&gt;（编译选项）&lt;/td&gt;&lt;td style="background-color: #b6b6b6;"&gt;Preprocessor directives（预编译宏）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="220"&gt;LIBC.LIB&lt;/td&gt;&lt;td valign="top" width="245"&gt;Single-threaded, static link&lt;/td&gt;&lt;td valign="top" width="90"&gt;/ML&lt;/td&gt;&lt;td valign="top" width="186"&gt;不带任何宏&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="220"&gt;LIBCMT.LIB&lt;/td&gt;&lt;td valign="top" width="245"&gt;Multithreaded, static link&lt;/td&gt;&lt;td valign="top" width="90"&gt;/MT&lt;/td&gt;&lt;td valign="top" width="186"&gt;_MT&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="220"&gt;MSVCRT.LIB&lt;/td&gt;&lt;td valign="top" width="245"&gt;Multithreaded, dynamic link (import library for MSVCR71.DLL). Be aware that if you use the Standard C++ Library, your program will need MSVCP71.DLL to run.&lt;/td&gt;&lt;td valign="top" width="90"&gt;/MD&lt;/td&gt;&lt;td valign="top" width="186"&gt;&lt;p&gt;_MT, _DLL&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="220"&gt;LIBCD.LIB&lt;/td&gt;&lt;td valign="top" width="245"&gt;Single-threaded, static link (debug)&lt;/td&gt;&lt;td valign="top" width="90"&gt;&lt;p&gt;&lt;b&gt;/MLd&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="186"&gt;_DEBUG&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="220"&gt;LIBCMTD.LIB&lt;/td&gt;&lt;td valign="top" width="245"&gt;Multithreaded, static link (debug)&lt;/td&gt;&lt;td valign="top" width="90"&gt;&lt;p&gt;&lt;b&gt;/MTd&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="186"&gt;_DEBUG, _MT&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="220"&gt;MSVCRTD.LIB&lt;/td&gt;&lt;td valign="top" width="245"&gt;&lt;p&gt;Multithreaded, dynamic link (import library for MSVCR71D.DLL) (debug)&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="90"&gt;&lt;p&gt;&lt;b&gt;/MDd&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="186"&gt;&lt;p&gt;&lt;b&gt;&lt;/b&gt;_DEBUG, _MT, _DLL&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;这里要提及一下的是VS2003之后，也就是VS2005版本中，LIBC.LIB是不会出现了。下面这段说明是从VS2005的CRT说明页面中摘下来的。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;&lt;img alt="Note" src="http://i.msdn.microsoft.com/Hash/030c41d9079671d09a62d8e2c1db6973.gif" /&gt;Note &lt;/p&gt;&lt;p&gt;The single-threaded CRT (libc.lib, libcd.lib) (formerly the &lt;b&gt;/ML&lt;/b&gt; or &lt;b&gt;/MLd&lt;/b&gt; options) is no longer available. Instead, use the multithreaded CRT. See &lt;a href="http://msdn.microsoft.com/en-us/library/ms235505%28v=VS.80%29.aspx"&gt;Multithreaded Libraries Performance&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;所以，VC6中很多代码，直接在VS2005中编译是会有找不到libc.lib这个错误报出来的，而VS2003则没有这个问题。这个问题的原因大家应该很清楚了。至于解决方法，在网上找到的文章一般都会让你忽略掉这个库编译，然后结果有的是编译通过了，有的还是不行，其中涉及到的知识就是这些了，也可以通过这些了解到为什么可以或为什么不行。（具体例子暂时没有，如果有童鞋有，可以在这里加上具体的例子，能更好的说明问题）&lt;/p&gt;&lt;p&gt;同时，细心的童鞋可以发现，VS2005中增加了对CLR的支持，按照我的理解，应该是对Managed C++的支持而使用的（具体没有研究过，如果有错误，请指正）&lt;/p&gt;&lt;p&gt;CRT的作用，因为篇幅和时间的原因，就要再找时间研究和另发一篇了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff8000;" color="#ff8000"&gt;使用link链接CRT&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;前面我们的obj文件中就包含有default lib，那如果我们的obj文件中不包含该信息呢？&lt;/p&gt;&lt;p&gt;首先，我们需要生成一个不包含default lib信息的obj文件。&lt;/p&gt;&lt;p&gt;这里有两种方法，一种是生成ASM文件，然后利用ml来生成一个obj文件，其中不包含该信息（当然ml也会主动调用link，这里也需要使用选项来控制，具体有兴趣的童鞋可以自行研究，因为这里主要还是C/C++编程为主，汇编会涉及，但是不会深入）；还有一种方法是利用cl的/Zl选项，这里要注意的是l是小写的L而不是I，我一开始就是看错了，结果编译出来还是带有default lib信息的。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;cl &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;c &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;Zl hello.c&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;之后利用dumpbin来查看一下是否生成正确。然后再调用link看看。&lt;p&gt;结果如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #000000;"&gt;d:\test&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;dumpbin &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;DIRECTIVES hello.obj&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;Microsoft (R) COFF Binary File Dumper Version &lt;/span&gt;&lt;span style="color: #000000;"&gt;6.00&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;8168&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;Copyright (C) Microsoft Corp &lt;/span&gt;&lt;span style="color: #000000;"&gt;1992&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;1998&lt;/span&gt;&lt;span style="color: #000000;"&gt;. All rights reserved.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;Dump of file hello.obj&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;File Type: COFF OBJECT&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;  Summary&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;           A .data&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #000000;"&gt;          &lt;/span&gt;&lt;span style="color: #000000;"&gt;14&lt;/span&gt;&lt;span style="color: #000000;"&gt; .text&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #000000;"&gt;d:\test&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;link hello.obj&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;span style="color: #000000;"&gt;Microsoft (R) Incremental Linker Version &lt;/span&gt;&lt;span style="color: #000000;"&gt;6.00&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;8168&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt; &lt;span style="color: #000000;"&gt;Copyright (C) Microsoft Corp &lt;/span&gt;&lt;span style="color: #000000;"&gt;1992&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;1998&lt;/span&gt;&lt;span style="color: #000000;"&gt;. All rights reserved.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; &lt;span style="color: #000000;"&gt;hello.obj : error LNK2001: unresolved external symbol _printf&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt; &lt;span style="color: #000000;"&gt;LINK : error LNK2001: unresolved external symbol _mainCRTStartup&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt; &lt;span style="color: #000000;"&gt;hello.exe : fatal error LNK1120: &lt;/span&gt;&lt;span style="color: #000000;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt; unresolved externals&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;现在就找不到_printf和_mainCRTStartup这两个符号了。&lt;p&gt;之后使用link hello.obj libc.lib看看。&lt;/p&gt;&lt;p&gt;成功生成hello.exe！&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt; &lt;span style="color: #000000;"&gt;d:\test&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;link hello.obj libc.lib&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt; &lt;span style="color: #000000;"&gt;Microsoft (R) Incremental Linker Version &lt;/span&gt;&lt;span style="color: #000000;"&gt;6.00&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;8168&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt; &lt;span style="color: #000000;"&gt;Copyright (C) Microsoft Corp &lt;/span&gt;&lt;span style="color: #000000;"&gt;1992&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;1998&lt;/span&gt;&lt;span style="color: #000000;"&gt;. All rights reserved.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;4&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;5&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;6&lt;/span&gt; &lt;span style="color: #000000;"&gt;d:\test&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;hello.exe&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;7&lt;/span&gt; &lt;span style="color: #000000;"&gt;abcdefg.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;到这里，回过头看看，上一篇的问题有哪些是可以解决了，哪些还没有，但是有思路了的。还有没有新的问题？&lt;/p&gt;&lt;p&gt;&lt;span style="color: #804000; font-size: medium;" size="4" color="#804000"&gt;&lt;strong&gt;总结&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff8000;" color="#ff8000"&gt;&lt;strong&gt;使用到的工具&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;CL.EXE &lt;/li&gt;&lt;li&gt;LINK.EXE &lt;/li&gt;&lt;li&gt;ML.EXE &lt;/li&gt;&lt;li&gt;DUMPBIN.EXE &lt;/li&gt;&lt;li&gt;WINHEX &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="color: #ff8000;" color="#ff8000"&gt;&lt;strong&gt;整个C程序编译过程, MSVC和GCC对比&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;table style="width: 686px;" border="1" cellpadding="2" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="background-color: #b6b6b6;"&gt;过程描述&lt;/td&gt;&lt;td style="background-color: #b6b6b6;"&gt;具体行为 &lt;/td&gt;&lt;td style="background-color: #b6b6b6;"&gt;MSVC&lt;/td&gt;&lt;td style="background-color: #b6b6b6;"&gt;GCC&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="100"&gt;&lt;strong&gt;预编译过程&lt;/strong&gt;&lt;/td&gt;&lt;td valign="top" width="229"&gt;将宏进行展开，形成预编译文件&lt;/td&gt;&lt;td valign="top" width="171"&gt;cl /E hello.c &amp;gt;hello.i&lt;/td&gt;&lt;td valign="top" width="184"&gt;gcc &amp;ndash;E hello.c &amp;ndash;o hello.i （调用预编译编译程序cc1）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="100"&gt;&lt;strong&gt;编译过程&lt;/strong&gt;&lt;/td&gt;&lt;td valign="top" width="229"&gt; 生成汇编代码文件&lt;/td&gt;&lt;td valign="top" width="171"&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;只找到生成汇编代码文件和COD文件的方法，但不清楚如何通过.i文件来生成.asm文件&lt;/span&gt;&lt;/td&gt;&lt;td valign="top" width="184"&gt;gcc &amp;ndash;S hello.i &amp;ndash;o hello.s         &lt;br /&gt;（同样也是cc1完成该过程）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="100"&gt;&lt;strong&gt;汇编过程&lt;/strong&gt;&lt;/td&gt;&lt;td valign="top" width="229"&gt; 从汇编代码生成目标文件&lt;/td&gt;&lt;td valign="top" width="171"&gt;&lt;span style="color: #ff0000;" color="#ff0000"&gt;不清楚如何通过.asm文件生成.obj文件（不使用MASM）&lt;/span&gt;&lt;/td&gt;&lt;td valign="top" width="184"&gt;gcc &amp;ndash;c hello.s &amp;ndash;o hello.o         &lt;br /&gt;或as hello.s &amp;ndash;o hello.o          &lt;br /&gt;（汇编器as完成该过程）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="100"&gt;&lt;strong&gt;链接过程&lt;/strong&gt;&lt;/td&gt;&lt;td valign="top" width="229"&gt; 从目标文件生成可执行文件&lt;/td&gt;&lt;td valign="top" width="171"&gt;cl hello.c&lt;/td&gt;&lt;td valign="top" width="184"&gt;ld &amp;ndash;static crt1.o crti.o crtbeginT.o hello.o &amp;ndash;start &amp;ndash;group &amp;ndash;lgcc &amp;ndash;lgcc_en &amp;ndash;lc-end-group crtend.o crtn.o         &lt;br /&gt;（链接器ld完成该过程）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;span style="color: #ff8000;" color="#ff8000"&gt;&lt;strong&gt;VC文件后缀名&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;table style="width: 685px;" border="1" cellpadding="2" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="background-color: #b6b6b6;"&gt;后缀名&lt;/td&gt;&lt;td style="background-color: #b6b6b6;"&gt;解释&lt;/td&gt;&lt;td style="background-color: #b6b6b6;"&gt;如何得到&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="133"&gt;ASM&lt;/td&gt;&lt;td valign="top" width="367"&gt;汇编文件&lt;/td&gt;&lt;td valign="top" width="183"&gt;cl /FAs /c hello.c&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="133"&gt;COD&lt;/td&gt;&lt;td valign="top" width="367"&gt;Assembly With Machine Code生成机器代码和汇编代码文件&lt;/td&gt;&lt;td valign="top" width="183"&gt;cl /FAsc /c hello.c&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="133"&gt;I&lt;/td&gt;&lt;td valign="top" width="367"&gt;预编译处理后的文件&lt;/td&gt;&lt;td valign="top" width="183"&gt;cl /P hello.c&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="133"&gt;OBJ&lt;/td&gt;&lt;td valign="top" width="367"&gt;目标文件&lt;/td&gt;&lt;td valign="top" width="183"&gt;cl /c hello.c&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="133"&gt;EXE&lt;/td&gt;&lt;td valign="top" width="367"&gt;可执行文件&lt;/td&gt;&lt;td valign="top" width="183"&gt;cl hello.c&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;参考：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/abx4dbyh(v=VS.71).aspx" href="http://msdn.microsoft.com/en-us/library/abx4dbyh(v=VS.71).aspx"&gt;http://msdn.microsoft.com/en-us/library/abx4dbyh(v=VS.71).aspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/abx4dbyh(v=VS.80).aspx" href="http://msdn.microsoft.com/en-us/library/abx4dbyh(v=VS.80).aspx"&gt;http://msdn.microsoft.com/en-us/library/abx4dbyh(v=VS.80).aspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="http://en.wikipedia.org/wiki/C_Run-Time_Library#Common_support_libraries" href="http://en.wikipedia.org/wiki/C_Run-Time_Library#Common_support_libraries"&gt;http://en.wikipedia.org/wiki/C_Run-Time_Library#Common_support_libraries&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="http://en.wikipedia.org/wiki/Runtime_library" href="http://en.wikipedia.org/wiki/Runtime_library"&gt;http://en.wikipedia.org/wiki/Runtime_library&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/f1tbxcxh(v=VS.71).aspx" href="http://msdn.microsoft.com/en-us/library/f1tbxcxh(v=VS.71).aspx"&gt;http://msdn.microsoft.com/en-us/library/f1tbxcxh(v=VS.71).aspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="http://www.woyouxian.net/c/c_overview_index.html" href="http://www.woyouxian.net/c/c_overview_index.html"&gt;http://www.woyouxian.net/c/c_overview_index.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="http://www.cnblogs.com/taoxu0903/archive/2008/06/30/1232712.html" href="http://www.cnblogs.com/taoxu0903/archive/2008/06/30/1232712.html"&gt;http://www.cnblogs.com/taoxu0903/archive/2008/06/30/1232712.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="http://msdn.microsoft.com/zh-tw/library/y0zzbyt4.aspx" href="http://msdn.microsoft.com/zh-tw/library/y0zzbyt4.aspx"&gt;http://msdn.microsoft.com/zh-tw/library/y0zzbyt4.aspx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="http://www.systemshell.org/viewthread.php?tid=256&amp;amp;sid=9wJZAqso" href="http://www.systemshell.org/viewthread.php?tid=256&amp;amp;sid=9wJZAqso"&gt;http://www.systemshell.org/viewthread.php?tid=256&amp;amp;sid=9wJZAqso&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a title="http://hi.baidu.com/li_nemo/blog/item/4ad4b2f26562d8df0b46e0fd.html" href="http://hi.baidu.com/li_nemo/blog/item/4ad4b2f26562d8df0b46e0fd.html"&gt;http://hi.baidu.com/li_nemo/blog/item/4ad4b2f26562d8df0b46e0fd.html&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;img src="http://www.cnblogs.com/cnyao/aggbug/2077600.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cnyao/archive/2011/06/10/win32sdkp3_helloc.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cnyao/archive/2011/06/08/win32sdkp2_envset.html</id><title type="text">从零开始，重新学习windows编程(2)--环境准备，不用IDE编写程序</title><summary type="text">既然是求甚解，那就要脱离掉IDE，保证每个字符都是经过思考产生出来的，其实我们脱离掉IDE环境，更能够了解到每一步的执行是怎么样的，IDE到底在你选择项目、创建项目的时候为了做了哪些事情，还有一个好处就是，当你想写一个小的测试程序的时候，你就不用打开VC，而直接用文本编辑器编写好，直接在命令行中编译运行就可以看到结果了，节约了不少时间。下面，我们就来看看怎么做才可以脱离IDE工作。1. 在VC6安装好的前提下，win+R，输入cmd，在出现的命令行窗口中试下"nmake"命令，如果能执行该命令，那就可以进行下面的操作，否则需要按照步骤2中的操作设置环境变量。如果学习过jav</summary><published>2011-06-08T06:00:00Z</published><updated>2011-06-08T06:00:00Z</updated><author><name>cnyao</name><uri>http://www.cnblogs.com/cnyao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cnyao/archive/2011/06/08/win32sdkp2_envset.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cnyao/archive/2011/06/08/win32sdkp2_envset.html"/><content type="html">&lt;p&gt;既然是求甚解，那就要脱离掉IDE，保证每个字符都是经过思考产生出来的，其实我们脱离掉IDE环境，更能够了解到每一步的执行是怎么样的，IDE到底在你选择项目、创建项目的时候为了做了哪些事情，还有一个好处就是，当你想写一个小的测试程序的时候，你就不用打开VC，而直接用文本编辑器编写好，直接在命令行中编译运行就可以看到结果了，节约了不少时间。&lt;/p&gt;&lt;p&gt;下面，我们就来看看怎么做才可以脱离IDE工作。&lt;/p&gt;&lt;p&gt;1. 在VC6安装好的前提下，win+R，输入cmd，在出现的命令行窗口中试下"nmake"命令，如果能执行该命令，那就可以进行下面的操作，否则需要按照步骤2中的操作设置环境变量。如果学习过java的同学，或者使用过linux的同学，应该对这个很熟悉。&lt;/p&gt;&lt;p&gt;2. 在cmd环境下，可以使用echo %path%命令，来显示一下现在系统中的环境变量路径。或者，右键点击&amp;ldquo;我的电脑&amp;rdquo;，在出现的&amp;ldquo;属性&amp;rdquo;对话框中，选择&amp;ldquo;Advanced&amp;rdquo;Tab页，在&amp;ldquo;Environment Variables&amp;rdquo;中，&amp;ldquo;用户环境变量&amp;rdquo;里面找到&amp;ldquo;path&amp;rdquo;，点击修改。&lt;/p&gt;&lt;p&gt;3. 找到你电脑中nmake.exe所在的地方，我电脑中为&amp;ldquo;d:\Program Files\Microsoft Visual Studio\VC98\Bin\NMAKE.EXE&amp;rdquo;，就将&amp;ldquo;d:\Program Files\Microsoft Visual Studio\VC98\Bin\"这个路径加入到path中，因为有可能大家电脑的环境变量中还有Platform SDK和其他版本VS的路径，所以希望使用哪个，就将哪个放到最前面。&lt;br /&gt;在这个目录下，你还可以看到有其他的exe程序，有些我们之后也会使用到，比如CL.EXE和LINK.EXE，还有一个VCVARS32.BAT之后我们也会稍微介绍一下，当添加了这个路径到环境变量之后，所有该路径下的exe就都可以使用了。&lt;/p&gt;&lt;p&gt;4. 设置完成后，重新开启一个cmd，使用echo %path%命令查看刚刚的路径是否添加上去了，是否是在最前。&lt;br /&gt;再进行步骤1的操作，看看是否可以执行nmake命令。&lt;br /&gt;最终得到的结果为：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt; &lt;span style="color: #000000;"&gt;D:&lt;/span&gt;&lt;span style="color: #000000;"&gt;\&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;nmake&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt; &lt;span style="color: #000000;"&gt;Microsoft &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;R&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt; Program Maintenance Utility   Version &lt;/span&gt;&lt;span style="color: #000000;"&gt;6.00&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;8168.0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;4&lt;/span&gt; &lt;span style="color: #000000;"&gt;Copyright &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;C&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt; Microsoft Corp &lt;/span&gt;&lt;span style="color: #000000;"&gt;1988&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;1998&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt; All rights reserved&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;5&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;6&lt;/span&gt; &lt;span style="color: #000000;"&gt;NMAKE : fatal error U1064: MAKEFILE &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;not&lt;/span&gt;&lt;span style="color: #000000;"&gt; found and no target specified&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;7&lt;/span&gt; &lt;span style="color: #000000;"&gt;Stop&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;5. 当设置完NMAKE.EXE成功后，你可以试着执行一下CL.EXE命令，如果报出一个找不到mspdb60.dll，不用慌张，那是因为还有一个路径没有设置。&lt;br /&gt;在电脑中寻找mspdb60.dll文件，我的电脑中路径为&amp;ldquo;d:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\MSPDB60.DLL&amp;rdquo;，从路径名称可以看到，这应该是属于Dev环境的一个公共文件，这里我们不管它具体的，直接将路径&amp;ldquo;d:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\"加入path中，刚刚加入的路径之后，两个路径之间记得用英文字符的分号（;）分隔开来。&lt;/p&gt;&lt;p&gt;6. 同样，设置path，重启cmd窗口，echo查看下设置是否成功，然后执行cl，link命令。&lt;br /&gt;结果如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt; &lt;span style="color: #000000;"&gt;D:&lt;/span&gt;&lt;span style="color: #000000;"&gt;\&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;cl&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt; &lt;span style="color: #000000;"&gt;Microsoft &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;R&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;32&lt;/span&gt;&lt;span style="color: #000000;"&gt;-bit C&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;C&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt; Optimizing Compiler Version &lt;/span&gt;&lt;span style="color: #000000;"&gt;12.00&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;8168&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; 8&lt;/span&gt;&lt;span style="color: #000000;"&gt;0x86&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt; &lt;span style="color: #000000;"&gt;Copyright &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;C&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt; Microsoft Corp &lt;/span&gt;&lt;span style="color: #000000;"&gt;1984&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;1998&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt; All rights reserved&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;4&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;5&lt;/span&gt; &lt;span style="color: #000000;"&gt;usage: cl [ option&lt;/span&gt;&lt;span style="color: #000000;"&gt;...&lt;/span&gt;&lt;span style="color: #000000;"&gt; ] filename&lt;/span&gt;&lt;span style="color: #000000;"&gt;...&lt;/span&gt;&lt;span style="color: #000000;"&gt; [ &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;link linkoption&lt;/span&gt;&lt;span style="color: #000000;"&gt;...&lt;/span&gt;&lt;span style="color: #000000;"&gt; ]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('ec8931e9-c193-4252-a500-f96b24014868')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_ec8931e9-c193-4252-a500-f96b24014868" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_ec8931e9-c193-4252-a500-f96b24014868" onclick="cnblogs_code_hide('ec8931e9-c193-4252-a500-f96b24014868',event)" style="display: none;" /&gt;&lt;div id="cnblogs_code_open_ec8931e9-c193-4252-a500-f96b24014868" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #000000;"&gt;D:&lt;/span&gt;&lt;span style="color: #000000;"&gt;\&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;link&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;Microsoft &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;R&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt; Incremental Linker Version &lt;/span&gt;&lt;span style="color: #000000;"&gt;6.00&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;8168&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;Copyright &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;C&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt; Microsoft Corp &lt;/span&gt;&lt;span style="color: #000000;"&gt;1992&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;1998&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt; All rights reserved&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;usage: LINK [options] [&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;files&lt;/span&gt;&lt;span style="color: #000000;"&gt;] [@commandfile]&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;   options:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;ALIGN:&lt;/span&gt;&lt;span style="color: #000000;"&gt;#&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;BASE:{address|@filename&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;key}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;COMMENT&lt;/span&gt;&lt;span style="color: #800000;"&gt;:comment&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;DEBUG&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;DEBUGTYPE:{CV|COFF}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;DEF&lt;/span&gt;&lt;span style="color: #800000;"&gt;:filename&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;DEFAULTLIB&lt;/span&gt;&lt;span style="color: #800000;"&gt;:library&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;DELAY:{NOBIND|UNLOAD}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;DELAYLOAD&lt;/span&gt;&lt;span style="color: #800000;"&gt;:dll&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;DLL&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;DRIVER[:{UPONLY|WDM}]&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;ENTRY&lt;/span&gt;&lt;span style="color: #800000;"&gt;:symbol&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;EXETYPE&lt;/span&gt;&lt;span style="color: #800000;"&gt;:DYNAMIC&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;EXPORT&lt;/span&gt;&lt;span style="color: #800000;"&gt;:symbol&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;FIXED[&lt;/span&gt;&lt;span style="color: #800000;"&gt;:NO&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;FORCE[:{MULTIPLE|UNRESOLVED}]&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;GPSIZE:&lt;/span&gt;&lt;span style="color: #000000;"&gt;#&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;HEAP&lt;/span&gt;&lt;span style="color: #800000;"&gt;:reserve&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;commit]&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;IMPLIB&lt;/span&gt;&lt;span style="color: #800000;"&gt;:filename&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;INCLUDE&lt;/span&gt;&lt;span style="color: #800000;"&gt;:symbol&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;INCREMENTAL:{YES|NO}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;LARGEADDRESSAWARE[&lt;/span&gt;&lt;span style="color: #800000;"&gt;:NO&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;LIBPATH&lt;/span&gt;&lt;span style="color: #800000;"&gt;:dir&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;32&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;LINK50COMPAT&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;33&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;MACHINE:{ALPHA|ARM|IX86|MIPS|MIPS16|MIPSR41XX|PPC|SH3|SH4}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;34&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;MAP[&lt;/span&gt;&lt;span style="color: #800000;"&gt;:filename&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;35&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;MAPINFO:{EXPORTS|FIXUPS|LINES}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;36&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;MERGE&lt;/span&gt;&lt;span style="color: #800000;"&gt;:from&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;to&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;37&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;NODEFAULTLIB[&lt;/span&gt;&lt;span style="color: #800000;"&gt;:library&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;38&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;NOENTRY&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;39&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;NOLOGO&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;40&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;OPT:{ICF[&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;iterations]|NOICF|NOREF|NOWIN98|REF|WIN98}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;41&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;ORDER:@filename&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;42&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;OUT&lt;/span&gt;&lt;span style="color: #800000;"&gt;:filename&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;43&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;PDB:{filename|NONE}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;44&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;PDBTYPE:{CON[SOLIDATE]|SEPT[YPES]}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;45&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;PROFILE&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;46&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;RELEASE&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;47&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;SECTION&lt;/span&gt;&lt;span style="color: #800000;"&gt;:name&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;[E][R][W][S][D][K][L][P][X]&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;48&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;STACK&lt;/span&gt;&lt;span style="color: #800000;"&gt;:reserve&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #000000;"&gt;commit]&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;49&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;STUB&lt;/span&gt;&lt;span style="color: #800000;"&gt;:filename&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;50&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;SUBSYSTEM:{NATIVE|WINDOWS|CONSOLE|WINDOWSCE|POSIX}[&lt;/span&gt;&lt;span style="color: #000000;"&gt;,#&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #000000;"&gt;.##&lt;/span&gt;&lt;span style="color: #000000;"&gt;]]&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;51&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;SWAPRUN:{&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;CD&lt;/span&gt;&lt;span style="color: #000000;"&gt;|&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;NET&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;52&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;VERBOSE[&lt;/span&gt;&lt;span style="color: #800000;"&gt;:LIB&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;53&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;VERSION:&lt;/span&gt;&lt;span style="color: #000000;"&gt;#&lt;/span&gt;&lt;span style="color: #000000;"&gt;[&lt;/span&gt;&lt;span style="color: #000000;"&gt;.#&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;54&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;VXD&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;55&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;WARN[&lt;/span&gt;&lt;span style="color: #800000;"&gt;:warninglevel&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;56&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;WINDOWSCE:{CONVERT|EMULATION}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;57&lt;/span&gt; &lt;span style="color: #000000;"&gt;      &lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;WS&lt;/span&gt;&lt;span style="color: #800000;"&gt;:AGGRESSIVE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;到这里，我们的环境设置算是完成了一半，下面还有一半是设置库和头文件，首先来看看库和头文件不设置会出现什么情况。&lt;/p&gt;&lt;p&gt;这里做个小例子，照旧例，还是hello world.&lt;br /&gt;&lt;br /&gt;随便进入某个目录，创建一个hello.c&lt;br /&gt;内容很简单，printf一串字符吧。&lt;br /&gt;&lt;br /&gt;用你最喜爱的文本编辑器写下下面的代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt; &lt;span style="color: #000000;"&gt;#include &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;stdio.h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; main()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;4&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;5&lt;/span&gt; &lt;span style="color: #000000;"&gt;    printf(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;abcdefg.\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;6&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;7&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;然后进入命令行，在命令行中进入代码所在的目录，我这里是d:\test&lt;br /&gt;全部执行过程如下：&lt;/p&gt;&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt; &lt;span style="color: #000000;"&gt;d:&lt;/span&gt;&lt;span style="color: #000000;"&gt;\&lt;/span&gt;&lt;span style="color: #000000;"&gt;test&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;cl hello&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;c&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt; &lt;span style="color: #000000;"&gt;Microsoft &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;R&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;32&lt;/span&gt;&lt;span style="color: #000000;"&gt;-bit C&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;C&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt; Optimizing Compiler Version &lt;/span&gt;&lt;span style="color: #000000;"&gt;12.00&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;8168&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; 8&lt;/span&gt;&lt;span style="color: #000000;"&gt;0x86&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt; &lt;span style="color: #000000;"&gt;Copyright &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;C&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt; Microsoft Corp &lt;/span&gt;&lt;span style="color: #000000;"&gt;1984&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;1998&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt; All rights reserved&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;4&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;5&lt;/span&gt; &lt;span style="color: #000000;"&gt;hello&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;c&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;6&lt;/span&gt; &lt;span style="color: #000000;"&gt;hello&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;c&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt; : fatal error C1083: Cannot open include file: 'stdio&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;h': No such fil&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;7&lt;/span&gt; &lt;span style="color: #000000;"&gt;e or directory&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;&lt;p&gt;可以发现没有找到stdio.h，这里在环境变量中还要设置一个头文件的目录。&lt;/p&gt;&lt;p&gt;同样在&amp;ldquo;用户变量&amp;rdquo;中查找，找名字为"include"的环境变量是否存在，不存在则新建一个，然后找到你电脑中"stdio.h"所在的路径，我的为&amp;ldquo;d:\Program Files\Microsoft Visual Studio\VC98\Include\&amp;rdquo;，将其放到include环境变量对应的value中。&lt;/p&gt;&lt;p&gt;再进行编译&lt;/p&gt;&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #000000;"&gt;d:&lt;/span&gt;&lt;span style="color: #000000;"&gt;\&lt;/span&gt;&lt;span style="color: #000000;"&gt;test&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;cl hello&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;c&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;Microsoft &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;R&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;32&lt;/span&gt;&lt;span style="color: #000000;"&gt;-bit C&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;C&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt; Optimizing Compiler Version &lt;/span&gt;&lt;span style="color: #000000;"&gt;12.00&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;8168&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; 8&lt;/span&gt;&lt;span style="color: #000000;"&gt;0x86&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;Copyright &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;C&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt; Microsoft Corp &lt;/span&gt;&lt;span style="color: #000000;"&gt;1984&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;1998&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt; All rights reserved&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;hello&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;c&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;Microsoft &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;R&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt; Incremental Linker Version &lt;/span&gt;&lt;span style="color: #000000;"&gt;6.00&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;8168&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;Copyright &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;C&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt; Microsoft Corp &lt;/span&gt;&lt;span style="color: #000000;"&gt;1992&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;1998&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt; All rights reserved&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;out&lt;/span&gt;&lt;span style="color: #800000;"&gt;:hello&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;exe&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;hello&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;obj&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;LINK : fatal error LNK1104: cannot open file &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;LIBC.lib&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;结果出现找不到LIBC.lib错误，关于LIBC.lib，在之后的篇章里面会详细介绍到。我们还是要将其放到环境变量中，同include环境变量，我们同样加上lib这个环境变量在&amp;ldquo;用户变量&amp;rdquo;中，对应的值为你找到的LIBC.lib所在的目录，我这里为&amp;ldquo;D:\Program Files\Microsoft Visual Studio\VC98\lib&amp;rdquo;，然后再试一把。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #000000;"&gt;D:&lt;/span&gt;&lt;span style="color: #000000;"&gt;\&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;cd&lt;/span&gt;&lt;span style="color: #000000;"&gt; test&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;span style="color: #000000;"&gt;D:&lt;/span&gt;&lt;span style="color: #000000;"&gt;\&lt;/span&gt;&lt;span style="color: #000000;"&gt;test&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;cl hello&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;c&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #000000;"&gt;Microsoft &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;R&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;32&lt;/span&gt;&lt;span style="color: #000000;"&gt;-bit C&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;C&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt; Optimizing Compiler Version &lt;/span&gt;&lt;span style="color: #000000;"&gt;12.00&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;8168&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; 8&lt;/span&gt;&lt;span style="color: #000000;"&gt;0x86&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #000000;"&gt;Copyright &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;C&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt; Microsoft Corp &lt;/span&gt;&lt;span style="color: #000000;"&gt;1984&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;1998&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt; All rights reserved&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #000000;"&gt;hello&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;c&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #000000;"&gt;Microsoft &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;R&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt; Incremental Linker Version &lt;/span&gt;&lt;span style="color: #000000;"&gt;6.00&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;8168&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #000000;"&gt;Copyright &lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;C&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt; Microsoft Corp &lt;/span&gt;&lt;span style="color: #000000;"&gt;1992&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;1998&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt; All rights reserved&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;out&lt;/span&gt;&lt;span style="color: #800000;"&gt;:hello&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;exe&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt; &lt;span style="color: #000000;"&gt;hello&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;obj&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt; &lt;span style="color: #000000;"&gt;D:&lt;/span&gt;&lt;span style="color: #000000;"&gt;\&lt;/span&gt;&lt;span style="color: #000000;"&gt;test&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;hello&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #000000;"&gt;exe&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt; &lt;span style="color: #000000;"&gt;abcdefg&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;大功告成，可以看到cl hello.c就编译出来了hello.exe，执行hello.exe得到输出。 So easy是不是？&lt;/p&gt;&lt;p&gt;这样你就掌握到如何在命令行中编译win32 console Application了，至于其他类型的Application，就需要不同的编译、链接设置以及不同的头文件、库设置而得到，但是基本原理是差不多的。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;But这里提几个问题，看看你能不能回答出来。&lt;/p&gt;&lt;p&gt;1. 这里是hello.c，如果是hello.cpp，cl的行为有没有不同？&lt;/p&gt;&lt;p&gt;2. 如果是两个或多个文件，那使用cl是否可以直接编译出来exe文件？&lt;/p&gt;&lt;p&gt;3. 将入口修改为void main()是否可以，或者void start()呢？&lt;/p&gt;&lt;p&gt;4. stdio.h大家都知道是C的标准库内容，windows是如何将它合入到系统中去的呢？&lt;/p&gt;&lt;p&gt;5. 同样，stdio.h只是头文件，而具体函数实现是在lib库中，windows又是如何将其合到exe文件中的呢？&lt;/p&gt;&lt;p&gt;6. 刚刚我们打印的是英文字符，那如果我们要打入中文"你好，世界"，结果会怎样，到底是为什么呢？&lt;br /&gt;&lt;br /&gt;这其实也是我的疑惑，也是下一篇文章要讨论的内容，暂定题为"hello.c的疑问"，我努力解答。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cnyao/aggbug/2075124.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cnyao/archive/2011/06/08/win32sdkp2_envset.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cnyao/archive/2011/06/07/win32sdkp1.html</id><title type="text">从零开始，重新学习windows编程(1)--开篇</title><summary type="text">考虑了很久，终于准备开始写这个文章，有可能会汇成一个系列，具体还是要看时间的安排，今年的事情很多，也比较的紧，不过通过具体的项目认识到自己的一些不足，在“补课”的过程中萌发了将研究的一些东西写出来的想法，希望大家批评指正。这篇文章属于基础类文章，也是对我知识的一个重新整理，以前都是写出程序来就完了，了解的东西也就是大概，凡事均为遇到问题解决问题，google、其他人的代码、MSDN、CSDN、cnblogs……轮着来，总是能够把问题解决掉的，不过长期下来，得到的都是知识片段，并不能形成一个系统的认识。于是决定，从我比较熟悉的VC，从零开始，把Windows的编程知识整理一下，至少能把一些知识的</summary><published>2011-06-07T04:41:00Z</published><updated>2011-06-07T04:41:00Z</updated><author><name>cnyao</name><uri>http://www.cnblogs.com/cnyao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cnyao/archive/2011/06/07/win32sdkp1.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cnyao/archive/2011/06/07/win32sdkp1.html"/><content type="html">&lt;p&gt;考虑了很久，终于准备开始写这个文章，有可能会汇成一个系列，具体还是要看时间的安排，今年的事情很多，也比较的紧，不过通过具体的项目认识到自己的一些不足，在&amp;ldquo;补课&amp;rdquo;的过程中萌发了将研究的一些东西写出来的想法，希望大家批评指正。&lt;/p&gt;&lt;p&gt;这篇文章属于基础类文章，也是对我知识的一个重新整理，以前都是写出程序来就完了，了解的东西也就是大概，凡事均为遇到问题解决问题，google、其他人的代码、MSDN、CSDN、cnblogs&amp;hellip;&amp;hellip;轮着来，总是能够把问题解决掉的，不过长期下来，得到的都是知识片段，并不能形成一个系统的认识。于是决定，从我比较熟悉的VC，从零开始，把Windows的编程知识整理一下，至少能把一些知识的片段慢慢的连贯起来。当然，VC仅仅是一个引子，之后有时间会慢慢整理关于其他语言，或者框架，&amp;ldquo;不积小流无以成沧海&amp;rdquo;，还是要从一点一滴的知识点出发，最终才能有所认识和超越。&lt;/p&gt;&lt;p&gt;目的说完，下面就是工具和过程。&lt;/p&gt;&lt;p&gt;工具，我主要使用VC6，如果需要使用到其他工具再慢慢进行添加，比如需要另外的Platform SDK，或者更新的Visual Studio系列如VS2003, VS2005, VS2008, VS2010&amp;hellip;&amp;hellip;又或者sysinternal的一些工具。不过现在，我们就来挖掘VC6。&lt;br /&gt;既然是基础，我们就不涉及到任何框架，无论是MFC，ATL，QT等，这里都不去研究，先把windows原生的SDK研究好，然后再去了解这些框架。&lt;br /&gt;其他，要研究Win32 SDK，那最重要的参考手册还是需要的，所以我们必须安装一个MSDN，当然，网络版的MSDN也可以，不过更喜欢本地的，如果你使用的机器上面除了VC6之外还安装了VS系列的其他版本，只需要一个MSDN就可以了，毕竟MSDN占用的空间也不小。&lt;/p&gt;&lt;p&gt;研究过程，首先了解windows的编程框架，VC6这个IDE编译链接的过程原理，一个简单的Win32程序的解析，其中使用到的API的详解，最后，会找一个简单的开源程序，来具体查看其是怎么使用Win32SDK编写的。其中还会穿插介绍一些相关的网站、书籍等。&lt;/p&gt;&lt;p&gt;基础(pre-condition)，对C语言的语法有了解，这里的了解并不是会写hello world，而是对于宏的应用，指针包括函数指针，typedef等有自己的认识，因为win32SDK中大量的使用了这些知识，而这些在文中只会一点而过。同时对编译、链接的过程有一定的了解，对于make也应该知道。其他，我们一起慢慢来学习吧！&lt;/p&gt;&lt;p&gt;大家有什么意见和建议，也可以提给我，我在研究的过程中，也会就这些知识点加深理解，这是一个艰苦的过程，不过也应该是充满收获的过程！&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cnyao/aggbug/2074221.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cnyao/archive/2011/06/07/win32sdkp1.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
