您的位置:首页 > 其它

VS配置

2016-03-16 16:18 232 查看
VS配置
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息