VS配置
2016-03-16 16:18
232 查看
VS配置
sf2gis@163.com
2012年7月23日
Path是默认的运行环境路径;
putev();
设置为“调试”属性页上“远程计算机”属性的值。有关更多信息,请参见更改用于 C/C++ 调试配置的项目设置。
$(References)
以分号分隔的引用列表被添加到项目中。
$(ConfigurationName)
当前项目配置的名称(例如“Debug”)。
$(PlatformName)
当前项目平台的名称(例如“Win32”)。
$(Inherit)
指定在由项目生成系统所撰写的命令行中,继承的属性出现的顺序。默认情况下,继承的属性出现在当前属性的末尾。
$(NoInherit)
使任何将被继承的属性不被继承。若还要避免同级级别的计算,请使用 $(StopEvaluating)。使用 $(NoInherit)会导致对于同一属性忽略任何出现的 $(Inherit)。
$(StopEvaluating)
立即停止计算链中宏的计算。出现在 $(StopEvaluating) 之后的任何值将不出现在宏的计算值中。如果$(StopEvaluating) 在 $(Inherit) 之前,计算链中当前位置的继承值将不会连接到宏值。$(StopEvaluating)是 $(NoInherit) 的功能超集。
$(ParentName)
包含此项目项的项的名称。该名称将是父文件夹名称或项目名称。
$(RootNameSpace)
包含应用程序的命名空间(如果有)。
$(IntDir)
为中间文件指定的相对于项目目录的目录路径。它解析为“中间目录”属性的值。
$(OutDir)
输出文件目录的路径,相对于项目目录。这解析为“输出目录”属性的值。
$(DevEnvDir)
Visual Studio .NET 的安装目录(定义形式:驱动器 + 路径);包括尾部的反斜杠“\”。
$(InputDir)
输入文件的目录(定义形式:驱动器 + 路径);包括尾部的反斜杠“\”。如果该项目是输入,则此宏等效于$(ProjectDir)。
$(InputPath)
输入文件的绝对路径名(定义形式:驱动器 + 路径 + 基本名称 + 文件扩展名)。如果该项目是输入,则此宏等效于 $(ProjectPath)。
$(InputName)
输入文件的基本名称。如果该项目是输入,则此宏等效于 $(ProjectName)。
$(InputFileName)
输入文件的文件名(定义为基本名称 + 文件扩展名)。如果该项目是输入,则此宏等效于 $(ProjectFileName)。
$(InputExt)
输入文件的文件扩展名。它在文件扩展名的前面包括“.”。如果该项目是输入,则此宏等效于 $(ProjectExt)。
$(ProjectDir)
项目的目录(定义形式:驱动器 + 路径);包括尾部的反斜杠“\”。
$(ProjectPath)
项目的绝对路径名(定义形式:驱动器 + 路径 + 基本名称 + 文件扩展名)。
$(ProjectName)
项目的基本名称。
$(ProjectFileName)
项目的文件名(定义为基本名称 + 文件扩展名)。
$(ProjectExt)
项目的文件扩展名。它在文件扩展名的前面包括“.”。
$(SolutionDir)
解决方案的目录(定义形式:驱动器 + 路径);包括尾部的反斜杠“\”。
$(SolutionPath)
解决方案的绝对路径名(定义形式:驱动器 + 路径 + 基本名称 + 文件扩展名)。
$(SolutionName)
解决方案的基本名称。
$(SolutionFileName)
解决方案的文件名(定义为基本名称 + 文件扩展名)。
$(SolutionExt)
解决方案的文件扩展名。它在文件扩展名的前面包括“.”。
$(TargetDir)
生成的主输出文件的目录(定义形式:驱动器 + 路径);包括尾部的反斜杠“\”。
$(TargetPath)
生成的主输出文件的绝对路径名(定义形式:驱动器 + 路径 + 基本名称 + 文件扩展名)。
$(TargetName)
生成的主输出文件的基本名称。
$(TargetFileName)
生成的主输出文件的文件名(定义为基本名称 + 文件扩展名)。
$(TargetExt)
生成的主输出文件的文件扩展名。它在文件扩展名的前面包括“.”。
$(VSInstallDir)
安装 Visual Studio .NET 的目录。
$(VCInstallDir)
安装 Visual C++ .NET 的目录。
$(FrameworkDir)
安装 .NET Framework 的目录。
$(FrameworkVersion)
Visual Studio 使用的 .NETFramework 版本。与 $(FrameworkDir) 相结合,就是 Visual Studio 使用的 .NET Framework 版本的完整路径。
$(FrameworkSDKDir)
安装 .NET Framework SDK 的目录。.NETFramework SDK 可作为 Visual Studio .NET 的一部分安装,也可单独安装。
$(WebDeployPath)
从 Web 部署根到项目输出所属于的位置的相对路径。返回与 RelativePath 相同的值。
$(WebDeployRoot)
指向 <localhost> 位置的绝对路径。例如,c:\inetpub\wwwroot。
$(SafeParentName)
有效名称格式的直接父级的名称。例如,窗体是 .resx 文件的父级。
$(SafeInputName)
作为有效类名的文件的名称,但不包括文件扩展名。
$(SafeRootNamespace)
项目向导将在其中添加代码的命名空间名称。此命名空间名称将只包含在有效的 C++ 标识符中允许的字符。
$(FxCopDir)
fxcop.cmd 文件的路径。fxcop.cmd 文件不和所有的 Visual C++ 版本一起安装。
参考:http://www.cnblogs.com/lidabo/archive/2012/05/29/2524170.html
http://my.oschina.net/u/243648/blog/53073
int main(int argc, char **argv, char **envp)
{
char *p;
while ((p = *envp++))
printf("%s\n", p);
return 0;
}
可以添加自己的用户自定义宏;但使用时,必须重启vs才能生效;
就可以使用用户自定义宏
在linker的debug中设置Generate Debug info为Yes(/Debug);
CRT作为产品,可以有多种版本,最初只有静态单线程版本,其它版本都是它的变体。
libc.lib:静态单线程版(原始版本,VS2005之后MS已经不再发布) /ML
libcmt.lib:静态多线程版 /MT _MT
msvcrt.lib/msvcrXX.dll:动态多线程版 /MD _MT _DLL
msvcmrt.lib:混合的静态多线程版 /clr 或/clr:oldSyntax
msvcurt.lib:纯托管的静态多线程版/clr:pure
以及相应的debug版(release版+d)
libcmtd.lib /MTd _DEBUG _MT
msvcrtd.lib/msvcrXXd.dll /MDd _DEBUG _MT _DLL
参考:
http://www.cnblogs.com/chio/archive/2007/11/26/972152.html
http://msdn.microsoft.com/zh-cn/library/abx4dbyh.aspx
http://blog.csdn.net/wzsbll/article/details/6338907
http://www.cnblogs.com/eddyshn/archive/2009/11/23/1608823.html
CRT如果是动态的,则DLL和调用进程使用同一个CRT,不会出现堆问题。
CRT如果是静态的,各个DLL和调用进程使用CRT独自包含,如果是同一个CRT,则进程只会加载一个CRT,不会出现堆问题;如果不是同一个CRT,则进程会加载多个CRT,那么就会出现堆问题,但编译不会出现问题。注意:这里的不同CRT包括不同版本(如vc8/vc9)和不同类型(msvcrt/msvcrtd)。
因此,应该是谁分配谁释放的原则。
如果是动态的,则不同的DLL需要用同一个CRT库,如果不同则会出现问题。
实验:
错误:HEAP[win32TestDlg.exe]: Invalid address specified toRtlFreeHeap( 00550000, 00B51440 )
参考:http://blog.csdn.net/wzx19840423/article/details/6535785
http://blog.sina.com.cn/s/blog_4c451e0e0100u9gu.html
sf2gis@163.com
2012年7月23日
1 环境变量
环境变量是操作系统设置的运行环境的参数;Path是默认的运行环境路径;
1.1 在VC中设置与获取环境变量
getev();putev();
1.1.1 常用环境变量
$(RemoteMachine)设置为“调试”属性页上“远程计算机”属性的值。有关更多信息,请参见更改用于 C/C++ 调试配置的项目设置。
$(References)
以分号分隔的引用列表被添加到项目中。
$(ConfigurationName)
当前项目配置的名称(例如“Debug”)。
$(PlatformName)
当前项目平台的名称(例如“Win32”)。
$(Inherit)
指定在由项目生成系统所撰写的命令行中,继承的属性出现的顺序。默认情况下,继承的属性出现在当前属性的末尾。
$(NoInherit)
使任何将被继承的属性不被继承。若还要避免同级级别的计算,请使用 $(StopEvaluating)。使用 $(NoInherit)会导致对于同一属性忽略任何出现的 $(Inherit)。
$(StopEvaluating)
立即停止计算链中宏的计算。出现在 $(StopEvaluating) 之后的任何值将不出现在宏的计算值中。如果$(StopEvaluating) 在 $(Inherit) 之前,计算链中当前位置的继承值将不会连接到宏值。$(StopEvaluating)是 $(NoInherit) 的功能超集。
$(ParentName)
包含此项目项的项的名称。该名称将是父文件夹名称或项目名称。
$(RootNameSpace)
包含应用程序的命名空间(如果有)。
$(IntDir)
为中间文件指定的相对于项目目录的目录路径。它解析为“中间目录”属性的值。
$(OutDir)
输出文件目录的路径,相对于项目目录。这解析为“输出目录”属性的值。
$(DevEnvDir)
Visual Studio .NET 的安装目录(定义形式:驱动器 + 路径);包括尾部的反斜杠“\”。
$(InputDir)
输入文件的目录(定义形式:驱动器 + 路径);包括尾部的反斜杠“\”。如果该项目是输入,则此宏等效于$(ProjectDir)。
$(InputPath)
输入文件的绝对路径名(定义形式:驱动器 + 路径 + 基本名称 + 文件扩展名)。如果该项目是输入,则此宏等效于 $(ProjectPath)。
$(InputName)
输入文件的基本名称。如果该项目是输入,则此宏等效于 $(ProjectName)。
$(InputFileName)
输入文件的文件名(定义为基本名称 + 文件扩展名)。如果该项目是输入,则此宏等效于 $(ProjectFileName)。
$(InputExt)
输入文件的文件扩展名。它在文件扩展名的前面包括“.”。如果该项目是输入,则此宏等效于 $(ProjectExt)。
$(ProjectDir)
项目的目录(定义形式:驱动器 + 路径);包括尾部的反斜杠“\”。
$(ProjectPath)
项目的绝对路径名(定义形式:驱动器 + 路径 + 基本名称 + 文件扩展名)。
$(ProjectName)
项目的基本名称。
$(ProjectFileName)
项目的文件名(定义为基本名称 + 文件扩展名)。
$(ProjectExt)
项目的文件扩展名。它在文件扩展名的前面包括“.”。
$(SolutionDir)
解决方案的目录(定义形式:驱动器 + 路径);包括尾部的反斜杠“\”。
$(SolutionPath)
解决方案的绝对路径名(定义形式:驱动器 + 路径 + 基本名称 + 文件扩展名)。
$(SolutionName)
解决方案的基本名称。
$(SolutionFileName)
解决方案的文件名(定义为基本名称 + 文件扩展名)。
$(SolutionExt)
解决方案的文件扩展名。它在文件扩展名的前面包括“.”。
$(TargetDir)
生成的主输出文件的目录(定义形式:驱动器 + 路径);包括尾部的反斜杠“\”。
$(TargetPath)
生成的主输出文件的绝对路径名(定义形式:驱动器 + 路径 + 基本名称 + 文件扩展名)。
$(TargetName)
生成的主输出文件的基本名称。
$(TargetFileName)
生成的主输出文件的文件名(定义为基本名称 + 文件扩展名)。
$(TargetExt)
生成的主输出文件的文件扩展名。它在文件扩展名的前面包括“.”。
$(VSInstallDir)
安装 Visual Studio .NET 的目录。
$(VCInstallDir)
安装 Visual C++ .NET 的目录。
$(FrameworkDir)
安装 .NET Framework 的目录。
$(FrameworkVersion)
Visual Studio 使用的 .NETFramework 版本。与 $(FrameworkDir) 相结合,就是 Visual Studio 使用的 .NET Framework 版本的完整路径。
$(FrameworkSDKDir)
安装 .NET Framework SDK 的目录。.NETFramework SDK 可作为 Visual Studio .NET 的一部分安装,也可单独安装。
$(WebDeployPath)
从 Web 部署根到项目输出所属于的位置的相对路径。返回与 RelativePath 相同的值。
$(WebDeployRoot)
指向 <localhost> 位置的绝对路径。例如,c:\inetpub\wwwroot。
$(SafeParentName)
有效名称格式的直接父级的名称。例如,窗体是 .resx 文件的父级。
$(SafeInputName)
作为有效类名的文件的名称,但不包括文件扩展名。
$(SafeRootNamespace)
项目向导将在其中添加代码的命名空间名称。此命名空间名称将只包含在有效的 C++ 标识符中允许的字符。
$(FxCopDir)
fxcop.cmd 文件的路径。fxcop.cmd 文件不和所有的 Visual C++ 版本一起安装。
参考:http://www.cnblogs.com/lidabo/archive/2012/05/29/2524170.html
http://my.oschina.net/u/243648/blog/53073
1.2 main()函数的第三个参数,一般会用来传递环境变量
可以通过读取第三个参数char**来读取环境变量;int main(int argc, char **argv, char **envp)
{
char *p;
while ((p = *envp++))
printf("%s\n", p);
return 0;
}
2 用户自定义宏
2.1 在vs中使用$(myMac)引用;
2.2 设置方法
2.2.1 全局宏变量
在系统属性->环境变量中->用户变量->新建可以添加自己的用户自定义宏;但使用时,必须重启vs才能生效;
2.2.2 局部宏变量
在property manager中添加一个propertysheet,在其中添加user macro;就可以使用用户自定义宏
3 property sheet
vs创建windows程序时,默认创建一个corewindowsliberaries的property sheet;其中定义了window工程的必要lib;使用时只要选中additional dependences中的inherits from parent and project default就能直接继承这些内容了;4 设置lib的文件目录
在link->general->additional library directories里设置lib的路径,可以将lib的目录加到当前的临时系统目录中,将目录中的lib文件名加到input的additional dependence中就可以了;5 如果在Release下进行调试
设置C/C++中General->Debug InformationFormat为Program Database(/zi);在linker的debug中设置Generate Debug info为Yes(/Debug);
6 CRT版本
6.1 概述
CRT:C Runtime Libray,C运行时库。起源于Microsoft开发时为了实现系统平台开发的C静态库,并以此为基础开发了Windows了。而后根据C++扩展为C/C++ 运行时库,并实现了C/C++标准库。在加入了Windows的平台特性后,实现了Windows的相关功能,并失去了可移植性。Windows的API是CRT的Windows应用接口(WindowsAPI以CRT为基础)。在多核CPU的环境下,开发了多线程的CRT,并在VS2005后不再支持单线程的CRT(MS认为多线程效率接近单线程)。后来又提出了托管的C++(有啥意思?),发布了mix和pure的CRT。CRT作为产品,可以有多种版本,最初只有静态单线程版本,其它版本都是它的变体。
libc.lib:静态单线程版(原始版本,VS2005之后MS已经不再发布) /ML
libcmt.lib:静态多线程版 /MT _MT
msvcrt.lib/msvcrXX.dll:动态多线程版 /MD _MT _DLL
msvcmrt.lib:混合的静态多线程版 /clr 或/clr:oldSyntax
msvcurt.lib:纯托管的静态多线程版/clr:pure
以及相应的debug版(release版+d)
libcmtd.lib /MTd _DEBUG _MT
msvcrtd.lib/msvcrXXd.dll /MDd _DEBUG _MT _DLL
参考:
http://www.cnblogs.com/chio/archive/2007/11/26/972152.html
http://msdn.microsoft.com/zh-cn/library/abx4dbyh.aspx
http://blog.csdn.net/wzsbll/article/details/6338907
http://www.cnblogs.com/eddyshn/archive/2009/11/23/1608823.html
6.2 CRT、DLL以及Heap
MS对CRT的堆策略是,在同一个进程中,对每一个CRT创建一个堆。也就是如果同一个进程中使用了两个CRT,则有两个单独的堆;如果同一个进程中使用了一个CRT,那么只有一个堆。CRT如果是动态的,则DLL和调用进程使用同一个CRT,不会出现堆问题。
CRT如果是静态的,各个DLL和调用进程使用CRT独自包含,如果是同一个CRT,则进程只会加载一个CRT,不会出现堆问题;如果不是同一个CRT,则进程会加载多个CRT,那么就会出现堆问题,但编译不会出现问题。注意:这里的不同CRT包括不同版本(如vc8/vc9)和不同类型(msvcrt/msvcrtd)。
因此,应该是谁分配谁释放的原则。
如果是动态的,则不同的DLL需要用同一个CRT库,如果不同则会出现问题。
实验:
DLL_CRT-Version | DLL-CRT_TYPE | exe_CRT-Version | exe-CRT_TYPE | 堆问题 |
11 | /md(or/mt) | 11 | /mt(or/md) | 无 |
10 | /mt(or/md) | 11 | /mt(or/md) | 有 |
11 | /mdd(or/mtd) | 11 | /mt(or/md) | 有 |
错误:HEAP[win32TestDlg.exe]: Invalid address specified toRtlFreeHeap( 00550000, 00B51440 )
参考:http://blog.csdn.net/wzx19840423/article/details/6535785
http://blog.sina.com.cn/s/blog_4c451e0e0100u9gu.html
相关文章推荐
- VC中CDC、HDC、pDC区别与联系及相互转换
- VC实现获取当前正在运行的进程
- vc中SendMessage自定义消息函数用法实例
- VC实现让关闭按钮成灰色不可用的方法
- VC++中的字体设置方法详解
- VC程序设计中CreateProcess用法注意事项
- VC实现批量删除指定文件的方法
- vc中使用SendMessage自定义消息函数
- vc提示unexpected end of file found的原因分析
- vc获取计算机名和ip地址的方法
- VC6.0实现读取Excel数据的方法
- VC下通过系统快照实现进程管理的方法
- VC实现Windows多显示器编程的方法
- 使用VS开发 Node.js指南
- vs 不显示行号的操作方法
- VC下实现fopen支持中文的方法
- 解析VC中预编译头文件的深入分析
- linux vs linux的优势
- VC WinExec打开指定程序或者文件的方法
- 先装VS再装IIS时出错的解决方法