VS2008(2010)开发C++
命令行执行vc的用法参见:
http://blog.csdn.net/memory_xj/archive/2008/10/27/3156781.aspx
VS 2008 找不到“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。OK!
安装vs2008 的时候,已经自动安装了SDK 其默认是安装在C:\Program Files\Microsoft SDKs\Windows 很遗憾的是VS2008附带的SDK是简装版的,没有例子
问题和解决办法:
The Microsoft Windows SDK is a set of tools, code samples, documentation, compilers, headers, and libraries that developers can use to create applications that run on Microsoft Windows operating systems. The Windows SDK combines two formerly separate SDKs: the Platform SDK (PSDK) and the .NET Framework SDK. For more information on the Windows SDK, visit our MSDN Developer Center.
Installing Win SDK for Svr 2008 after VS 2008 breaks VS command line build environment
Issue: After installing the Windows SDK for Server 2008, you are no longer able to build at the VS2008 command line. You receive an error that csc, vbc, and/or msbuild commands are not recognized. You are able to build without problems in the VS IDE.
Cause: The VC++ compilers that install with the Windows SDK overwrite vcvars32.bat improperly.
Workaround: Repair the VS2008 command line build environment by editing c:\Program Files\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat manually.
Close all instances of Visual Studio:
1. Use Notepad to edit the file %\Program Files\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat. Change the top few lines where the variables are set.
Change these lines:
@SET VSINSTALLDIR=C:\Program Files\Microsoft Visual Studio 9.0
@SET VCINSTALLDIR=C:\Program Files\Microsoft Visual Studio 9.0\VC
@SET FrameworkDir=Framework32
@SET FrameworkVersion=v2.0.50727
@if "%VSINSTALLDIR%"=="" goto error_no_VSINSTALLDIR
@if "%VCINSTALLDIR%"=="" goto error_no_VCINSTALLDIR
to the following, in order to set the correct path to the frameworkdir:
@SET VSINSTALLDIR=c:\Program Files\Microsoft Visual Studio 9.0
@SET VCINSTALLDIR=c:\Program Files\Microsoft Visual Studio 9.0\VC
@SET FrameworkDir=c:\Windows\Microsoft.NET\Framework
@SET FrameworkVersion=v2.0.50727
@SET Framework35Version=v3.5
@if "%VSINSTALLDIR%"=="" goto error_no_VSINSTALLDIR
@if "%VCINSTALLDIR%"=="" goto error_no_VCINSTALLDIR
2. Open the VS command line build environment and verify that you can build successfully.
Please email us directly if you need additional help.
Karin Meier
Windows SDK Program Manager
VS2008,VISTA系统
--------------------------------------------------------------------------------------------
【1】 有关OPENGL
--------------------------------------------------------------------------------------------
安装了VS2008后,在目录
C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\gl 下:
GLU.h, GL.h, GLAUX.h
在目录
C:\Program Files\Microsoft SDKs\Windows\v6.0A\lib有对应的
OpenGL32.lib
如果需要其他lib库,就必须装SDK了,
我装了nVidiaOPENGL的SDK。
在目录C:\Program Files\NVIDIA Corporation\NVIDIA OpenGL SDK 10\external下有Include文件夹和Lib文件夹
Include:gl\:glut.h, zlib.h, png.h 等几个图像头文件
Lib: glut32.lib, libpng.lib
这样看来,glut.h --> glut32.lib
--------------------------------------------------------
在做项目移植时,如下变化
-------VC6用的库 ------------------------》》》》 ------------- VS2008 --------------------
(1)DirectX8的
dxguid.lib -----------> ---- (same)
d3dx8.lib -----------> d3dx9.lib
ddraw.lib -----------> -----
(2)OPENGL的
opengl32.lib -----------> ----
glu32.lib -----------> X(delete)
glaux.lib -----------> X
----------> glut32.lib
(3)第三方自己开发的IMAGE库
zlib.lib -----------> -----
cimage.lib -----------> ximage.lib (用的CxImage)
jpeg.lib -----------> ----
png.lib -----------> ----
(4) 多媒体库
winMM.lib ----------->----
----------------------------------------------------------
头文件变化
#include "gl\gl.h" ----------> #include "gl.h"
#include "gl\glu.h" -----------> X
#include "gl\glaux.h" -----------> x
-----------> #include "glut.h"
以上说明
老版本:
glu.h ---> glu32.lib
glaux.h ---> glaux.lib
以上这些都用新版本的
glut.h ----> glut32.lib
来替代了
【注意】glu和glut的区别。
保留核心库和头文件(C:\Program Files\Microsoft SDKs\Windows\v6.0A)
gl.h -----> Opengl32.lib
-----------------------------------------------------------------------------------------
【2】 有关 DirectX
---------------------------------------------------------------------------------------------
VC6老版本用的是DX8,移植到VS2008,我换成DX9
Vista系统其实自带了DX10,还有DX9,但是,如果不装开发包SDK的话
只有头文件d3d9.h和d3d10.h,找不到需要的d3d9x.h
装了之后,
VC6头文件 ------> VS2008头文件
--------------------------------------------------
d3d8.h ------------> d3d9.h
d3dx8.h ------------> d3dx9.h
本来以为这样改之后会没有问题,没想到出了大问题。原来DX8和DX9的函数根本不一样,
不仅仅是函数名中的8要改成9,其实函数体也有不同,比如参数个数不同。由于我不熟悉
整个程序,所以根本没法移植下去。
比如
LPDIRECT3D8 ----> LPDIRECT3D9
头文件地址:
C:\Program Files\Microsoft SDKs\MicroSoft DirectX SDK (NOV 2008)\include
静态链接库地址LIB,需要 ( dxguild.lib, d3dx9.lib, ddraw.lib )
C:\Program Files\Microsoft SDKs\MicroSoft DirectX SDK (NOV 2008)\Lib\x86
---------------------------------------------------------------------------------------------
【3】CIMAGE的问题。
----------------------------------------------------------------------------------------------
首先,原始代码作者用的CIMAGE的库不知道是从哪里来的。
头文件包含
#include "cimage.h"
我试着用2个办法来解决这个问题。
(1)把它改成 #include "atlimage.h"
谁知道根本不行,很多函数都在ATLIMAGE中找不到,报下列错误:
error C2039: 'ReadFile' : is not a member of 'ATL::CImage'
error C2039: 'Stretch' : is not a member of 'ATL::CImage'
error C2039: 'GetEffWidth' : is not a member of 'ATL::CImage'
error C2039: 'GetDepth' : is not a member of 'ATL::CImage'
error C2039: 'GetRGB' : is not a member of 'ATL::CImage'
(2)用CxImage,这个没办法,试试看
把头文件改成 #include "ximage.h",当然,用这个之前要指定有关lib的位置。
谁知道一样报错找不到函数:
error C2039: 'ReadFile' : is not a member of 'CxImage'
error C2039: 'SaveFile' : is not a member of 'CxImage'
error C2039: 'implementation' : is not a member of 'CxImage'
error C2039: 'GetRawImage' : is not a member of 'CxImage'
error C2661: 'CxImage::Stretch' : no overloaded function takes 9 arguments
对CxImage来说,对应有Load, Save等。
在atlimage时,虽然有SaveFile和Implementation,但是都不是专门用在图像处理的函数。用错了。
总结:很显然,3套图像处理库互不兼容,根本没办法。原来这套代码是2001年左右的,那时候
没有atlimage.h所以,会出现有第3方和MS存在SaveFile这些重叠的函数。
[原文发表地址] C++ enhancements in VS 2010
[原文发表时间] Friday, November 21, 2008 8:36 AM
作为我的VS2010和.net 框架4的系列博客之一, 今天我们来看看为Visual C++ 中Native开发人员提供的新功能.
在我早先的一篇博客中, 我提到了Visual C++团队为帮助Native开发人员更好地在Windows平台上进行开发而做的巨大努力. 今年初我们发布了Visual C++ 2008 Feature Pack, 就是这项努力的成果之一. Visual Studio 2010沿着这个方向继续发展以帮助C++开发人员提高开发效率, VS2010主要致力于对IDE的整体使用体验进行重大改进,以及对语言和类库的改进来为C++开发人员提供更强大的功能.
Native C++应用程序近年来已变得更大更复杂. VS2010可以帮助C++开发人员很好地开发拥有大量代码的C++程序. 其中一个重大的改进是智能感知 (IntelliSense). IDE大量功能都有使用到的智能感知引擎, 经过了重要的架构修正, 主要解决了处理大型应用程序时效率较低的问题. 一个主要的例子是在编辑较大的codebase中的源文件时,IDE仍能保持响应状态. 源代码的编辑不再触发symbol数据库大规模的更新, 即使是处理很复杂的源代码依赖关系时. 经常编辑多层次include的头文件的Visual C++开发人员或经常切换项目配置的开发人员将会明显感觉到IDE响应性能的重大改进.
另一个Visual C++的改进在于构建系统. 在VS2010中, MSBuild 将会成为Visual C++ 编译的构建系统. MSBuild 提供强大的定制性、扩展性和日志功能,这些都是大型复杂的构建环境中非常关键的要素。MSBuild的日志功能可以将原先对经常构建的项目进行跟踪的代价高而琐碎事务变得非常容易。另外,扩展性功能提供了多个不同版本的编译器,从VS2010的IDE中您可以看到下图所示:
日益复杂的C++应用程序对工具和效率提出了更高的要求。VS2010提供了一组新的IDE高效工具, 帮助您轻松地了解复杂的Codebase。智能感知和浏览的功能都经过了修正,不仅能处理大型程序,而且变得更加准确和富有弹性。新的头文件依赖关系工具能提供给您更多于复杂的include层次关系的具体细节。新的快速搜索功能帮助您快速定位到一个symbol或文件,您只需输入名字的一部分并回车即可。
在类库和语言方面,VS2010的一个重要改进是并行性。使用VS2010,C++开发人员可以高效地写出并行计算的代码,因为新的C++语言在并行方面引入了一系列类库和新功能的支持. VS2010提供了Parallel Patterns Library (PPL),它提供了一个抽象层充分利用多核的硬件来构建响应性能良好的C++应用程序。PPL提供了一种表达并行机制的高效的方法,并且还提供了新的异步通信API以帮助您提高应用程序的弹性和健壮性。VS2010提供了新的语言特性包括未来的C++0x标准,例如lamda表达式,并重定义了“auto”关键字使得基于PPL的代码更整洁更易维护。最后,VS2010还提供了更多的对使用MFC构建的Windows应用程序的支持,VS2010为MFC提供了一系列很棒的特性比以往更容易地利用Windows Vista以及之后的Windows7的特性。使用内置的重启管理器,MFC应用程序能轻松获得从非预期的应用程序失败中恢复未储存的应用程序数据的功能。任务对话框的支持将使得MFC应用能开发出更丰富的用户界面,以取代冗长的消息对话框。
这些年来,我们听到很多C++开发人员一直将过去的Visual C++6.0 时代认为是Visual C++开发工具的辉煌时代。很多人怀念那个时候敏捷高效的IDE。在Visual C++ 2010中,我们努力开创一个高效Visual C++ IDE的新时代。我们将这个IDE与强大的C++语言支持、类库的巨大改进一起在VS2010中呈现给大家。
您可以在团队的blog中看到更多Visual C++的信息,并可在blog上与团队交流。
如何打包程序请参考:
http://hi.baidu.com/285ru/blog/item/e59ed150754e7a6a8435245f.html
一般更改VS2005路径都是通过打开VS2005,然后选择”Tool”, “Options”, “Projects and Solutions”, “VC++ Directories”,然后手动添加或删除include, library, source路径。
当经常需要批量更改路径时,以上手动步骤就太繁琐,太麻烦了。其实VS2005把这些路径设置存在CurrentSettings.vssettings文件中。这个文件通常放在My Documents\Visual Studio 2005\Settings下。
可以以文本方式打开文件,可以看到它是一个xml格式,查找如下路径可以找到include, library, source的设置:
---------------------------------------------------------------------------------------
<UserSettings>
<ToolsOptions>
<ToolsOptionsSubCategoryname="VCDirectories"……>
<PropertyValue name="IncludeDirectories"> …</PropertyValue>
<PropertyValue name="LibraryDirectories"> …</PropertyValue>
<PropertyValue name="SourceDirectories"> …</PropertyValue>
---------------------------------------------------------------------------------------
把里面的内容整理一下,显示如下:
---------------------------------------------------------------------------------------
Win32
|
$(VCInstallDir)lib;
$(VCInstallDir)atlmfc\lib;
$(VCInstallDir)atlmfc\lib\i386;
$(VCInstallDir)PlatformSDK\lib;
$(FrameworkSDKDir)lib;
$(VSInstallDir);
$(VSInstallDir)lib;
D:\works\ACE\ACE_wrappers\lib;
D:\local_vap\VAPLib;
D:\local_vap\MsXml3\lib;
D:\local_vap\Adfin\lib\mrv
|
Pocket PC 2003 (ARMV4)
|
$(VSInstallDir)SmartDevices\SDK\PocketPC2003\lib\ARMV4;
$(VCInstallDir)ce\atlmfc\lib\ARMV4;
$(VCInstallDir)ce\lib\ARMV4;
|
Smartphone 2003 (ARMV4)
|
$(VSInstallDir)SmartDevices\SDK\SmartPhone2003\lib\ARMV4;
$(VCInstallDir)ce\atlmfc\lib\ARMV4;
$(VCInstallDir)ce\lib\ARMV4;
---------------------------------------------------------------------------------------
可以看到他以|分隔开了不同的小块,其中第二个小块就是我们在VC中的include设置路径,前面几条是VC默认的,后面以D:开头的就是个人后面添加的。手动改变这些字符就可以达到通过VC更改同样的效果。
在这里,我通过perl和dos的批处理自动进行include, library, src路径的自动改变。
首先,创建一个文本文件,填入我们需要的路径设置:<span class
评论