﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-woaidongmao-随笔分类-VC 存档</title><link>http://www.cppblog.com/woaidongmao/category/6006.html</link><description>文章均收录自他人博客，但不喜标题前加-[转贴]，因其丑陋，见谅！~</description><language>zh-cn</language><lastBuildDate>Fri, 12 Jun 2009 13:01:41 GMT</lastBuildDate><pubDate>Fri, 12 Jun 2009 13:01:41 GMT</pubDate><ttl>60</ttl><item><title>fatal error C1001: INTERNAL COMPILER ERROR</title><link>http://www.cppblog.com/woaidongmao/archive/2009/06/01/86426.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Mon, 01 Jun 2009 08:32:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/06/01/86426.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/86426.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/06/01/86426.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/86426.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/86426.html</trackback:ping><description><![CDATA[<p>1、HY Message Server工程的Global.cpp去掉stdafx.h的话就会出现这个错误，如果不去掉，就不会有。 <br>2、当使用自己的库源文件，如果功能使用了MFC支持，库文件没有加入#include &lt;afx.h&gt;也发生了这个问题。<br>3、需要打补丁SP5/6来解决这个bug.
<p>编译环境 VC6.0
<p>--------------------Configuration: HY Messaging Server - Win32 Debug--------------------<br>Compiling...<br>Global.cpp<br>c:\program files\microsoft visual studio\vc98\mfc\include\afx.h(556) : fatal error C1001: INTERNAL COMPILER ERROR<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (compiler file 'msc1.cpp', line 1786) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Please choose the Technical Support command on the Visual C++ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Help menu, or open the Technical Support help file for more information<br>Error executing cl.exe.
<p>Global.obj - 1 error(s), 0 warning(s) </p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/86426.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-06-01 16:32 <a href="http://www.cppblog.com/woaidongmao/archive/2009/06/01/86426.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC6.0配置的存档</title><link>http://www.cppblog.com/woaidongmao/archive/2009/05/04/81832.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Mon, 04 May 2009 07:36:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/05/04/81832.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/81832.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/05/04/81832.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/81832.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/81832.html</trackback:ping><description><![CDATA[<p>如果要保证过去的程序能够被编译，需要做到</p> <p>1、安装Windows Platform February SDK 2003 </p> <p>2、STLPORT路径正确</p> <p>3、正确的配置下面的Directroy</p> <p>&nbsp;</p> <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VC6.0_DAE5/image_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="391" alt="image" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VC6.0_DAE5/image_thumb.png" width="553" border="0"></a> </p> <p>&nbsp;</p> <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VC6.0_DAE5/image_4.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="391" alt="image" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VC6.0_DAE5/image_thumb_1.png" width="553" border="0"></a> </p> <p>&nbsp;</p> <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VC6.0_DAE5/image_6.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="391" alt="image" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VC6.0_DAE5/image_thumb_2.png" width="553" border="0"></a> </p> <p>&nbsp;</p> <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VC6.0_DAE5/image_8.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="391" alt="image" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VC6.0_DAE5/image_thumb_3.png" width="553" border="0"></a></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/81832.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-05-04 15:36 <a href="http://www.cppblog.com/woaidongmao/archive/2009/05/04/81832.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>符号文件&amp;mdash;&amp;mdash;Windows 应用程序调试必备</title><link>http://www.cppblog.com/woaidongmao/archive/2008/12/25/70306.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Thu, 25 Dec 2008 03:11:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/12/25/70306.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/70306.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/12/25/70306.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/70306.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/70306.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align="left"><b><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">一、何谓符号文件？</span></b><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><?xml:namespace prefix = o /><o:p></o:p></span></p> <p class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">　　符号文件（<span lang="EN-US">Symbol Files</span>）是一个数据信息文件，它包含了应用程序二进制文件（比如：<span lang="EN-US">EXE</span>、<span lang="EN-US">DLL</span>等）调试信息，专门用来作调试之用，最终生成的可执行文件在运行时并不需要这个符号文件，但你的程序中所有的变量信息都记录在这个文件中。所以调试应用程序时，这个文件是非常重要的。用<span lang="EN-US"> Visual C++ </span>和<span lang="EN-US"> WinDbg </span>调试程序时都要用到这个文件。<span lang="EN-US"><br></span>　　在<span lang="EN-US"> Windows </span>系统中，符号文件以<span lang="EN-US"> .pdb </span>为扩展名，比如：每个 <span lang="EN-US">Windows </span>操作系统下有一个<span lang="EN-US"> GDI32.dll </span>文件，编译器在编译该<span lang="EN-US"> DLL </span>的时候会产生一个<span lang="EN-US"> GDI32.pdb </span>文件，一旦你拥有了这个<span lang="EN-US"> PDB </span>文件，那么便可以用它来调试并跟踪到<span lang="EN-US"> GDI32.dll </span>内部。该文件和二进制文件的编译版本密切相关，比如修改了<span lang="EN-US"> DLL </span>的输出函数，再编译该<span lang="EN-US"> DLL</span>，那么原先的<span lang="EN-US"> PDB </span>文件就过时了，不能再用老的<span lang="EN-US"> PDB </span>文件来做调试工作<span lang="EN-US">,</span>而必须使用最新的<span lang="EN-US"> PDB </span>文件版本。<span lang="EN-US"><br></span>　　<span lang="EN-US">Visual C++ </span>编译代码后会在<span lang="EN-US"> Debug </span>或者<span lang="EN-US"> Release </span>目录下生成一个<span lang="EN-US"> PDB </span>文件。一般情况下，符号文件包括以下的数据信息：<span lang="EN-US"><o:p></o:p></span></span></p> <ol type="1"> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l6 level1 lfo1; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">全局变量（<span lang="EN-US">Global variables</span>）； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l6 level1 lfo1; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">局部变量（<span lang="EN-US">Local variables</span>）； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l6 level1 lfo1; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">函数名和它们的入口地址（<span lang="EN-US">Function names and the addresses of their entry points</span>）； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l6 level1 lfo1; tab-stops: list 36.0pt"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">FPO </span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">数据（<span lang="EN-US">Frame Pointer Omission)</span>：<span lang="EN-US">Frame Pointer </span>是一种用来在调用堆栈（<span lang="EN-US">Call stack</span>）中找到下一个将要被调用的函数的数据结构源代码的行序号（<span lang="EN-US">Source-line numbers</span>）； <span lang="EN-US"><o:p></o:p></span></span></li></ol> <p class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align="left"><b><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">二、如何得到和安装符号文件<span lang="EN-US">?</span></span></b><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><o:p></o:p></span></p> <ol type="1"> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l4 level1 lfo2; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">先确定你的操作系统（<span lang="EN-US">OS</span>）版本； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l4 level1 lfo2; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">到微软网站下载相应的符号文件； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l4 level1 lfo2; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">安装符号文件，对于符号文件的安装位置没有特贝要求，可以安装在任何目录中； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l4 level1 lfo2; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">设置环境变量，使得调试工具（比如：<span lang="EN-US">Visual C++</span>、<span lang="EN-US">WinDbg</span>、<span lang="EN-US">Ntsd</span>、<span lang="EN-US">DrWatson </span>等）能找到符号文件； <span lang="EN-US"><o:p></o:p></span></span></li></ol> <p class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">安装符号文件的注意事项：<span lang="EN-US"><br><br></span>　　如果是手动安装符号文件，有一点很重要，那就是宿主机（<span lang="EN-US">Hostt Computer</span>）上的符号文件必须与目标机器（<span lang="EN-US">Target Computer</span>）上的<span lang="EN-US"> Windows </span>版本相匹配。<span lang="EN-US"><br></span>　　这里所谓的宿主机指的是运行调试会话的机器，在典型的双系统调试会话环境中，宿主机可以是连接到目标机器的任何机器。目标机器指的是发生软件组件、系统服务、应用程序或操作系统运行失败的机器。也即是需要被调试的机器，它是调试会话关注的焦点。目标机器可以近在咫尺，也可以位于完全不同的地方。有时我们也将目标机器称之为<span lang="EN-US">——</span>被调试者（<span lang="EN-US">debuggee</span>），那么与之对应，宿主机则可以称为调试者（<span lang="EN-US">debugger</span>）。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align="left"><b><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">三、在<span lang="EN-US"> Visual C++ </span>使用符号文件的方法</span></b><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><o:p></o:p></span></p> <p class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在<span lang="EN-US"> Visual C++ 6.0 </span>中的使用方法：<span lang="EN-US"><o:p></o:p></span></span></p> <ol type="1"> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l5 level1 lfo3; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">打开<span lang="EN-US"> Visual C++ 6.0 </span>的<span lang="EN-US"> Workspace </span>文件（<span lang="EN-US">*.dsw</span>）； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l5 level1 lfo3; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">进入<span lang="EN-US"> Tools </span>菜单，选择<span lang="EN-US"> Options </span>菜单项<span lang="EN-US"> (Tools-&gt;Options)</span>； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l5 level1 lfo3; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">单击<span lang="EN-US"> Directoties </span>标签； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l5 level1 lfo3; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在<span lang="EN-US"> “Show directories for”</span>下拉列表中选择<span lang="EN-US"> “Executable files”</span>； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l5 level1 lfo3; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">将符号文件的路径添加到<span lang="EN-US"> “Directories” </span>路径列表中； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l5 level1 lfo3; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">单击<span lang="EN-US">&nbsp; OK </span>完成； <span lang="EN-US"><o:p></o:p></span></span></li></ol> <p class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在<span lang="EN-US"> Visual C++ .NET 2003 </span>中的使用方法：<span lang="EN-US"><o:p></o:p></span></span></p> <ol type="1"> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l0 level1 lfo4; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">打开<span lang="EN-US"> Visual C++ .NET </span>的项目文件（<span lang="EN-US">*.vcproj</span>）； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l0 level1 lfo4; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在解决方案管理器中选中要使用符号文件的项目； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l0 level1 lfo4; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">单击右键进入项目属性对话框； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l0 level1 lfo4; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">选择<span lang="EN-US">“</span>配置属性<span lang="EN-US">”</span>中的<span lang="EN-US">“</span>调试<span lang="EN-US">”</span>； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l0 level1 lfo4; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在与<span lang="EN-US">“</span>调试<span lang="EN-US">”</span>对应的<span lang="EN-US">“</span>操作<span lang="EN-US">”</span>选项中有一个<span lang="EN-US">“</span>符号路径<span lang="EN-US">”</span>，在此添加符号文件的路径即可； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l0 level1 lfo4; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">单击<span lang="EN-US">&nbsp; “</span>确定<span lang="EN-US">” </span>完成； <span lang="EN-US"><o:p></o:p></span></span></li></ol> <p class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align="left"><b><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">四、如何产生<span lang="EN-US"> Release </span>版本二进制文件对应的<span lang="EN-US"> PDB </span>文件<span lang="EN-US">?</span></span></b><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><o:p></o:p></span></p> <p class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在<span lang="EN-US"> Visual C++ 6.0 </span>中的方法：<span lang="EN-US"><o:p></o:p></span></span></p> <ol type="1"> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l2 level1 lfo5; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">打开<span lang="EN-US"> Visual C++ 6.0 </span>的<span lang="EN-US"> Workspace </span>文件（<span lang="EN-US">*.dsw</span>）； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l2 level1 lfo5; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">进入<span lang="EN-US"> Project </span>菜单，选择<span lang="EN-US"> Settings </span>菜单项<span lang="EN-US"> (Project-&gt;Settings)</span>，打开项目设置对话框； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l2 level1 lfo5; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在<span lang="EN-US"> “Settings for”</span>列表中选择项目的<span lang="EN-US"> Release </span>配置； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l2 level1 lfo5; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">单击<span lang="EN-US">“C/C++”</span>标签； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l2 level1 lfo5; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在<span lang="EN-US">“Category”</span>下拉列表框中选择<span lang="EN-US">“General”</span>选项； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l2 level1 lfo5; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在<span lang="EN-US">“Debug info”</span>下拉列表框中选择调试信息格式（具体选项参见图一），在此不必禁用任何优化选项； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l2 level1 lfo5; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">单击<span lang="EN-US">“Link”</span>标签； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l2 level1 lfo5; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在<span lang="EN-US">“Category”</span>下拉列表框中选择<span lang="EN-US">“Debug”</span>选项； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l2 level1 lfo5; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">选中<span lang="EN-US">“Debug info”</span>复选框，然后选择需要的链接调试类型（具体选项参见图一）； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l2 level1 lfo5; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">不要选择<span lang="EN-US">“Separate types”</span>复选框； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l2 level1 lfo5; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在<span lang="EN-US">“Project options”</span>编辑框的最后添加如下指令：<span lang="EN-US">/opt:ref,icf</span>； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l2 level1 lfo5; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">重新生成（<span lang="EN-US">Rebuild</span>）项目； <span lang="EN-US"><o:p></o:p></span></span></li></ol> <p class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在<span lang="EN-US"> Visual C++ .NET 2003 </span>中的方法：<span lang="EN-US"><o:p></o:p></span></span></p> <ol type="1"> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l1 level1 lfo6; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">打开<span lang="EN-US"> Visual C++ .NET </span>的项目文件（<span lang="EN-US">*.vcproj</span>）； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l1 level1 lfo6; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">进入<span lang="EN-US"> Project </span>菜单，选择<span lang="EN-US"> Settings </span>菜单项<span lang="EN-US"> (Project-&gt;Settings)</span>，打开项目设置对话框； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l1 level1 lfo6; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在<span lang="EN-US"> “</span>配置<span lang="EN-US">”</span>下拉列表中选择项目的<span lang="EN-US"> “</span>（活动）<span lang="EN-US">Release” </span>配置； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l1 level1 lfo6; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">选择<span lang="EN-US">“</span>配置属性<span lang="EN-US">”</span>树型节点中的<span lang="EN-US">“C/C++” ==</span>〉<span lang="EN-US">“</span>常规<span lang="EN-US">”</span>； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l1 level1 lfo6; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">设置右边的<span lang="EN-US">“</span>调试信息格式<span lang="EN-US">”</span>选项（具体选项参见图一）； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l1 level1 lfo6; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">选择<span lang="EN-US">“</span>配置属性<span lang="EN-US">”</span>树型节点中的<span lang="EN-US">“</span>链接器<span lang="EN-US">”==</span>〉<span lang="EN-US">“</span>调试<span lang="EN-US">”</span>； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l1 level1 lfo6; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">设置右边的<span lang="EN-US">“</span>生成程序数据库文件<span lang="EN-US">”</span>（具体选项参见图一）； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l1 level1 lfo6; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">选择<span lang="EN-US">“</span>配置属性<span lang="EN-US">”</span>树型节点中的<span lang="EN-US">“</span>链接器<span lang="EN-US">”==</span>〉<span lang="EN-US">“</span>命令行<span lang="EN-US">”</span>； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l1 level1 lfo6; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">在<span lang="EN-US">“</span>附加选项<span lang="EN-US">(D)”</span>编辑框中添加如下指令：<span lang="EN-US">/opt:ref,icf</span>； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l1 level1 lfo6; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">按<span lang="EN-US">“</span>确定<span lang="EN-US">”</span>退出； <span lang="EN-US"><o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l1 level1 lfo6; tab-stops: list 36.0pt"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">重新生成（<span lang="EN-US">Rebuild</span>）项目； <span lang="EN-US"><o:p></o:p></span></span></li></ol> <p class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Windows_9D3D/clip_image001_4.gif"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="116" alt="clip_image001" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Windows_9D3D/clip_image001_thumb_1.gif" width="545" border="0" v:shapes="_x0000_i1025"></a><br><br></span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">图一<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align="left"><b><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">五、关于<span lang="EN-US"> Free Build</span>（也称<span lang="EN-US"> Retail Build</span>）和<span lang="EN-US"> Checked Build</span>（也称<span lang="EN-US"> Debug Build</span>）</span></b><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt"><o:p></o:p></span></p> <p class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">每个基于<span lang="EN-US"> NT </span>操作系统有两种不同的程序生成模式，即：<span lang="EN-US"><o:p></o:p></span></span></p> <ul type="disc"> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l3 level1 lfo7; tab-stops: list 36.0pt"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">Free Build (</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">或<span lang="EN-US"> Retail Build) <o:p></o:p></span></span></li> <li class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan; mso-list: l3 level1 lfo7; tab-stops: list 36.0pt"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">Checked Build (</span><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">或<span lang="EN-US"> Debug Build) <o:p></o:p></span></span></li></ul> <p class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">　　<span lang="EN-US">Free Build </span>生成的是最终用户版本，针对生成的二进制文件进行了彻底的优化，禁用了调试断言，并剥离了调试信息。这样一来使可执行程序文件更小，加载更快，使用的内存也更小。<span lang="EN-US"><br></span>　　<span lang="EN-US">Checked Build </span>生成的是测试和调试版本。它包含额外的<span lang="EN-US"> Free Build </span>所没有的错误检查，参数验证和调试信息，<span lang="EN-US">Checked Build </span>有助于隔离和跟踪可能导致不可预见的行为的问题，比如内存溢出，不正确的设备配置。虽然<span lang="EN-US"> Checked Build </span>提供了额外的保护，但与<span lang="EN-US"> Free Build </span>比较，它需要更多的内存开销和磁盘空间。由于可执行程序包含符号调试信息；调试时要执行附加的代码、参数检查和输出调试诊断信息，从而导致性能下降。<span lang="EN-US"><br><br></span><b>六、系统符号文件的更新方法</b><span lang="EN-US"><br><br></span>　　系统符号文件指<span lang="EN-US"> Windows </span>操作系统依赖的那几个重要的<span lang="EN-US"> DLL/SYS </span>和可执行文件对应的符号文件，常见的比如：<span lang="EN-US">gdi32.dll</span>、<span lang="EN-US">Kernel32.dll</span>、<span lang="EN-US">Kerberos.dll</span>、<span lang="EN-US">psapi.dll</span>、<span lang="EN-US">user32.dll</span>等，使用<span lang="EN-US"> WinDbg </span>调试时，你就会发现系统符号文件<span lang="EN-US">(PDB)</span>有多重要，这些文件都与本地的<span lang="EN-US"> OS </span>密切相关，比如，<span lang="EN-US">Windows 2000 </span>打了<span lang="EN-US">SP</span>补丁的话，那么必须更新系统符号文件才能进行相关调试，原来的符号文件与打补丁后的系统就会不匹配，怎么办呢<span lang="EN-US">? </span>可以通过网络来更新！象下面这样在<span lang="EN-US"> WinDbg </span>的<span lang="EN-US"> Symbols Path </span>里面输入路径：<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%; text-align: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">SRV*<b><i>D:\Symbols\websymbols*</i></b>http://msdl.microsoft.com/download/symbols<o:p></o:p></span></p> <p class="MsoNormal" style="line-height: 150%; text-align: left; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-pagination: widow-orphan" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: 宋体; letter-spacing: 0.75pt; mso-bidi-font-family: tahoma; mso-font-kerning: 0pt">（斜体部分是你在本地保存符号文件的路径）<span lang="EN-US"><br><br></span>　　如果你不是通过代理上网，那么在你用<span lang="EN-US"> WinDbg </span>打开一个被调试程序后，输入<span lang="EN-US"> symchk </span>回车，<span lang="EN-US">WinDbg </span>就会自动的连到微软的网站根据你的机器的情况更新的<span lang="EN-US"> PDB </span>文件，并将它保存在上面斜体部分指定的本地路径里，这样你就可以确保你的符号文件版本和你机器上的文件版本一致。<span lang="EN-US"><br><br></span>如果你是通过代理上网那么你需要配置<span lang="EN-US"> IE </span>的连接设置。具体方法恕不赘言。<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: 宋体; mso-bidi-font-family: arial"><o:p>&nbsp;</o:p></span></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/70306.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-12-25 11:11 <a href="http://www.cppblog.com/woaidongmao/archive/2008/12/25/70306.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>调用SendMessage 产生死锁的问题分析</title><link>http://www.cppblog.com/woaidongmao/archive/2008/12/17/69696.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Wed, 17 Dec 2008 15:07:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/12/17/69696.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/69696.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/12/17/69696.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/69696.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/69696.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; (一)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SendMessage 的工作机制  首先我要先简要的说明一个和这个话题有关系的消息处理机制：  &nbsp;&nbsp;&nbsp; 在Window操作系统当中，窗口时属于所在Thread的也就是说 你这个窗口在那个Thread 当中Create 的那么你这个窗口就属于那个Thread。同时窗口的消息处...&nbsp;&nbsp;<a href='http://www.cppblog.com/woaidongmao/archive/2008/12/17/69696.html'>阅读全文</a><img src ="http://www.cppblog.com/woaidongmao/aggbug/69696.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-12-17 23:07 <a href="http://www.cppblog.com/woaidongmao/archive/2008/12/17/69696.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC6一步一步编译OpenVPN</title><link>http://www.cppblog.com/woaidongmao/archive/2008/12/17/69644.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Wed, 17 Dec 2008 04:32:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/12/17/69644.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/69644.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/12/17/69644.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/69644.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/69644.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan" align="left"><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">最近在研究<span lang="EN-US">openvpn</span>，已经部署好服务器和客户端了。想对代码进行研究，故想跟踪调试<span lang="EN-US">openvpn</span>代码看看。<span lang="EN-US"><br></span>下载<span lang="EN-US">openvpn</span>最新版本，目前稳定版本是<span lang="EN-US">openvpn-<?xml:namespace prefix = st1 /><st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">2.0.9</st1:chsdate>&nbsp;&nbsp;&nbsp; http://openvpn.net/ <br><br></span>我的机器环境是<span lang="EN-US">:vc6.0 + vc2003 platform_sdk<br></span>下载以后解压，<span lang="EN-US">main</span>函数在<span lang="EN-US">openvpn.c</span>文件中，<span lang="EN-US">vc6</span>打开这文件，将其它<span lang="EN-US">*.h *.c</span>文件全部加入到工程中，编译运行，报一大堆错<span lang="EN-US">:<?xml:namespace prefix = o /><o:p></o:p></span></span></p> <p class="MsoNormal" style="background: #eeeeee; margin: 0cm 202.5pt 0pt 7.5pt; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">e:\svn_now\3rdparty\microsoft\platform_sdk\2003_02_full-r2\include\winsock2.h(109) : error C2011: 'fd_set' : 'struct' type redefinition<br>e:\svn_now\3rdparty\microsoft\platform_sdk\2003_02_full-r2\include\winsock2.h(144) : warning C4005: 'FD_SET' : macro redefinition<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e:\svn_now\3rdparty\microsoft\platform_sdk\2003_02_full-r2\include\winsock.h(88) : see previous definition of 'FD_SET'<br>e:\svn_now\3rdparty\microsoft\platform_sdk\2003_02_full-r2\include\winsock2.h(153) : error C2011: 'timeval' : 'struct' type redefinition<br>e:\svn_now\3rdparty\microsoft\platform_sdk\2003_02_full-r2\include\winsock2.h(209) : error C2011: 'hostent' : 'struct' type redefinition<br>e:\svn_now\3rdparty\microsoft\platform_sdk\2003_02_full-r2\include\winsock2.h(222) : error C2011: 'netent' : 'struct' type redefinition<br>e:\svn_now\3rdparty\microsoft\platform_sdk\2003_02_full-r2\include\winsock2.h(229) : error C2011: 'servent' : 'struct' type redefinition<br>e:\svn_now\3rdparty\microsoft\platform_sdk\2003_02_full-r2\include\winsock2.h(241) : error C2011: 'protoent' : 'struct' type redefinition<br>e:\svn_now\3rdparty\microsoft\platform_sdk\2003_02_full-r2\include\winsock2.h(397) : error C2011: 'sockaddr_in' : 'struct' type redefinition<br>e:\svn_now\3rdparty\microsoft\platform_sdk\2003_02_full-r2\include\winsock2.h(407) : error C2011: 'WSAData' : 'struct' type redefinition<br>.................................</span><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></span></p> <p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br></span><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">这是由于<span lang="EN-US">&lt;config-win32.h&gt;</span>文件中包含了 <span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="background: #eeeeee; margin: 0cm 202.5pt 0pt 7.5pt; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">#include &lt;windows.h&gt;<br>#include &lt;winsock2.h&gt;</span><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></span></p> <p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">windows.h</span><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">中又包含了<span lang="EN-US">&lt;winsock.h&gt;</span>导致和<span lang="EN-US">winsock2.h</span>冲突，解决方法是在<span lang="EN-US">include&lt;windows.h&gt;</span>之前添加宏<span lang="EN-US">: <o:p></o:p></span></span></p> <p class="MsoNormal" style="background: #eeeeee; margin: 0cm 202.5pt 0pt 7.5pt; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; color: blue; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">#define</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> WIN32_LEAN_AND_MEAN<br>#include &lt;windows.h&gt;<br>#include &lt;winsock2.h&gt;</span><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></span></p> <p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan" align="left"><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">因为用到了<span lang="EN-US">winsock2.h </span>所以必须加入<span lang="EN-US">lib</span>文件<span lang="EN-US">:ws2_32.lib <br></span>再次编译，出现如下错误<span lang="EN-US">:<o:p></o:p></span></span></p> <p class="MsoNormal" style="background: #eeeeee; margin: 0cm 202.5pt 0pt 7.5pt; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">mudp.c<br></span><span lang="EN-US" style="font-size: 12pt; color: blue; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">this</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> compiler appears to lack vararg macros which will cause a significant degradation </span><span lang="EN-US" style="font-size: 12pt; color: blue; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">in</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> efficiency<br>e:\libtools\openvpn-<st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">2.0.9</st1:chsdate>\lzo.h(32) : fatal error C1083: Cannot open include file: 'lzo1x.h': No such file or directory<br>multi.c<br></span><span lang="EN-US" style="font-size: 12pt; color: blue; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">this</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> compiler appears to lack vararg macros which will cause a significant degradation </span><span lang="EN-US" style="font-size: 12pt; color: blue; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">in</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> efficiency<br>e:\libtools\openvpn-2.0.9\lzo.h(32) : fatal error C1083: Cannot open include file: 'lzo1x.h': No such file or directory<br>ntlm.c<br></span><span lang="EN-US" style="font-size: 12pt; color: blue; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">this</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> compiler appears to lack vararg macros which will cause a significant degradation </span><span lang="EN-US" style="font-size: 12pt; color: blue; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">in</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> efficiency<br>occ.c<br></span><span lang="EN-US" style="font-size: 12pt; color: blue; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">this</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> compiler appears to lack vararg macros which will cause a significant degradation </span><span lang="EN-US" style="font-size: 12pt; color: blue; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">in</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> efficiency<br>e:\libtools\openvpn-2.0.9\lzo.h(32) : fatal error C1083: Cannot open include file: 'lzo1x.h': No such file or directory<br>openvpn.c</span><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></span></p> <p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></span></p> <p class="MsoNormal" style="background: #eeeeee; margin: 0cm 202.5pt 0pt 7.5pt; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">#ifdef USE_LZO<br><br>#ifdef LZO_HEADER_DIR<br>#include "lzo/lzoutil.h"<br>#include "lzo/lzo1x.h"<br></span><span lang="EN-US" style="font-size: 12pt; color: blue; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">#else</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br>#include "lzoutil.h"<br>#include "lzo1x.h"<br></span><span lang="EN-US" style="font-size: 12pt; color: blue; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">#endif</span><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></span></p> <p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br></span><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">因为<span lang="EN-US">openvpn</span>默认配置用到了<span lang="EN-US">lzo</span>压缩库，所以下载<span lang="EN-US">lzo</span>压缩包<span lang="EN-US">:lzo-2.03,</span>并且将<span lang="EN-US">lzo-2.03</span>包中的<span lang="EN-US">include</span>文件加入到工程中，注意文件目录层次，我是额外定义了<span lang="EN-US">lzo</span>文件夹，将头文件全部加入进去的，因此必须加上编译选项<span lang="EN-US">:LZO_HEADER_DIR<br></span>另额外编译<span lang="EN-US">lzo lib:<br>&nbsp;&nbsp;&nbsp; </span>将<span lang="EN-US">lzo</span>解压至<span lang="EN-US">C</span>盘根目录，在命令行中跳至该目录，运行<span lang="EN-US">b\win32\mc120.bat</span>，编译成功后生成<span lang="EN-US">lzo.lib<br></span>将生成的<span lang="EN-US">lzo.lib</span>添加到工程中。<span lang="EN-US"><br></span>另如果不是用<span lang="EN-US">lzo</span>可以修改<span lang="EN-US">&lt;config_win32.h&gt;</span>头文件<span lang="EN-US">: (openssl ssl crypto</span>也可以不使用，视具体情况<span lang="EN-US">)<o:p></o:p></span></span></p> <p class="MsoNormal" style="background: #eeeeee; margin: 0cm 202.5pt 0pt 7.5pt; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; color: green; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">/* Use OpenSSL crypto library */</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br></span><span lang="EN-US" style="font-size: 12pt; color: blue; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">#define</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> USE_CRYPTO 1<br><br></span><span lang="EN-US" style="font-size: 12pt; color: green; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">/* Use LZO compression library */</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br></span><span lang="EN-US" style="font-size: 12pt; color: blue; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">#define</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> USE_LZO 1<br><br></span><span lang="EN-US" style="font-size: 12pt; color: green; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">/* Use OpenSSL SSL library */</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br></span><span lang="EN-US" style="font-size: 12pt; color: blue; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">#define</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> USE_SSL 1<br><br></span><span lang="EN-US" style="font-size: 12pt; color: green; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">/* Version number of package */</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br></span><span lang="EN-US" style="font-size: 12pt; color: blue; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">#define</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> VERSION PACKAGE_VERSION</span><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></span></p> <p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br><br></span><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">接着如果使用<span lang="EN-US">OpenSSL</span>，那么首先要下载<span lang="EN-US">OpenSSL</span>库，然后编译<span lang="EN-US">:<br>&nbsp;&nbsp;&nbsp; a.</span>将<span lang="EN-US">OpenSSL</span>解压到<span lang="EN-US">C</span>盘根目录下；<span lang="EN-US"><br>&nbsp;&nbsp;&nbsp; b.</span>在命令提示行中进入该目录，输入<span lang="EN-US">perl Configure VC-WIN32</span>，检验<span lang="EN-US">perl</span>是否正确安装；<span lang="EN-US"><br>&nbsp;&nbsp;&nbsp; c.</span>命令行中输入<span lang="EN-US">ms\do_ms</span>；<span lang="EN-US"><br>&nbsp;&nbsp;&nbsp; d.</span>命令行中转到<span lang="EN-US">Microsoft Visual Studio\VC98\bin</span>，运行<span lang="EN-US">vcvars32.bat</span>以配置环境变量。<span lang="EN-US"><br>&nbsp;&nbsp;&nbsp; e.</span>命令行<span lang="EN-US">OpenSSL</span>目录下，执行<span lang="EN-US">nmake –f ms\ntdll.mak </span>编译成功后，在<span lang="EN-US">out32dll</span>目录下，会有四个文件<span lang="EN-US">libeay32.dll libeay32.lib ssleay32.dll</span>和<span lang="EN-US"> ssleay32.lib,</span>将编译成功的<span lang="EN-US">lzo.lib libeay32.lib ssleay32.lib</span>添加到工程中，并将<span lang="EN-US">libeay32.dll ssleay32.dll</span>拷贝到<span lang="EN-US">Debug</span>目录下<span lang="EN-US">,</span>并且加入<span lang="EN-US">openssl</span>的头文件到工程中，和<span lang="EN-US">lzo</span>库类似的过程。<span lang="EN-US"><br><br></span>另外因为<span lang="EN-US">VC</span>中不识别<span lang="EN-US">unsigned long long int</span>类型，需改为<span lang="EN-US">_int64</span>。修改<span lang="EN-US">&lt;common.h&gt;</span>头文件<span lang="EN-US">: <o:p></o:p></span></span></p> <p class="MsoNormal" style="background: #eeeeee; margin: 0cm 202.5pt 0pt 7.5pt; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">#ifdef USE_64_BIT_COUNTERS<br></span><span lang="EN-US" style="font-size: 12pt; color: green; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">//&nbsp; typedef unsigned long long int counter_type;<br></span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">typedef _int64 counter_type;&nbsp; </span><span lang="EN-US" style="font-size: 12pt; color: green; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">//qj modify<br></span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br># ifdef WIN32<br>#&nbsp; define counter_format&nbsp; "%I64u"<br># </span><span lang="EN-US" style="font-size: 12pt; color: blue; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">else</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br>#&nbsp; define counter_format&nbsp; "%llu"<br># endif<br></span><span lang="EN-US" style="font-size: 12pt; color: blue; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">#else</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br>&nbsp; typedef unsigned </span><span lang="EN-US" style="font-size: 12pt; color: blue; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">int</span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> counter_type;<br># define counter_format&nbsp;&nbsp; "%u"<br></span><span lang="EN-US" style="font-size: 12pt; color: blue; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">#endif</span><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></span></p> <p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br></span><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">再次编译，发现错误少多了，而且全部只是一些<span lang="EN-US">link</span>错误了<span lang="EN-US">:<o:p></o:p></span></span></p> <p class="MsoNormal" style="background: #eeeeee; margin: 0cm 202.5pt 0pt 7.5pt; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">Linking<a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VC6OpenVPN_B03F/clip_image001_2.gif"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="24" alt="clip_image001" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VC6OpenVPN_B03F/clip_image001_thumb.gif" width="19" border="0" v:shapes="_x0000_i1025"></a><br>LINK : warning LNK4098: defaultlib "MSVCRT" conflicts with use of other libs; use /NODEFAULTLIB:library<br>cryptoapi.obj : error LNK2001: unresolved external symbol __imp__CertFreeCertificateContext@4<br>cryptoapi.obj : error LNK2001: unresolved external symbol __imp__CryptAcquireCertificatePrivateKey@24<br>cryptoapi.obj : error LNK2001: unresolved external symbol __imp__CertCloseStore@8<br>cryptoapi.obj : error LNK2001: unresolved external symbol __imp__CertOpenStore@20<br>cryptoapi.obj : error LNK2001: unresolved external symbol __imp__CertFindCertificateInStore@24<br>route.obj : error LNK2001: unresolved external symbol _GetIpForwardTable@12<br>route.obj : error LNK2001: unresolved external symbol _CreateIpForwardEntry@4<br>route.obj : error LNK2001: unresolved external symbol _DeleteIpForwardEntry@4<br>tun.obj : error LNK2001: unresolved external symbol _GetAdaptersInfo@8<br>tun.obj : error LNK2001: unresolved external symbol _IpReleaseAddress@4<br>tun.obj : error LNK2001: unresolved external symbol _GetInterfaceInfo@8<br>tun.obj : error LNK2001: unresolved external symbol _IpRenewAddress@4<br>tun.obj : error LNK2001: unresolved external symbol _AddIPAddress@20<br>tun.obj : error LNK2001: unresolved external symbol _FlushIpNetTable@4<br>tun.obj : error LNK2001: unresolved external symbol _DeleteIPAddress@4<br>tun.obj : error LNK2001: unresolved external symbol _GetAdapterIndex@8<br>Debug/openvpn.exe : fatal error LNK1120: 16 unresolved externals<br>Error executing link.exe.<br><br>openvpn.exe - 17 error(s), 1 warning(s)</span><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></span></p> <p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br>&nbsp;</span><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">首先解决<span lang="EN-US">crytoapi.obj</span>的<span lang="EN-US">lnk</span>错误，找到<span lang="EN-US">crytoapi.c</span>文件中的<span lang="EN-US">CertFreeCertificateContext </span>函数，找到其声明<span lang="EN-US">:WinCrypt.h</span>文件，<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="background: #eeeeee; margin: 0cm 202.5pt 0pt 7.5pt; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">#include &lt;wincrypt.h&gt;&nbsp; </span><span lang="EN-US" style="font-size: 12pt; color: green; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">//</span><span style="font-size: 12pt; color: green; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">需要装<span lang="EN-US">PLATFORM SDK<br></span></span><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">#pragma comment (lib, "crypt32.lib")</span><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></span></p> <p class="MsoNormal" style="text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;</span><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">然后解决<span lang="EN-US">route.obj tun.obj</span>的问题，也是通过<span lang="EN-US">route.c</span>文件中的<span lang="EN-US"> GetIpForwardTable</span>等其中一个<span lang="EN-US">link</span>错误的函数，找到其声明文件<span lang="EN-US">:IPHlpApi.h<o:p></o:p></span></span></p> <p class="MsoNormal" style="background: #eeeeee; margin: 0cm 202.5pt 0pt 7.5pt; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; color: black; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">#include &lt;iphlpapi.h&gt;<br>#pragma comment (lib, "iphlpapi.lib")</span><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></span></p> <p class="MsoNormal"><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br><br></span><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">最后再次编译，<span lang="EN-US">OK</span>，开始你的<span lang="EN-US">openvpn</span>代码调试吧！！！</span><span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: arial"><o:p></o:p></span></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/69644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-12-17 12:32 <a href="http://www.cppblog.com/woaidongmao/archive/2008/12/17/69644.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>error LNK2005 operator new(unsigned int) already defined</title><link>http://www.cppblog.com/woaidongmao/archive/2008/11/29/68124.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Fri, 28 Nov 2008 19:50:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/11/29/68124.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/68124.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/11/29/68124.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/68124.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/68124.html</trackback:ping><description><![CDATA[<p></p> <p class="MsoNormal"><span style="font-size: 12pt; font-family: 宋体">最近在<span lang="EN-US">VC 6.0</span>上作業，有幾個地方都遇到一個十分惱人的錯誤。就是出現下述的錯誤：<span lang="EN-US"> Linking... nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj) nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj) Debug/DCap.exe : fatal error LNK1169: one or more multiply defined symbols found <br><br></span>這樣的錯誤，明顯就是兩個被<span lang="EN-US">link</span>到的<span lang="EN-US">library</span>都提供了同名的函式。但直接<span lang="EN-US">ignore</span>掉<span lang="EN-US">LIBCMTD.lib</span>當然是不行的，因為它是<span lang="EN-US">C</span>的<span lang="EN-US">library</span>。之所以發生這個問題，是因為<span lang="EN-US">MFC</span>的<span lang="EN-US">library</span>和<span lang="EN-US">C</span>的<span lang="EN-US">library</span>相衝突，必須設定它們被<span lang="EN-US">link</span>的順序，也就是先<span lang="EN-US">nafxcwd.lib</span>再<span lang="EN-US">LIBCMTD.lib</span>。但是這二者都是<span lang="EN-US">default libraries</span>，所以要怎麼設定它們的順序呢？我找到一個解法其實挺<span lang="EN-US">tricky</span>的：先把它們分別都<span lang="EN-US">ignore</span>掉，再額外將它們加入。也就是說：<span style="color: red">在<span lang="EN-US">Link</span>頁籤上的<span lang="EN-US">Ignore Libraries</span>輸入：<span lang="EN-US">nafxcwd.lib libcmtd.lib</span>，再到同一頁籤的<span lang="EN-US">Object/library modules</span>輸入：<span lang="EN-US">nafxcwd.lib libcmtd.lib</span>。這麼一來，加入它們的順序就成了我們所強迫設定的順序了。</span></span><span lang="EN-US" style="font-size: 12pt; color: red; font-family: 宋体; mso-bidi-font-family: arial"><?xml:namespace prefix = o /><o:p></o:p></span></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/68124.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-11-29 03:50 <a href="http://www.cppblog.com/woaidongmao/archive/2008/11/29/68124.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC++ 6.0的小花招</title><link>http://www.cppblog.com/woaidongmao/archive/2008/11/09/66391.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Sat, 08 Nov 2008 17:37:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/11/09/66391.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/66391.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/11/09/66391.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/66391.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/66391.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Visual Studio系列中产品中，Visual Studio 6.0是最经典的一个版本，虽然后来有Visual Studio .NET 2003，以及2005，也确实添加了很多让我觉得激动的特性，但是从使用细节的细腻程度上来看，VS 6.0无疑是最棒的。我们一些同事甚至试图把2005的C++编译器独立的拿到Visual Studio 6.0中来用，也不愿意升级到.NET上来用，可见其魅力。 ...&nbsp;&nbsp;<a href='http://www.cppblog.com/woaidongmao/archive/2008/11/09/66391.html'>阅读全文</a><img src ="http://www.cppblog.com/woaidongmao/aggbug/66391.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-11-09 01:37 <a href="http://www.cppblog.com/woaidongmao/archive/2008/11/09/66391.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC6 中没有宏得到当前函数的名字</title><link>http://www.cppblog.com/woaidongmao/archive/2008/10/09/63554.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Thu, 09 Oct 2008 07:31:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/10/09/63554.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/63554.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/10/09/63554.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/63554.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/63554.html</trackback:ping><description><![CDATA[<p>很需要用这个，却没有，失望 <p>需要VC7或者以上，如下 <p>VS.Net&nbsp;&nbsp; supports&nbsp;&nbsp; several&nbsp;&nbsp; macros&nbsp;&nbsp; that&nbsp;&nbsp; contain&nbsp;&nbsp; the&nbsp;&nbsp; name&nbsp;&nbsp; of&nbsp;&nbsp; the&nbsp;&nbsp; current&nbsp;&nbsp; function.&nbsp;&nbsp; <br>&nbsp; __FUNCDNAME__,&nbsp;&nbsp; __FUNCSIG__,&nbsp;&nbsp; __FUNCTION__&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; VC6&nbsp;&nbsp; does&nbsp;&nbsp; not&nbsp;&nbsp; support&nbsp;&nbsp; them.&nbsp;&nbsp; <br>&nbsp; 用VC7..........&nbsp; </p><img src ="http://www.cppblog.com/woaidongmao/aggbug/63554.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-10-09 15:31 <a href="http://www.cppblog.com/woaidongmao/archive/2008/10/09/63554.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC6之断点调试DLL</title><link>http://www.cppblog.com/woaidongmao/archive/2008/10/07/63389.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Tue, 07 Oct 2008 06:05:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/10/07/63389.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/63389.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/10/07/63389.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/63389.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/63389.html</trackback:ping><description><![CDATA[<p>步骤</p> <p>1、将DLL项目加入到主工程中间；</p> <p>2、ALT+F7设置DLL属性，Link-&gt;Output file name里面的路径改为主工程目录；</p> <p>3、输出DLL的Debug版本到主工程目录；</p> <p>4、设置断点在DLL源文件中，F5进行调试。</p><img src ="http://www.cppblog.com/woaidongmao/aggbug/63389.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-10-07 14:05 <a href="http://www.cppblog.com/woaidongmao/archive/2008/10/07/63389.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC9 用VC6的老字体 [VS2008 + Visual assister 1647的搭配蛮好]</title><link>http://www.cppblog.com/woaidongmao/archive/2008/09/15/61875.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Mon, 15 Sep 2008 10:15:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/09/15/61875.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/61875.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/09/15/61875.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/61875.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/61875.html</trackback:ping><description><![CDATA[<p>1、VS2008微软官方发布的正版中文Professional版本（第一个）！<br><a href="http://www.gougou.com/search?search=visual%20studio%202008&amp;id=0">http://www.gougou.com/search?search=visual%20studio%202008&amp;id=0<br><br></a>2、百度搜索Visual assister 竟然出现盗版（第三个）！<br><a href="http://www.baidu.com/s?wd=Visual+Assist+1647">http://www.baidu.com/s?wd=Visual+Assist+1647</a><br><br>3、VS2008 + VA1647配合起来很好用（个人经验）<br><br>4、vc9的默认字体太丑，因为vc6的字体看习惯了的原因吧，那么vc6的字体和大小到底是什么? 如下设置，vc9的IDE也找到了一半vc6的感觉</p>
<p>Font: <font color=#ff0000>Fixedsys</font>， size:<font color=#ff0000>16</font></p>
<p>另外：vc9 里面的Courier New字体也不错。<br><br>==============================================<br>备注：<br>装VS2008，不能有任何MS Office 2007 Beta的东西，否则会在安装&#8220;Web创作组件时&#8221;失败，因为我遇到了这个问题。</p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/61875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-09-15 18:15 <a href="http://www.cppblog.com/woaidongmao/archive/2008/09/15/61875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C运行库概念</title><link>http://www.cppblog.com/woaidongmao/archive/2008/09/01/60643.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Mon, 01 Sep 2008 15:33:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/09/01/60643.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/60643.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/09/01/60643.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/60643.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/60643.html</trackback:ping><description><![CDATA[<p>&#160;</p>
<p>1)运行时库就是&nbsp;&nbsp; C&nbsp;&nbsp; run-time&nbsp;&nbsp; library，是&nbsp;&nbsp; C&nbsp;&nbsp; 而非&nbsp;&nbsp; C++&nbsp;&nbsp; 语言世界的概念:取这个名字就是因为你的&nbsp;&nbsp; C&nbsp;&nbsp; 程序运行时需要这些库中的函数.&nbsp;&nbsp; </p>
<p><br>&nbsp; 2)C&nbsp;&nbsp; 语言是所谓的&#8220;小内核&#8221;语言，就其语言本身来说很小（不多的关键字，程序流程控制，数据类型等）；所以，C&nbsp;&nbsp; 语言内核开发出来之后，Dennis&nbsp;&nbsp; Ritchie&nbsp;&nbsp; 和&nbsp;&nbsp; Brian&nbsp;&nbsp; Kernighan&nbsp;&nbsp; 就用&nbsp;&nbsp; C&nbsp;&nbsp; 本身重写了&nbsp;&nbsp; 90%&nbsp;&nbsp; 以上的&nbsp;&nbsp; UNIX&nbsp;&nbsp; 系统函数，并且把其中最常用的部分独立出来，形成头文件和对应的&nbsp;&nbsp; LIBRARY，C&nbsp;&nbsp; run-time&nbsp;&nbsp; library&nbsp;&nbsp; 就是这样形成的。&nbsp;&nbsp; <br>&nbsp;</p>
<p>3)随后，随着&nbsp;&nbsp; C&nbsp;&nbsp; 语言的流行，各个&nbsp;&nbsp; C&nbsp;&nbsp; 编译器的生产商/个体/团体都遵循老的传统，在不同平台上都有相对应的&nbsp;&nbsp; Standard&nbsp;&nbsp; Library，但大部分实现都是与各个平台有关的。由于各个&nbsp;&nbsp; C&nbsp;&nbsp; 编译器对&nbsp;&nbsp; C&nbsp;&nbsp; 的支持和理解有很多分歧和微妙的差别，所以就有了&nbsp;&nbsp; ANSI&nbsp;&nbsp; C；ANSI&nbsp;&nbsp; C&nbsp;&nbsp; （主观意图上）详细的规定了&nbsp;&nbsp; C&nbsp;&nbsp; 语言各个要素的具体含义和编译器实现要求，引进了新的函数声明方式，同时订立了&nbsp;&nbsp; Standard&nbsp;&nbsp; Library&nbsp;&nbsp; 的标准形式。所以C运行时库由编译器生产商提供。至于由其他厂商/个人/团体提供的头文件和库函数，应当称为第三方&nbsp;&nbsp; C&nbsp;&nbsp; 运行库（Third&nbsp;&nbsp; party&nbsp;&nbsp; C&nbsp;&nbsp; run-time&nbsp;&nbsp; libraries）。&nbsp;&nbsp; <br>&nbsp;</p>
<p>4)C&nbsp;&nbsp; run-time&nbsp;&nbsp; library里面含有初始化代码，还有错误处理代码(例如divide&nbsp;&nbsp; by&nbsp;&nbsp; zero处理)。你写的程序可以没有math库，程序照样运行，只是不能处理复杂的数学运算，不过如果没有了C&nbsp;&nbsp; run-time库，main()就不会被调用，exit()也不能被响应。因为C&nbsp;&nbsp; run-time&nbsp;&nbsp; library包含了C程序运行的最基本和最常用的函数。&nbsp;&nbsp; <br>&nbsp;</p>
<p>5)到了&nbsp;&nbsp; C++&nbsp;&nbsp; 世界里，有另外一个概念:Standard&nbsp;&nbsp; C++&nbsp;&nbsp; Library,它包括了上面所说的&nbsp;&nbsp; C&nbsp;&nbsp; run-time&nbsp;&nbsp; library&nbsp;&nbsp; 和&nbsp;&nbsp; STL。包含&nbsp;&nbsp; C&nbsp;&nbsp; run-time&nbsp;&nbsp; library&nbsp;&nbsp; 的原因很明显，C++&nbsp;&nbsp; 是&nbsp;&nbsp; C&nbsp;&nbsp; 的超集，没有理由再重新来一个&nbsp;&nbsp; C++&nbsp;&nbsp; run-time&nbsp;&nbsp; library.&nbsp;&nbsp; VC针对C++&nbsp;&nbsp; 加入的Standard&nbsp;&nbsp; C++&nbsp;&nbsp; Library主要包括：LIBCP.LIB,&nbsp;&nbsp; LIBCPMT.LIB和&nbsp;&nbsp; MSVCPRT.LIB&nbsp;&nbsp; <br>&nbsp;</p>
<p>6)Windows环境下，VC提供的&nbsp;&nbsp; C&nbsp;&nbsp; run-time&nbsp;&nbsp; library又分为动态运行时库和静态运行时库。&nbsp;&nbsp; <br>&nbsp; 动态运行时库主要是DLL库文件msvcrt.dll(or&nbsp;&nbsp; MSVCRTD.DLL&nbsp;&nbsp; for&nbsp;&nbsp; debug&nbsp;&nbsp; build),对应的Import&nbsp;&nbsp; library文件是MSVCRT.LIB(MSVCRTD.LIB&nbsp;&nbsp; for&nbsp;&nbsp; debug&nbsp;&nbsp; build)&nbsp;&nbsp; <br>&nbsp; 静态运行时库(release版)对应的主要文件是：&nbsp;&nbsp; <br>&nbsp; LIBC.LIB&nbsp;&nbsp; (Single&nbsp;&nbsp; thread&nbsp;&nbsp; static&nbsp;&nbsp; library,&nbsp;&nbsp; retail&nbsp;&nbsp; version)&nbsp;&nbsp; <br>&nbsp; LIBCMT.LIB&nbsp;&nbsp; (Multithread&nbsp;&nbsp; static&nbsp;&nbsp; library,&nbsp;&nbsp; retail&nbsp;&nbsp; version)&nbsp;&nbsp; </p>
<p><br>&nbsp; msvcrt.dll提供几千个C函数，即使是像printf这么低级的函数都在msvcrt.dll里。其实你的程序运行时，很大一部分时间时在这些运行库里运行。在你的程序(release版)被编译时，VC会根据你的编译选项(单线程、多线程或DLL)自动将相应的运行时库文件(libc.lib,libcmt.lib或Import&nbsp;&nbsp; library&nbsp;&nbsp; msvcrt.lib)链接进来。 </p>
<p>&nbsp; <br>&nbsp; 编译时到底哪个C&nbsp;&nbsp; run-time&nbsp;&nbsp; library联入你的程序取决于编译选项：&nbsp;&nbsp; <br>&nbsp; /MD,&nbsp;&nbsp; /ML,&nbsp;&nbsp; /MT,&nbsp;&nbsp; /LD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (Use&nbsp;&nbsp; Run-Time&nbsp;&nbsp; Library)&nbsp;&nbsp; </p>
<p><br>&nbsp; 你可以VC中通过以下方法设置选择哪个C&nbsp;&nbsp; run-time&nbsp;&nbsp; library联入你的程序：&nbsp;&nbsp; <br>&nbsp; To&nbsp;&nbsp; find&nbsp;&nbsp; these&nbsp;&nbsp; options&nbsp;&nbsp; in&nbsp;&nbsp; the&nbsp;&nbsp; development&nbsp;&nbsp; environment,&nbsp;&nbsp; click&nbsp;&nbsp; Settings&nbsp;&nbsp; on&nbsp;&nbsp; the&nbsp;&nbsp; Project&nbsp;&nbsp; menu.&nbsp;&nbsp; Then&nbsp;&nbsp; click&nbsp;&nbsp; the&nbsp;&nbsp; C/C++&nbsp;&nbsp; tab,&nbsp;&nbsp; and&nbsp;&nbsp; click&nbsp;&nbsp; Code&nbsp;&nbsp; Generation&nbsp;&nbsp; in&nbsp;&nbsp; the&nbsp;&nbsp; Category&nbsp;&nbsp; box.&nbsp;&nbsp; See&nbsp;&nbsp; the&nbsp;&nbsp; Use&nbsp;&nbsp; Run-Time&nbsp;&nbsp; Library&nbsp;&nbsp; drop-down&nbsp;&nbsp; box.&nbsp;&nbsp; </p>
<p><br>&nbsp; 从程序可移植性考虑,如果两函数都可完成一种功能，选运行时库函数好,因为各个&nbsp;&nbsp; C&nbsp;&nbsp; 编译器的生产商对标准C&nbsp;&nbsp; Run-time&nbsp;&nbsp; library提供了统一的支持.&nbsp; </p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/60643.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-09-01 23:33 <a href="http://www.cppblog.com/woaidongmao/archive/2008/09/01/60643.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为什么会出现LNK2005</title><link>http://www.cppblog.com/woaidongmao/archive/2008/08/16/58995.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Fri, 15 Aug 2008 16:54:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/08/16/58995.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/58995.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/08/16/58995.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/58995.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/58995.html</trackback:ping><description><![CDATA[<p>许多Visual C++的使用者都碰到过LNK2005:symbol already defined和LNK1169:one or more multiply defined symbols found这样的链接错误，而且通常是在使用第三方库时遇到的。对于这个问题，有的朋友可能不知其然，而有的朋友可能知其然却不知其所以然，那么本文就试图为大家彻底解开关于它的种种疑惑。 <p>&nbsp;&nbsp;&nbsp; 大家都知道，从C/C++源程序到可执行文件要经历两个阶段:(1)编译器将源文件编译成汇编代码，然后由汇编器(assembler)翻译成机器指令(再加上其它相关信息)后输出到一个个目标文件(object file,VC的编译器编译出的目标文件默认的后缀名是.obj)中；(2)链接器(linker)将一个个的目标文件(或许还会有若干程序库)链接在一起生成一个完整的可执行文件。 <p>&nbsp;&nbsp;&nbsp; 编译器编译源文件时会把源文件的全局符号(global symbol)分成强(strong)和弱(weak)两类传给汇编器，而随后汇编器则将强弱信息编码并保存在目标文件的符号表中。那么何谓强弱呢？编译器认为函数与初始化了的全局变量都是强符号，而未初始化的全局变量则成了弱符号。比如有这么个源文件: <p>extern int errorno;<br>int buf[2] = {1,2};<br>int *p; <p>int main()<br>{<br>&nbsp;&nbsp; return 0;<br>} <p>其中main、buf是强符号，p是弱符号，而errorno则非强非弱，因为它只是个外部变量的使用声明。 <p>&nbsp;&nbsp;&nbsp; 有了强弱符号的概念，我们就可以看看链接器是如何处理与选择被多次定义过的全局符号: <p><strong>规则1</strong>: 不允许强符号被多次定义(即不同的目标文件中不能有同名的强符号)； <p><strong>规则2</strong>: 如果一个符号在某个目标文件中是强符号，在其它文件中都是弱符号，那么选择强符号； <p><strong>规则3</strong>: 如果一个符号在所有目标文件中都是弱符号，那么选择其中任意一个； <p>&nbsp;&nbsp;&nbsp; 由上可知多个目标文件不能重复定义同名的函数与初始化了的全局变量，否则必然导致LNK2005和LNK1169两种链接错误。可是，有的时候我们并没有在自己的程序中发现这样的重定义现象，却也遇到了此种链接错误，这又是何解？嗯，问题稍微有点儿复杂，容我慢慢道来。 <p>&nbsp;&nbsp;&nbsp; 众所周知，ANSI C/C++ 定义了相当多的标准函数，而它们又分布在许多不同的目标文件中，如果直接以目标文件的形式提供给程序员使用的话，就需要他们确切地知道哪个函数存在于哪个目标文件中，并且在链接时显式地指定目标文件名才能成功地生成可执行文件，显然这是一个巨大的负担。所以C语言提供了一种将多个目标文件打包成一个文件的机制，这就是静态程序库(static library)。开发者在链接时只需指定程序库的文件名，链接器就会自动到程序库中寻找那些应用程序确实用到的目标模块，并把(且只把)它们从库中拷贝出来参与构建可执行文件。几乎所有的C/C++开发系统都会把标准函数打包成标准库提供给开发者使用(有不这么做的吗？)。 <p>&nbsp;&nbsp;&nbsp; 程序库为开发者带来了方便，但同时也是某些混乱的根源。我们来看看链接器是如何解析(resolve)对程序库的引用的。<br>&nbsp;&nbsp;&nbsp; 在符号解析(symbol resolution)阶段，链接器按照所有目标文件和库文件出现在命令行中的顺序从左至右依次扫描它们，在此期间它要维护若干个集合:(1)集合E是将被合并到一起组成可执行文件的所有目标文件集合；(2)集合U是未解析符号(unresolved symbols，比如已经被引用但是还未被定义的符号)的集合；(3)集合D是所有之前已被加入到E的目标文件定义的符号集合。一开始，E、U、D都是空的。 <p><strong>(1):</strong> 对命令行中的每一个输入文件f，链接器确定它是目标文件还是库文件，如果它是目标文件，就把f加入到E，并把f中未解析的符号和已定义的符号分别加入到U、D集合中，然后处理下一个输入文件。 <p><strong>(2):</strong> 如果f是一个库文件，链接器会尝试把U中的所有未解析符号与f中各目标模块定义的符号进行匹配。如果某个目标模块m定义了一个U中的未解析符号，那么就把m加入到E中，并把m中未解析的符号和已定义的符号分别加入到U、D集合中。不断地对f中的所有目标模块重复这个过程直至到达一个不动点(fixed point)，此时U和D不再变化。而那些未加入到E中的f里的目标模块就被简单地丢弃，链接器继续处理下一输入文件。 <p>(3): 如果处理过程中往D加入一个已存在的符号，或者当扫描完所有输入文件时U非空，链接器报错并停止动作。否则，它把E中的所有目标文件合并在一起生成可执行文件。 <p>&nbsp;&nbsp;&nbsp; VC带的编译器名字叫cl.exe，它有这么几个与标准程序库有关的选项: /ML、/MLd、/MT、/MTd、/MD、/MDd。这些选项告诉编译器应用程序想使用什么版本的C标准程序库。/ML(缺省选项)对应单线程静态版的标准程序库(libc.lib)；/MT对应多线程静态版标准库(libcmt.lib)，此时编译器会自动定义_MT宏；/MD对应多线程DLL版(导入库msvcrt.lib，DLL是msvcrt.dll)，编译器自动定义_MT和_DLL两个宏。后面加d的选项都会让编译器自动多定义一个_DEBUG宏，表示要使用对应标准库的调试版，因此/MLd对应调试版单线程静态标准库(libcd.lib)，/MTd对应调试版多线程静态标准库(libcmtd.lib)，/MDd对应调试版多线程DLL标准库(导入库msvcrtd.lib，DLL是msvcrtd.dll)。虽然我们的确在编译时明白无误地告诉了编译器应用程序希望使用什么版本的标准库，可是当编译器干完了活，轮到链接器开工时它又如何得知一个个目标文件到底在思念谁？为了传递相思，我们的编译器就干了点秘密的勾当。在cl编译出的目标文件中会有一个专门的区域(关心这个区域到底在文件中什么地方的朋友可以参考COFF和PE文件格式)存放一些指导链接器如何工作的信息，其中有一种就叫缺省库(default library)，这些信息指定了一个或多个库文件名，告诉链接器在扫描的时候也把它们加入到输入文件列表中(当然顺序位于在命令行中被指定的输入文件之后)。说到这里，我们先来做个小实验。写个顶顶简单的程序，然后保存为main.c : <p>/* main.c */<br>int main() { return 0; } <p>用下面这个命令编译main.c(什么？你从不用命令行来编译程序？这个......) : <p>cl /c main.c <p>/c是告诉cl只编译源文件，不用链接。因为/ML是缺省选项，所以上述命令也相当于: cl /c /ML main.c 。如果没什么问题的话(要出了问题才是活见鬼！当然除非你的环境变量没有设置好，这时你应该去VC的bin目录下找到vcvars32.bat文件然后运行它。)，当前目录下会出现一个main.obj文件，这就是我们可爱的目标文件。随便用一个文本编辑器打开它(是的，文本编辑器，大胆地去做别害怕)，搜索"defaultlib"字符串，通常你就会看到这样的东西: "-defaultlib:LIBC -defaultlib:OLDNAMES"。啊哈，没错，这就<br>是保存在目标文件中的缺省库信息。我们的目标文件显然指定了两个缺省库，一个是单线程静态版标准库libc.lib(这与/ML选项相符)，另外一个是oldnames.lib(它是为了兼容微软以前的C/C++开发系统)。 <p>&nbsp;&nbsp;&nbsp; VC的链接器是link.exe，因为main.obj保存了缺省库信息，所以可以用 <p>link main.obj libc.lib <p>或者 <p>link main.obj <p>来生成可执行文件main.exe，这两个命令是等价的。但是如果你用 <p>link main.obj libcd.lib <p>的话，链接器会给出一个警告: "warning LNK4098: defaultlib "LIBC" conflicts with use of other libs; use /NODEFAULTLIB:library"，因为你显式指定的标准库版本与目标文件的缺省值不一致。通常来说，应该保证链接器合并的所有目标文件指定的缺省标准库版本一致，否则编译器一定会给出上面的警告，而LNK2005和LNK1169链接错误则有时会出现有时不会。那么这个有时到底是什么时候？呵呵，别着急，下面的一切正是为喜欢追根究底的你准备的。 <p>&nbsp;&nbsp;&nbsp; 建一个源文件，就叫mylib.c，内容如下: <p>/* mylib.c */<br>＃i nclude  <p>void foo()<br>{<br>&nbsp;&nbsp; printf("%s","I am from mylib!\n");<br>} <p>用 <p>cl /c /MLd mylib.c <p>命令编译，注意/MLd选项是指定libcd.lib为默认标准库。lib.exe是VC自带的用于将目标文件打包成程序库的命令，所以我们可以用 <p>lib /OUT:my.lib mylib.obj <p>将mylib.obj打包成库，输出的库文件名是my.lib。接下来把main.c改成: <p>/* main.c */<br>void foo(); <p>int main()<br>{<br>&nbsp;&nbsp; foo();<br>&nbsp;&nbsp; return 0;<br>} <p>用 <p>cl /c main.c <p>编译，然后用 <p>link main.obj my.lib <p>进行链接。这个命令能够成功地生成main.exe而不会产生LNK2005和LNK1169链接错误，你仅仅是得到了一条警告信息:"warning LNK4098: defaultlib "LIBCD" conflicts with use of other libs; use /NODEFAULTLIB:library"。我们根据前文所述的扫描规则来分析一下链接器此时做了些啥。 <p>&nbsp;&nbsp;&nbsp; 一开始E、U、D都是空集，链接器首先扫描到main.obj，把它加入E集合，同时把未解析的foo加入U，把main加入D，而且因为main.obj的默认标准库是libc.lib，所以它被加入到当前输入文件列表的末尾。接着扫描my.lib，因为这是个库，所以会拿当前U中的所有符号(当然现在就一个foo)与my.lib中的所有目标模块(当然也只有一个mylib.obj)依次匹配，看是否有模块定义了U中的符号。结果mylib.obj确实定义了foo，于是它被加入到E，foo从U转移到D，mylib.obj引用的printf加入到U，同样地，mylib.obj指定的默认标准库是libcd.lib，它也被加到当前输入文件列表的末尾(在libc.lib的后面)。不断地在my.lib库的各模块上进行迭代以匹配U中的符号，直到U、D都不再变化。很明显，现在就已经到达了这么一个不动点，所以接着扫描下一个输入文件，就是libc.lib。链接器发现libc.lib里的printf.obj里定义有printf，于是printf从U移到D，而printf.obj被加入到E，它定义的所有符号加入到D，它里头的未解析符号加入到U。链接器还会把每个程序都要用到的一些初始化操作所在的目标模块(比如crt0.obj等)及它们所引用的模块(比如malloc.obj、free.obj等)自动加入到E中，并更新U和D以反应这个变化。事实上，标准库各目标模块里的未解析符号都可以在库内其它模块中找到定义，因此当链接器处理完libc.lib时，U一定是空的。最后处理libcd.lib，因为此时U已经为空，所以链接器会抛弃它里面的所有目标模块从而结束扫描，然后合并E中的目标模块并输出可执行文件。 <p>&nbsp;&nbsp;&nbsp; 上文描述了虽然各目标模块指定了不同版本的缺省标准库但仍然链接成功的例子，接下来你将目睹因为这种不严谨而导致的悲惨失败。 <p>&nbsp;&nbsp;&nbsp; 修改mylib.c成这个样子: <p>＃i nclude  <p>void foo()<br>{<br>// just a test , don"t care memory leak<br>&nbsp;&nbsp; _malloc_dbg( 1, _NORMAL_BLOCK, __FILE__, __LINE__ );<br>} <p>其中_malloc_dbg不是ANSI C的标准库函数，它是VC标准库提供的malloc的调试版，与相关函数配套能帮助开发者抓各种内存错误。使用它一定要定义_DEBUG宏，否则预处理器会把它自动转为malloc。继续用 <p>cl /c /MLd mylib.c<br>lib /OUT:my.lib mylib.obj <p>编译打包。当再次用 <p>link main.obj my.lib <p>进行链接时，我们看到了什么？天哪，一堆的LNK2005加上个贵为"fatal error"的LNK1169垫底，当然还少不了那个LNK4098。链接器是不是疯了？不，你冤枉可怜的链接器了，我拍胸脯保证它可是一直在尽心尽责地照章办事。 <p>&nbsp;&nbsp;&nbsp; 一开始E、U、D为空，链接器扫描main.obj，把它加入E，把foo加入U，把main加入D，把libc.lib加入到当前输入文件列表的末尾。接着扫描my.lib，foo从U转移到D，_malloc_dbg加入到U，libcd.lib加到当前输入文件列表的尾部。然后扫描libc.lib，这时会发现libc.lib里任何一个目标模块都没有定义_malloc_dbg(它只在调试版的标准库中存在)，所以不会有任何一个模块因为_malloc_dbg而加入E，但是每个程序都要用到的初始化模块(如crt0.obj等)及它们所引用的模块(比如malloc.obj、free.obj等)还是会自动加入到E中，同时U和D被更新以反应这个变化。当链接器处理完libc.lib时，U只剩_malloc_dbg这一个符号。最后处理libcd.lib，发现dbgheap.obj定义了_malloc_dbg，于是dbgheap.obj加入到E，它里头的未解析符号加入U，它定义的所有其它符号也加入D，这时灾难便来了。之前malloc等符号已经在D中(随着libc.lib里的malloc.obj加入E而加入的)，而dbgheap.obj又定义了包括malloc在内的许多同名符号，这引发了重定义冲突，链接器只好中断工作并报告错误。 <p>&nbsp;&nbsp;&nbsp; 现在我们该知道，链接器完全没有责任，责任在我们自己的身上。是我们粗心地把缺省标准库版本不一致的目标文件(main.obj)与程序库(my.lib)链接起来，导致了大灾难。解决办法很简单，要么用/MLd选项来重编译main.c；要么用/ML选项重编译mylib.c。 <p>&nbsp;&nbsp;&nbsp; 在上述例子中，我们拥有库my.lib的源代码(mylib.c)，所以可以用不同的选项重新编译这些源代码并再次打包。可如果使用的是第三方的库，它并没有提供源代码，那么我们就只有改变自己程序的编译选项来适应这些库了。但是如何知道库中目标模块指定的默认库呢？其实VC提供的一个小工具便可以完成任务，这就是dumpbin.exe。运行下面这个命令 <p>dumpbin /DIRECTIVES my.lib <p>然后在输出中找那些"Linker Directives"引导的信息，你一定会发现每一处这样的信息都会包含若干个类似"-defaultlib:XXXX"这样的字符串，其中XXXX便代表目标模块指定的缺省库名。 <p>&nbsp;&nbsp;&nbsp; 知道了第三方库指定的默认标准库，再用合适的选项编译我们的应用程序，就可以避免LNK2005和LNK1169链接错误。喜欢IDE的朋友，你一样可以到 "Project属性" -&gt; "C/C++" -&gt; "代码生成(code generation)" -&gt; "运行时库(run-time library)" 项下设置应用程序的默认标准库版本，这与命令行选项的效果是一样的。 <p><strong>终极解决办法：</strong> <p>在 Project/Setting/Link/General中的 Project Options: 加入 /FORCE:MULTIPLE即可。 <img src ="http://www.cppblog.com/woaidongmao/aggbug/58995.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-08-16 00:54 <a href="http://www.cppblog.com/woaidongmao/archive/2008/08/16/58995.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>#pragma pack(push,1)/#pragma pack(pop)</title><link>http://www.cppblog.com/woaidongmao/archive/2008/07/23/56938.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Wed, 23 Jul 2008 07:09:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/07/23/56938.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/56938.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/07/23/56938.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/56938.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/56938.html</trackback:ping><description><![CDATA[<p>对齐很重要，对结构体，一定要对齐，尤其是涉及到文件/内存双向转换的 <p>#pragma pack(push,1)<br>struct RateInfoOld<br>&nbsp; {<br>&nbsp;&nbsp; time_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ctm;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // rate time<br>&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; open;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // open price: 11987=119.87<br>&nbsp;&nbsp; short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; high,low,close;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // high,low,close shift from open<br>&nbsp;&nbsp; double&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vol;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // volume<br>&nbsp; };<br>#pragma pack(pop)</p><img src ="http://www.cppblog.com/woaidongmao/aggbug/56938.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-07-23 15:09 <a href="http://www.cppblog.com/woaidongmao/archive/2008/07/23/56938.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows下文件夹的遍历</title><link>http://www.cppblog.com/woaidongmao/archive/2008/07/09/55742.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Wed, 09 Jul 2008 10:29:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/07/09/55742.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/55742.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/07/09/55742.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/55742.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/55742.html</trackback:ping><description><![CDATA[<p>　　文件夹遍历技术是一种非常有用的技术，在文件的搜索以及杀毒软件中都使用了这种技术。以下我将讨论如何在Win32下实现这种技术。<br>　　文件夹遍历技术的核心就是使用递归算法，关于递归算法我这里就不多介绍了，不明白的朋友请参阅相关内容。<br>　　以下是我的算法伪代码：<br>void function(LPCTSTR lpszPath)<br>{<br>&nbsp; 开始查找;<br>&nbsp; if (没有找到文件)<br>&nbsp;&nbsp;&nbsp; return;<br>&nbsp; do<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; if (找到的文件是目录)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function(找到的目录);<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对文件进行操作;<br>&nbsp; } while (查找下一个文件并成功);<br>}<br>　　实现这个算法所需要用到的API函数以及结构体有：<br>　　·FindFirstFile；<br>　　·FindNextFile；<br>　　·WIN32_FIND_DATA。<br>　　在此我假定你已经明白了以上函数及结构体的用法，now let's begin。<br>　　现在我来编写开始查找的代码。在这之前，我先假定函数参数lpszPath传入的路径格式为X:\（根目录）或X:\Dir（非根目录），因为Win32程序设计中通常使用的就是这种路径格式。你一定注意到了，如果路径是根目录，它的后边有一个路径分隔符“\”，反之则没有。那么我在写代码的时候必须对这两种情况分别处理。这段代码如下：<br>TCHAR szFind[MAX_PATH];<br>lstrcpy(szFind, lpszPath);<br>if (!IsRoot(szFind)) // IsRoot是我自己编写的函数，若参数是根目录，则返回true<br>lstrcat(szFind, "\\");<br>lstrcat(szFind, "*.*"); // 找所有文件<br>WIN32_FIND_DATA wfd;<br>HANDLE hFind = FindFirstFile(szFind, &amp;wfd);<br>if (hFind == INVALID_HANDLE_VALUE) // 如果没有找到或查找失败<br>&nbsp; return;<br>　　下面我将讨论的是如果找到了文件，该怎么办。不过在此之前，请你进入MS-DOS方式，并输入dir回车，你看到了什么？ <p>　　<font color="#ff0000">是的，DOS是不会说假话的，不像Windows一样总把重要的东西隐藏起来不让你看到——如果你所在的不是根目录，你将会看到“.”与“..”这两个目录——这是在资源管理器中看不到的。从DOS时代走过的朋友们大抵都明白吧，一个点代表的是当前目录，两个点代表的是上一级目录。那么我在处理信息时，就一定得把它们两个过滤出去，原因我在下面解释。do-while段的代码如下：<br></font>do<br>{<br>&nbsp; if (wfd.cFileName[0] == '.')<br>&nbsp;&nbsp;&nbsp; continue; // 过滤这两个目录<br>&nbsp; if (wfd.dwFileAttributes &amp; FILE_ATTRIBUTE_DIRECTORY)<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; TCHAR szFile[MAX_PATH];<br>&nbsp;&nbsp;&nbsp; if (IsRoot(lpszPath))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wsprintf(szFile, "%s%s", lpszPath, wfd.cFileName);<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wsprintf(szFile, "%s\\%s", lpszPath, wfd.cFileName);<br>&nbsp;&nbsp;&nbsp; function(szFile); // 如果找到的是目录，则进入此目录进行递归<br>&nbsp; }<br>&nbsp; else<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; // 对文件进行操作<br>&nbsp; }<br>} while (FindNextFile(hFind, &amp;wfd));<br>FindClose(hFind); // 关闭查找句柄<br>　　现在我来解释为什么要把那两个带点的目录过滤出去。如你所见，如果找到的是目录，那么进入此目录进行递归——那么若是当前目录呢？答案很明显，如果不对其进行过滤，那么程序将进入“当前目录”进行递归。是的，如是将导致递归无休止地进行下去。<br>　　算法就这么多了，由于这是一个极其耗费系统资源的算法，因此你在程序中用到它的时候，最好将其放到一个单独的线程中运行，否则将会导致你的程序在查找过程中没有任何响应。<br>　　附：IsRoot函数源码<br>BOOL IsRoot(LPCTSTR lpszPath)<br>{<br>&nbsp; TCHAR szRoot[4];<br>&nbsp; wsprintf(szRoot, "%c:\\", lpszPath[0]);<br>&nbsp; return (lstrcmp(szRoot, lpszPath) == 0);<br>}</p><img src ="http://www.cppblog.com/woaidongmao/aggbug/55742.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-07-09 18:29 <a href="http://www.cppblog.com/woaidongmao/archive/2008/07/09/55742.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Stdafx.cpp引发的血案</title><link>http://www.cppblog.com/woaidongmao/archive/2008/06/30/54968.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Mon, 30 Jun 2008 09:11:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/06/30/54968.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/54968.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/06/30/54968.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/54968.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/54968.html</trackback:ping><description><![CDATA[<p>问题描述：build ,clean后build, rebuild都无法通过 </p> <p>解决办法，转到Stdafx.cpp，Clean, Ctrl + F7重新编译Stdafx.cpp, 然后F7编译工程即可解决。</p><img src ="http://www.cppblog.com/woaidongmao/aggbug/54968.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-06-30 17:11 <a href="http://www.cppblog.com/woaidongmao/archive/2008/06/30/54968.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>线程本地存储 (TLS)</title><link>http://www.cppblog.com/woaidongmao/archive/2008/06/27/54807.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Fri, 27 Jun 2008 06:44:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/06/27/54807.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/54807.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/06/27/54807.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/54807.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/54807.html</trackback:ping><description><![CDATA[<p></p> <p>线程本地存储 (TLS) 是一个方法，通过该方法，给定的多线程进程中的每个线程都可以分配存储线程特定数据的位置。通过 TLS API（TlsAlloc、TlsGetValue、TlsSetValue、TlsFree）方式支持动态绑定（运行时）的线程特定数据。除了现有的 API 实现，Win32 和 Visual C++ 编译器现在还支持静态绑定（加载时间）基于线程的数据。 <h5><a name="_core_api_implementation_for_tls"></a>TLS 的 API 实现</h5> <p>通过 Win32 API 层和编译器实现“线程本地存储”。有关详细信息，请参见 Win32 API 文档中的 TlsAlloc、TlsGetValue、TlsSetValue 和 TlsFree。 <p>Visual C++ 编译器包括使线程本地存储操作更加自动化的关键字，而不是通过 API 层。将在下一节（TLS 的编译器实现）描述此语法。 <h5><a name="_core_compiler_implementation_for_tls"></a>TLS 的编译器实现</h5> <p>为了支持 TLS，已将新属性 <b>thread</b> 添加到了 C 和 C++ 语言，并由 Visual C++ 编译器支持。此属性是一个扩展存储类修饰符，如上一节中所述。使用 <b>__declspec</b> 关键字声明 <b>thread</b> 变量。例如，以下代码声明了一个整数线程局部变量，并用一个值对其进行初始化：<pre>__declspec( thread ) int tls_i = 1;</pre><pre><p><h3><a name="_core_rules_and_limitations_for_tls"></a>TLS 的规则和限制</h3><p></p><p><p></p><p>声明静态绑定线程的本地对象和变量时必须遵守下列原则： </p><ul><li><b>thread</b> 属性只能应用于数据声明和定义。它不能用于函数声明或定义。例如，以下代码将生成一个编译器错误： <pre>#define Thread  __declspec( thread )
Thread void func();     // This will generate an error.</pre><li>只能在具有 <b>static</b> 作用域的数据项上指定 <b>thread</b> 修饰符。包括全局数据对象（包括 <b>static</b> 和 <b>extern</b>）、本地静态对象和 C++ 类的静态数据成员。不可以用 <b>thread</b> 属性声明自动数据对象。以下代码将生成编译器错误： <pre>#define Thread  __declspec( thread )
void func1()
{
    Thread int tls_i;            // This will generate an error.
}

int func2( Thread int tls_i )    // This will generate an error.
{
    return tls_i;
}</pre><li>线程本地对象的声明和定义必须全都指定 <b>thread</b> 属性。例如，以下代码将生成错误： <pre>#define Thread  __declspec( thread )
extern int tls_i;        // This will generate an error, since the
int Thread tls_i;        // declaration and definition differ.</pre><li><b>thread</b> 属性不能用作类型修饰符。例如，以下代码将生成一个编译器错误： <pre>char __declspec( thread ) *ch;        // Error</pre><li>C++ 类不能使用 <b>thread</b> 属性。但是，可以使用 <b>thread</b> 属性将 C++ 类对象实例化。例如，以下代码将生成一个编译器错误： <pre>#define Thread  __declspec( thread )
class Thread C       // Error: classes cannot be declared Thread.
{
// Code
};
C CObject;</pre><p>因为允许使用 <b>thread</b> 属性的 C++ 对象的声明，因此下面两个示例在语义上是等效的： <pre>#define Thread  __declspec( thread )
Thread class B
{
// Code
} BObject;               // OK--BObject is declared thread local.

class B
{
// Code
};
Thread B BObject;        // OK--BObject is declared thread local.</pre><li>不将线程本地对象的地址视为常数，并且涉及此类地址的任何表达式都不视为常数。在标准 C 中，这种作法的效果是禁止将线程本地变量的地址用作对象或指针的初始值设定项。例如，C 编译器将以下代码标记为错误： <pre>#define Thread  __declspec( thread )
Thread int tls_i;
int *p = &amp;tls_i;       //This will generate an error in C.</pre><p>但是，此限制不适用于 C++。因为 C++ 允许动态初始化所有对象，因此可以用使用线程本地变量地址的表达式初始化对象。实现此操作的方式与实现线程本地对象结构的方式相同。例如，以上显示的代码在作为 C++ 源文件编译时不会生成错误。请注意：只有在其中获取地址的线程仍然存在的情况下，线程本地变量的地址才有效。 </p><li>标准 C 允许使用涉及引用自身的表达式初始化对象或变量，但只适用于非静态作用域的对象。虽然 C++ 通常允许使用涉及引用自身的表达式动态初始化对象，但是这种类型的初始化不允许用于线程本地对象。例如： <pre>#define Thread  __declspec( thread )
Thread int tls_i = tls_i;                // Error in C and C++ 
int j = j;                               // OK in C++, error in C
Thread int tls_i = sizeof( tls_i )       // Legal in C and C++</pre><p>请注意：包含正在初始化的对象的 <code>sizeof</code> 表达式不建立对自身的引用且在 C 和 C++ 中都是合法的。 <p>C++ 不允许此类对线程数据的动态初始化，因为将来可能要对线程本地存储功能进行增强。 </p><li>如果 DLL 将任何非本地数据或对象声明为 <b>__declspec</b>（线程），动态加载该 DLL 时会导致保护错误。使用 LoadLibrary 加载所有 DLL 后，每当代码引用非本地 <b>__declspec</b>（线程）数据时，将导致系统故障。由于线程的全局变量空间是在运行时分配的，因此此空间的大小是以应用程序的需求和所有静态链接的 DLL 的需求相加为基础计算出来的。使用 <b>LoadLibrary</b> 时，无法扩展此空间以允许放置用 <b>__declspec</b>（线程）声明的线程本地变量。如果 DLL 可能是用 <b>LoadLibrary</b> 加载的，请在 DLL 中使用 TLS API（如 TlsAlloc）来分配 TLS。 </li></ul></pre><img src ="http://www.cppblog.com/woaidongmao/aggbug/54807.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-06-27 14:44 <a href="http://www.cppblog.com/woaidongmao/archive/2008/06/27/54807.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC中得到预编译后代码</title><link>http://www.cppblog.com/woaidongmao/archive/2008/05/09/49306.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Fri, 09 May 2008 06:52:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/05/09/49306.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/49306.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/05/09/49306.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/49306.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/49306.html</trackback:ping><description><![CDATA[<h1><a name="_core_.2f.p"></a><sup></sup>/P&nbsp;&nbsp; (Preprocess to a File)</h1> <p> <object id="alink_1" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"><param name="Width" value="0"><param name="Height" value="0"><param name="Command" value=""></object><a href="">Home</a> |&nbsp; <a href="_core_overviews.3a_.compiling_and_linking.htm">Overview</a> |&nbsp; <a href="_core_set_compiler_options.htm">How Do I</a> |&nbsp; <a href="_core_compiler_reference.htm">Compiler Options</a></p> <p>This option writes preprocessor output to a file with the same base name as the source file, but with the .I extension. It adds #line directives to the output file at the beginning and end of each included file and around lines removed by preprocessor directives that specify conditional compilation. The preprocessed listing file is identical to the original source file, except that all preprocessor directives are carried out, and macro expansions are performed.</p> <p>This option suppresses compilation; CL does not produce an .OBJ file, even if the /Fo option is specified. The /P option also suppresses production of the alternate output files created by the /FA, /Fa, or /Fm option.</p> <p>The /P option is similar to the <a href="_core_.2f.e.htm">/E</a> and <a href="_core_.2f.ep.htm">/EP</a> options. Using /EP with /P suppresses placement of #line directives in the output file.</p> <p>The following table summarizes the actions of the /E, /EP, and /P options.</p> <table cols="3" cellpadding="5" rules="rows" border="1" frame="below"> <tbody> <tr valign="top"> <td class="label" width="15%"><b>Option</b></td> <td class="label" width="37%"><b>Preprocessor output <br>includes #line directives?</b></td> <td class="label" width="48%"><b>Output sent to</b></td></tr> <tr valign="top"> <td width="15%">/E</td> <td width="37%">Yes</td> <td width="48%">stdout</td></tr> <tr valign="top"> <td width="15%"><strong><font color="#800000">/P</font></strong></td> <td width="37%">Yes</td> <td width="48%">.i file</td></tr> <tr valign="top"> <td width="15%">/EP</td> <td width="37%">No</td> <td width="48%">stdout</td></tr> <tr valign="top"> <td width="15%">/E&nbsp; /EP</td> <td width="37%">No</td> <td width="48%">stdout</td></tr> <tr valign="top"> <td width="15%"><strong><font color="#800000">/P&nbsp; /EP</font></strong></td> <td width="37%">No</td> <td width="48%">.i file</td></tr></tbody></table> <p><br> <hr align="left" width="90%" size="1"> <i><font face="Verdana" size="-2"><a href="mailto:msdn@microsoft.com">Send feedback</a> to MSDN.</font></i> <object id="alink_301" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"><param name="Width" value="0"><param name="Height" value="0"><param name="Command" value=""></object><a href=""><i><font face="Verdana" size="-2">Look here</a> for MSDN Online resources</a>.</font></i>  <p></p> <p><font color="#ff0000" size="5">1、一般用<strong>/P&nbsp; /EP</strong>,这样就没有#line了，生成的是.i文件</font></p> <p><font color="#ff0000" size="5">2、利用这个，可以看有很多复杂宏，预编译之后的源代码，比如stl， boost等，#include的代码和相关代码，都会是被剥离后的，出现在同一个文件里，这个对于阅读代码比较有用。</font></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/49306.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-05-09 14:52 <a href="http://www.cppblog.com/woaidongmao/archive/2008/05/09/49306.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>