找不到“windows.h”之谜

今天要运行一个简单的C++程序,如下:
//C++ code  让任务管理器的CPU使用产生一条正弦曲线图
#include <Windows.h>
#include "stdlib.h"
#include "math.h"
#include <stdio.h>

const double SPLIT = 0.01;
const int COUNT = 200;
const double PI = 3.14159265;
const int INTERVAL = 300;
int main(int argc, char* argv[])
{
 DWORD busySpan[COUNT];  //array of busy times
 long int idleSpan[COUNT];  //array of idle times
 int half = INTERVAL / 2;
 double radian = 0.0;
 for(int i = 0; i < COUNT; i++)
 {
  busySpan[i] = (long int)(half + (sin(PI * radian) * half));
  idleSpan[i] = INTERVAL - busySpan[i];
  radian += SPLIT;
 }

 long int startTime = 0;       
 int j = 0;
 while (true)
 {
  j = j % COUNT;
  startTime = GetTickCount();
  while ((GetTickCount() - startTime) <= busySpan[j]) ;
  Sleep(idleSpan[j]);
  j++;
 }
 return 0;
}
由于比较简单,就直接用editplus编辑成task.cpp文件,想在控制台中用cl.exe直接编译一下运行。
1、将cl.exe的path环境设置。
我安装的是VS2008 Team版。所出将“C:/Program Files/Microsoft Visual Studio 9.0/VC/bin”添加至PATH环境变量中。具体设置:我的电脑->属性->高级->环境变量,在出现的环境变量对话框中,选择path变量,编辑即可。
2、如果这时你运行cl task.cpp,会出现“没有找到mspdb80.dll”的错误,所出要同时将mspdb80.dll的路径加入path环境变量。路径为:“C:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE”。
3、要在控制台中编译Win32程序,当然还得手动需设置include、lib环境变量(详细见http://blog.csdn.net/memory_xj/archive/2008/10/27/3156887.aspx),这很有点复杂,还好VS2008为我们将这些设置命令编成了vsvar32.bat文件,我们只需执行即可。
   在这里,我的噩梦来了。根据很多资料,包括著名的jjhou先生在《深入浅出MFC》中都指出应执行:C:/Program Files/Microsoft Visual Studio 9.0/VC/bin目录下的vsvars32.bat。如果程序中没有#include <windows.h>这一切是会很正常的。执行cl task.cpp出现了“fatal error C1034:windows.h:不包括路径集”的错误。从这里我就开始了很长一段时间的解决之路。
4、首先是搜索,看看这个windows.h究竟藏在什么地方。发现在“C:/Program Files/Microsoft SDKs/Windows/v6.0A/Include”中有一个,但这个目录和VS2008有什么关系呢?先不管,在include环境变量中加入这个目录,再cl编译一下,唉,又出现在这个windows.h中include的另一个头文件找不到了。当时,我以为这个目录是SDK的一个目录,应该和VS2008没有任何关系,就不想在这上面花功夫了,后来发现是错了,其实VS2008中的$(WindowsSdkDir)环境变量就是对应这个目录。如果根据错误提示,在include环境变量中一直将所需的目录添加上的话,可能也会很快解决windows.h的问题。
5、接着,脑子里竟冒出重装VS2008的想法,不过很快否定了,VS2008太大了。必竟是在控制台中编译,是不是SDK的问题呢?以下是找到的资料和我自己的理解:
    SDK即software develope kit(软件开发工具包),它包含了进行Windows软件开发的文档和API函数的输入库、头文件(因为API在动态链接库中,这些动态链接库是系统的组成部分因此不用再提供,而输入库和头文件则必须,这样才能在你的程序中使用API函数)。早期SDK是一个单独发放的包,现在在Visual C++和其他一些开发环境中已经包含了它。尽管很多同道说,SDK和VC(VS2005、VS2008等)是两套系统,但我倾向于认为SDK之于VS2008就象JAVA中JDK之于eclipse等开发工具一样,是开发工具的基础,
    (1)什么是Windows SDK?
Windows SDK是用来支持32位和64位Windows平台以及.NET框架编程模型的开发包。Windows SDK这个名字从Windows Vista开始使用,它包含以前Platform SDK中的所有内容,同时包含.NET框架的内容。
    (2)什么是Platform SDK?
Platform SDK(也简写作PSDK)是在Windows Vista之前的Windows操作系统开发包。PSDK不包含任何.NET框架编程模型的内容。现在,Windows SDK已经取代了PSDK。PSDK不会再有更新版本发布,尽管一些PSDK仍然可以在微软的网站上下载到.
    (3)Windows SDK与Platform SDK的区别?
    Windows SDK已经取代了Platform SDK。Platform SDK已经结束它的历史使命,不会再有更新。你可能因为某些原因还是要去使用老的Platform SDK。比如,你还在使用VC 6进行开发,那你就要去用2003年2月份发布的Windows Server 2003 PSDK,这是最后一个对VC 6开发提供全面支持的SDK。
6、想着,我就准备下载一个SDK安装一下试试了。从http://download.csdn.net/source/724093网址下载SDK的安装工具,安装,自动下载SDK并安装,成功。
   安装目录为C:/Program Files/Microsoft Platform SDK,windows.h赫然就在include目录中,高兴,在inclue环境变量中加入C:/Program Files/Microsoft Platform SDK/Include/crt(是windows.h中一个包含文件所需),C:/Program Files/Microsoft Platform SDK/Include在SDK安装时,选择设置环境变量就已加入到include中了。如果这时,cl编译,还会出现一个某某lib打不开的错误(呵,记不住名称了),不要紧,还是用搜索大法,会发现好几个,不过Platform SDK中没有,倒是VS2008中有一个,就将这个目录加入到lib环境变量中吧。cl编译一下,成功了!!
   在控制台中的环境变量的查看,添加可以参考文章:http://blog.csdn.net/memory_xj/archive/2008/10/27/3157187.aspx
7、至此,用Platform SDK编译成功了。但是想想也不甘心哪,必竟VS2008这样强横的系统,在控制台中竟搞不定windows.h的包含,没有天理哪!脑袋灵光一闪,在VS2008 IDE中,新建一个控制台Win32解决方案,选择空文件(没有预编译等),在源文件中新建一CPP文件,将代码拷贝至文件中。为了保险起见,我将include、lib环境变量中属于Platform SDK的删除。再生成解决方案,没有出现找不到windows.h的问题,成功!说明,VS2008完全有能力搞惦的。问题可能出现在我不知道怎样设置环境上。
8、看VS的环境变量:工具->选项->项目和解决方案->VC目录设置->显示以下内容的目录(选包含文件)。有好几个路径目录,还有VS定义的环境变量,如$(WindowsSdkDir),这个环境变量指向哪儿呢?在运行->cmd命令->set命令,完全没有这个$(WindowsSdkDir)环境变量哪,在哪儿看呢?
9、$(WindowsSdkDir)环境变量的内容要在VS2008的控制台中看,(VS2008还有专有控制台?没听说过),找找吧。在工具菜单中有一个“Visual studio 2005 command prompt”,可能这是这个,点击运行,嘿,可真出现一个控制台,用SET命令,发现$(WindowsSdkDir)就是指向哪个“C:/Program Files/Microsoft SDKs/Windows/v6.0A/Include”,等一等!!这个专用控制台在运行开始竟然执行了一个批处理文件,C:/Program Files/Microsoft Visual Studio 9.0/Common7/Tools/vsvars32.bat,在C:/Program Files/Microsoft Visual Studio 9.0/VC/bin不是也有一个vsvars32.bat。难道此bat非彼bat?
10、至此,心里明白离真相大白不远了。莫非是在cl编译执行C:/Program Files/Microsoft Visual Studio 9.0/Common7/Tools/目录中的vsvars32.bat。兴奋得小心抖抖,关掉VS2008 IDE,打开控制台,先执行C:/Program Files/Microsoft Visual Studio 9.0/Common7/Tools/vsvars32.bat,再cl task.cpp。WOW!OK!

   虽然,辛苦地转了一大圈,但真是学到很多,可知余心之欣慰!写一篇以兹纪念,呵呵!

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页