当前位置: 首页 > news >正文

vs项目配置

Visual Studio项目目录和文件说明

Visual Studio项目属性配置

VS6.0以及之前的版本是非常旧了,跟VS2002以及之后的版本有非常大的差别。

VS2002之后,虽然每个版本都有变化。但是思想上已经非常成熟了。

vc5、6的工程文件是.dsp

vc2002-2008工程文件是vcproj

vc2010之后是vcxproj

vcproj和vcxproj都是xml格式的。

VS使用解决方案管理项目,一个解决方案下可以包含多个项目
默认情况下,VS解决方案总目录下包含sln和一个项目文件夹,在编译器中生成debug和release解决方案后,总目录下还会生成对应的debug和release目录(存放的是中间编译文件obj)。

补充:vs中建立默认的C#项目和建立默认的C++项目生成的目录结构是不一样的。

如果是C#项目,则解决方案总文件夹下就只包含解决方案配置文件sln和一个项目总文件夹(共两个东东),而项目总文件夹下包含c#源文件、项目配置文件proj、一个Properties属性文件夹、一个obj文件夹和一个bin文件夹,其中obj和bin文件夹下都包含debug和release两个文件夹。obj文件夹下存放中间编译结果(扩展名更加项目类型而不同),而bin文件夹下存放最终生成的结果(扩展名一般为exe或dll)。

而如果是C++项目,则解决方案总文件夹下就只包含解决方案配置文件sln和一个项目总文件夹和一个Debug文件夹以及一个Release文件夹(共四个东东,其中Debug和Release文件夹中存放最终生成的结果exe或dll,要注意如果不使用Release生成,则不存在Release文件夹),而项目总文件夹下包含C++源文件头文件、项目配置文件和一个Debug文件夹以及一个Release文件夹(一定要注意,此处的Debug和Release文件夹仅仅存放中间编译结果obj,不存放exe和dll之类的东西。如果不使用Release编译,则没有对应的Release文件夹)。

由此可见,c#项目默认生成的文件目录结构更合理,且输出的exe位于总项目文件夹内,而c++项目默认exe位于解决方案总文件夹下。另外c#更合理在,C#使用Bin目录,在Bin目录下包含debug和release两个目录,而C++不使用Bin目录,直接使用debug和releae两个目录。

下面结合例子讲一下:solution为创建的解决方案,demo为创建的项目

解决方案solution总目录如下:

ipch目录内的文件和.sdf文件是visual studio用来保存预编译的头文件Intellisense用的,删除这些文件对于工程开发完全没有影响。不能提交svn

.opensdf看名字就差不多知道意思了,好像只有打开工程的时候才会出现,关闭就会消失,估计是sdf的临时文件。不能提交svn

.sln(Visual Studio.Solution)通过为环境提供对项目、项目项和解决方案在磁盘上的位置的引用,可以将他们组织到解决方案中。需要提交svn

.suo(solution user option)解决方案用户选项,记录所有将与解决方案建立关联的选项,存储了用户对界面的自定义配置,包括布局、断点、打开的文件等。不能提交svn

项目demo目录如下:

.vcxproj项目文件

.vcxproj.filters用于项目下文件的虚拟目录,需要提交到svn

.vcxproj.user用户的一些相关配置,不能提交svn

除了这些,在Debug和Release目录下,还有一些文件。

.exe可执行文件

.exp导出库文件的文件,只有dll工程才有,包含了导出函数和数据项信息。链接工具使用这类文件来创建动态链接库。

.def告知编辑器不要以microsoft编译器的方式处理函数名,而以指定的某方式编译导出函数,这样可以避免由于VC++编辑器的独特处理方式引起的链接错误。

.ilk增量编译(incremental linking),取消增量编译可以不生成这种文件,对于大工程来说可能会变慢。

.pdb帮助软件调试的文件

.manifest文件为了解决不同的程序调用相同名称的但是不同版本的dll产生的问题。

解决方案属性说明

debug版本和release版本:

Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序

Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。

Debug和Release的真正秘密,在于一组编译选项。

Debug版本

参数 含义 
/MDd、/MLd或/MTd 使用Debug runtime library(调试版本的运行时函数库) (d代表debug),MD调用多线程动态库,MT调用多线程静态库 
/Od  关闭优化开关(d代表deny,拒绝)
/D   "_DEBUG" 相当于 #define _DEBUG,打开编译调试代码开关 (主要针对assert函数) 
/ZI  创建Edit and continue(编辑继续)数据库,这样在调试过程中如果修改了源代码不需重新编译
/GZ  可以帮助捕获内存错误 
/Gm  打开最小化重链接开关,减少链接时间

Release 版本

参数 含义 
/MD、/ML或/MT 使用发布版本的运行时函数库,MD调用多线程动态库,MT调用多线程静态库 
/O1或/O2 优化开关,使程序最小或最快 
/D "NDEBUG" 关闭条件编译调试代码开关 (即不编译assert函数) 
/GF 合并重复的字符串,并将字符串常量放到只读内存,防止被修改 
实际上,Debug和 Release并没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动。
事实上,我们甚至可以修改这些选项,从而得到优化过的调试版本或是带跟踪语句的发布版本。 

Win32和X64

会生成不同的程序,调用dll的时候,可能要指定对应的版本32位或64位。
字长可能也会影响,X64的程序时不能再win32上面运行的。

解决方案的属性

通用属性:要在解决方案的属性才能看见,在项目的属性是无法看见的。

启动项目: 设置默认启动的项目,可以设置单个项目,多个项目和当前选择项目。
项目依赖项: 设定当前项目依赖的项目,以决定具体生成解决方案时项目编译的顺序
代码分析设置:设置不同的代码生成的规则,其实我也不是很懂。https://msdn.microsoft.com/zh-cn/library/azure/hh419387(v=vs.110).aspx
调试源文件: 默认只制定了MFC的调试文件包含哪些,如果是自己的文件,必须有debug版的二进制文件、.pdb文件,以及源码,必须对应上。

配置属性:要在解决方案的属性才能看见,在项目的属性是无法看见的。

配置:配置各个项目的配置(debug和release)、平台(win32和x64)、是否生成、部署

项目属性页-常规

常规

对一些变量进行赋值,编译的时候回用到。这些变量,好多都是顾名思义的。

--输出目录:$(OutDir)这个路径只是起到定义OutDir这个变量的作用(该目录是生成.exe文件的目录)
--中间目录:$(IntDir)中间目录(该目录是中间文件的目录)
--目标文件名:通常就是工程名$(ProjectName)
--目标文件扩展名:后缀名,一般就是.exe、.dll之类
--清除时要删除的扩展名生成-清理解决方案,清除的时候回将这些后缀名的文件都清理掉。
--生成日志文件:这个是生成程序的日志文件,不是程序运行中的日志文件。
--平台工具集:我用的是Visual Studio 2013 (v120)。可以选择使用哪个编辑器。不知道装了2010的话,有没有2010的选项。
--启用托管增量生成:是否使用托管增量生成

一般设置上面的目录,如果不记得某个宏变量的值,可以点击“宏(M)>>”来查看。如图:

既然我们修改了输出文件的目录,那我们也必须修改我们的调试目录,不然就无法调试了。不信你运行一下试试,虽然编译通过了,但并没像你想的那样出现控制台的“黑窗口”,原因就是我们没有修改调试目录:

将调试目录修改为$(OutDir)就可以了,$(OutDir)就是我们之前在常规里设置的输出文件的目录:

这里面的命令参数一项也是比较重要的,如果你开发的是一个带有命令行参数的项目,你调试的时候就可以在这里设置传给程序的命令行参数来进行调试了。你是否还记得你运行一个带有命令行参数的程序时是出现一个黑框框然后马上就消失了,什么也不会做,除非你是将该程序拖到命令提示符下运行。

这些设置完后,可以先编译运行一下程序,结果如下所示:

程序可以正常调试,还会在解决方案的根目录下生成我们设置的输出文件的目录:Win32\Debug\Bin,生成的.exe文件就在该目录下。还有中间文件目录:Win32\Debug\XXX,里面放的都是生成的中间文件。如果你的这个项目里用到了其他的库,你还需要像下面这样设置你的项目的附加包含目录附加库目录:前者是设置其他库的.h头文件的目录,一般放在库的include文件夹下后者是设置其他库的lib以及.dll链接库的目录,一般放在库的lib下。如下:

 

最后你还必须设置项目的附加依赖项的值:一般设置的就是xx.lib静态链接库的名称。

项目默认值

--配置类型:选择生成的文件类型。动态库dll,静态库lib,应用程序exe,还有个生成文件和实用工具不知道干嘛的
--MFC的使用:标准Windows库,静态MFC库,动态MFC库
--字符集一般都设置Unicode,还有未设置,多字节编码
--公共语言运行时支持:决定是否是托管程序,“无公共语言运行时支持”表示是非托管程序。
--全程序优化:一些优化选项,估计是编译的时候给一些建议之类
--Windows应用商店支持:可能移动应用会有用,不过应该没几个人开发windows的移动应用吧。

项目属性页-调试

调试:所有属性都是给调试的时候使用的,如果不是调试中,是不会起作用的。

--要启动的调试器:貌似可以选择远程的调试器
--命令:表示调试器要启动的exe文件的全名。默认值为$(TargetPath),点击那个绿色三角形就是调用这个命令的。
--命令参数启动程序的时候,传递给程序的参数,最终会传递进main函数的参数列表,至于什么格式,就看程序怎么写的了。
--工作目录:默认是工程目录的,程序用到的dll要放到这个目录下
--附加:指定调试器是否应尝试在启动调试时附加到现有进程
--调试器类型:指定使用的调试器类型。设置成自动时,则将根据exe文件的内容选择调试器类型。
--环境:应该是添加一些环境变量。指定调试器的环境,或要与现有环境合并的变量。
--合并环境:将指定的环境变量与现有环境合并。
--SQL调试:附加SQL调试器。
--Amp默认快捷键:重写C++AMP的默认快捷键选择。调试托管代码时不适用该属性。

项目属性页-VC++目录

VC++目录时全局属性:所有项目都有效

--可执行文件目录:生成VC++项目期间,搜索可执行文件时使用的路径。对应于PATH环境变量
--包含目录:生成VC++项目期间,搜索源代码中引用的包含文件的目录。对应于INCLUDE环境变量。(包含的头文件目录,即寻找#include<xxxx.h>中的xxxx.h的搜索目录
--引用目录:生成VC++项目期间,搜索元数据文件时使用的路径。对应于LIBPATH环境变量(即寻找.lib文件的搜索目录)。LIBPATH 重写环境库路径。链接器将首先在该选项所指定的路径中搜索,然后在 LIB 环境变量中所指定的路径中搜索
--库目录:生成VC++项目期间,搜索库文件时使用的目录。对应于LIB环境变量
--Windows运行库目录:生成VC++项目期间,搜索winmd元数据文件时使用的路径。将“引用目录”串联到LIBPATH。

winmd元数据文件是使用Microsoft接口定义语言(MIDL )创建的文件,包含元数据,它表示自定义的Windows运行时组件的API ,写的DLL文件格式,但并没有包含像传统的.DLL文件中的代码,它的格式是使用的.NET框架。
要创建WINMD文件,请使用MIDLRT编译器。
WINMD文件位于C:\ WINDOWS\SYSTEM32\WinMetadata\ 。

winmd文件可以让js、C#和C++都可以调用,dll只能是C#来调用。

--源目录:搜索用于IntelliSense的源文件的目录。

--排除目录检查生成依赖项时,不会搜索的目录

项目属性页-C/C++

C/C++:仅对当前项目有效

常规:

附加包含目录:指定一个或多个要添加到include路径中的目录;当目录不止一个时,请用分号分隔。     (/I[路径])(寻找#include<xxxx.h>中的xxxx.h的搜索目录(每一项对应一个文件夹XXXX,文件夹中包含了编译时所需的头文件,使用时直接#include<XXXX>即可)
其他#using指令:指定一个或多个为解析传递给 #using 指令的名称而要进行搜索的目录(用分号分隔目录名)。 (/AI[路径])
调试信息格式:

:不产生任何调试信息,因此编译较快
程序数据库(/Zi):产生并包含用于调试器的 类型信息符号调试信息的程序数据库(PDB)。不影响优化,暗示了debug。 信息放在pdb文件而不是obj文件
C7兼容(/Z7):生成包含用于调试器的完整 符号调试信息的.obj文件。 符号调试信息包括变量的名称和类型以及函数和行号。不会生成.pdb文件。
用于编辑并继续的程序数据库(/Zi):改了之后还可以继续调试,很多优化与这个并不兼容。

公共语言运行时支持:使用.NET运行时服务。
使用Windows运行时扩展:使用 Windows 运行时语言扩展。  (/ZW)
取消显示使用版权标志:取消显示登录版权标志,不知道是哪里的版权
警告等级
关 : 关闭所有警告(/W0) : 关闭所有警告消息的显示。 
1 级(/W1) : 显示严重的警告消息。 
2 级(/W2) : 显示等级 1 警告以及某些不太严重的警告,如关于隐藏类成员的警告。这是命令行中的默认警告等级。
3 级(/W3) : 显示等级 2 警告以及某些不太严重的警告,如有关总是计算为真或假的表达式的警告。 
4 级(/W4) : 显示所有等级 3 警告以及信息性警告
启用所有警告:一般不需要这么严格
SDL检查:sdl(安全开发生命周期),这个东西在2012版推出的,为了更好监管开发者代码安全,会严格按照SDL的规则编译代码,会有一些以前常用的函数无法通过编译。

多处理器编译:针对多核使用的

优化:

/O 选项控制有助于创建具有最高速度或最小大小的代码的各种优化。(O:optimize优化)
/O1 为获得最小大小而优化代码。
/O2 为获得最高速度而优化代码。
/Ob 控制内联函数展开。
/Od 禁用优化,从而加快编译并简化调试。(d应该是deny拒绝的意思)
/Og 启用全局优化。(g:global)
/Oi 为适当的函数调用生成内部函数。
/Os 通知编译器优选大小优化而非速度优化。
/Ot(默认设置)通知编译器优选速度优化而非大小优化。
/Ox 选择完全优化。
/Oy 取消在调用堆栈上创建框架指针,以更快地进行函数调用。

内联函数扩展:选择生成的内联函数扩展级别 
/Ob0 禁用内联扩展。默认情况下,扩展由编译器自行对所有函数进行(通常称为自动内联)。
/Ob1 仅允许对标记为 inline、__inline 或 __forceinline 的函数或是在类声明中定义的 C++ 成员函数中进行扩展。
/Ob2 默认值。允许对标记为 inline、__inline 或 __forceinline 的函数或是编译器选择的任何其他函数进行扩展。

启用内部函数:用有助于应用程序更快运行的内部函数或其他特殊形式的函数替换某些函数调用。
使用内部函数的程序比较快,因为它们没有函数调用系统开销。但是,由于创建了附加代码,它们可能比较大

优化大小和速度
/Os(代码大小优先)通过指示编译器优选大小而非速度来最小化 EXE 和 DLL 的大小。 编译器可以将许多 C 和 C++ 构造缩小为功能类似的机器码序列。 这些差异有时在大小和速度之间提供了折中。 /Os 和 /Ot 选项允许在二者之间指定一个首选项:
/Ot(代码速度优先)通过指示编译器优选速度而非大小来最大化 EXE 和 DLL 的速度。(这是默认设置。)编译器可以将许多 C 和 C++ 构造缩小为功能类似的机器码序列。 这些差异有时在大小和速度之间提供了折衷。 “最大化速度”(/O2) 选项隐含 /Ot 选项。 /O2 选项组合若干个选项以产生速度非常快的代码。
如果使用 /Os 或 /Ot,还必须指定 /Og 以优化代码。

省略帧指针:
此选项可以加快函数调用的速度,因为无需设置和移除任何框架指针。它还可以使一个或多个寄存器(Intel 386 或更高版本上的 EBP)空闲出来,以便存储频繁使用的变量和子表达式。
/Oy 启用框架指针省略,而 /Oy- 禁止省略。 /Oy 仅在 x86 编译器中可用。
如果代码需要基于 EBP 进行寻址,可以在 /Ox 选项后指定 /Oy– 选项,或使用带“y”和 off 参数的 optimize,以便通过基于 EBP 的寻址获得最大程度的优化。 编译器可检测大部分需要基于 EBP 的寻址的情况(例如,使用 _alloca 和 setjmp 函数以及使用结构化异常处理的情况)。

启用纤程安全优化:
通过线程本地存储区 (TLS) 数组引用用 __declspec(thread) 声明的数据。 TLS 数组是系统为每个线程维护的地址数组。 此数组中的每个地址提供线程本地存储区数据的位置。
纤程是轻量对象,由堆栈和寄存器上下文组成,并可安排在各种线程上。 纤程可以在任意线程上运行。 因为纤程可能会交换出去并且稍后在不同的线程上重新启动,所以 TLS 数组的地址不得缓存或优化为函数调用中的公共子表达式(有关详细信息,请参见 /Og(全局优化) 选项)。 /GT 阻止此类优化。

全程序优化:
全程序优化允许编译器用有关程序中所有模块的信息执行优化。 如果不执行全程序优化,则基于每个模块 (compiland) 执行优化。
默认情况下,权全程序优化是关闭的,因此必须显式地启用它。 但是,也可以用 /GL- 显式地禁用它。
使用有关所有模块的信息,编译器能够:
跨越函数边界优化寄存器的使用。
更好地跟踪对全局数据的修改,允许减少加载和存储的数目。
更好地跟踪可能由取消指针引用所修改的项组,减少加载和存储的数目。
在模块中内联某个函数,即使该函数在另一个模块中定义。

预处理器:一些宏定义的相关操作


预处理器定义:定义源文件的预处理符号,其实就是定义了一些宏。
取消预处理器定义:指定取消一个或多个预处理器定义。估计填了就单个取消掉,为了方便调试代码
取消所有预处理器定义:取消了之前定义的所有宏
忽略标准包含路径:禁止编译器在INCLUDE环境变量指定的目录中搜索包含文件。
预处理到文件:预处理C和C++源文件并将预处理的输出写入到文件此选项将取消编译,因此不会生成obj文件。
预处理取消显示行号:预处理时不使用#line指令。
保留注释:从源代码取消注释条,要求设置“预处理”选项之一

代码生成:

启用字符串池允许编译器在执行过程中,在程序影像和内存中创建相同字符串的单个只读副本,从而生成较小的程序。
启用最小重新生成:
在首次编译期间,编译器在项目的.idb文件中存储源文件(c++源文件)和类定义(c++头文件)之间的依赖关系信息。 (依赖关系信息表明每个源文件所依赖的类定义以及该定义位于哪个.h 文件中。)后面的编译使用存储在.idb 文件中的信息确定是否需要编译某个源文件(即使它包含已修改的 .h 文件)。
最小重新生成依赖于类定义不会在包含文件之间更改。类定义对于项目必须是全局的(对于给定类应只有一个定义),因为.idb 文件中的依赖关系信息是为整个项目创建的。如果项目中的某个类有多个定义,请禁用最小重新生成
由于增量链接器不支持通过使用 /ZW(Windows 运行时编译) 选项将 Windows 元数据包含在 .obj 文件中,因此 /Gm 选项与 /ZW 不兼容。

启用C++异常:/EH{s|a}[c][r][-]  指定将由编译器使用的异常出来模型
a
同时捕获异步(结构化)和同步 (C++) 异常的异常处理模型。
s
仅捕获 C++ 异常并通知编译器假定声明为 extern "C" 的函数可能引发异常的异常处理模型。
c
如果与 s (/EHsc) 一起使用,则仅捕获 C++ 异常并通知编译器假定声明为 extern "C" 的函数从未引发 C++ 异常。
/EHca 与 /EHa 相等。
r
告知编译器始终为所有 noexcept 函数生成运行时终止检查。 默认情况下,如果编译器确定该函数仅调用非引发函数,则运行时检查 noexcept 可能被优化掉。

较小类型检查:启动或禁用运行时检测功能
基本运行时检测:执行基本运行时错误检查,与除调试以外的任何优化类型不兼容。     (/RTCs, /RTCu, /RTC1)
 

运行库:指定运行库以进行链接,即运行的时候要链接的库函数。    (/MD[d]、/ML[d]、/MT[d]、/LD[d])

选项 说明
多线程DLL(/MD)(MT和DLL):定义_MT和_DLL以便同时标准.h文件中选择运行时例程多线程特定版本DLL 特定版本。此选项还使编译器将库名 MSVCRT.lib 放入 .obj 文件中(相当于在.h或.cpp中加入#pragma comment(lib, "MSVCRT.lib"))。用此选项编译的应用程序静态链接到 MSVCRT.lib。该库提供允许链接器解析外部引用的代码层。实际工作代码包含在 MSVCR71.DLL 中,该库必须在运行时对于与 MSVCRT.lib 链接的应用程序可用。 
多线程调试DLL(/MDd)(MT、DLL、debug):定义 _DEBUG、_MT 和 _DLL,以便从标准 .h 文件中选择运行时例程的调试多线程特定版本DLL 特定版本。它还使编译器将库名 MSVCRTD.lib 放入 .obj 文件中。
多线程(/MT)(Make Thread):定义 _MT,以便从标准头 (.h) 文件中选择运行时例程的多线程特定版本(函数库的多线程版本)。此选项还使编译器将库名 LIBCMT.lib 放入 .obj 文件中,以便链接器使用 LIBCMT.lib 解析外部符号。创建多线程程序需要 /MT 或 /MD(或它们的调试等效选项 /MTd 或 /MDd)。
多线程调试(/MTd):定义 _DEBUG 和 _MT。定义 _MT 会导致从标准 .h 文件中选择运行时例程的多线程特定版本。此选项还使编译器将库名 LIBCMTD.lib 放入 .obj 文件中,以便链接器使用 LIBCMTD.lib 解析外部符号。创建多线程程序需要 /MTd 或 /MDd(或它们的非调试等效选项 /MT 或 MD)。

注:libcmt.lib是windows环境下vc提供的静态运行时库(多线程);msvcrt.lib是动态运行时库。​​​​​​​

结构成员对齐 /Zp[1|2|4|8|16]  

当指定此选项时,第一个结构成员后的每个结构成员将存储在成员类型大小或 n 字节边界(其中 n 为 1、2、4、8 或 16)两者中较小的一个边界上
下表描述了可用的值。
1针对 1 字节边界将结构打包。 与 /Zp 相同。
2针对 2 字节边界将结构打包。
4针对 4 字节边界将结构打包。
8针对 8 字节边界将结构打包(默认设置)。
16针对 16 字节边界将结构打包。
除非有特定的对齐要求,否则不应使用此选项。

安全检查 /GS[-] 
默认情况下,/GS 处于打开状态。 如果希望应用程序不出现安全漏洞,请使用 /GS-。

启用函数级链接 /Gy[-]  
链接器要求单独打包为 COMDAT 的函数在 DLL 或 .exe 文件中排除或安排各个函数。
可以使用链接器选项 /OPT(优化) 从 .exe 文件中排除未引用的封装函数。
可以使用链接器选项 /ORDER(按顺序放置函数)按指定顺序将封装函数包括在 .exe 文件中。
如果内联函数作为调用进行实例化(例如,当关闭内联或获取函数地址时出现这种情况),则始终打包内联函数。 另外,在类声明内部定义的 C++ 成员函数会自动打包;其他函数不会如此,所以需要选择此选项以便将它们作为封装函数编译。
用于“编辑并继续”的 /ZI 选项会自动设置 /Gy 选项。

启用并行代码生成
当编译器自动对循环进行并行化代码,它在多个处理器内核之间分布的计算。 循环并行化仅当编译器确定它是以合法的方式执行,并且并行化会提高性能。

启用增强指令集
根据具体硬件的特性选择对应的CPU指令集,可以最优化速度。

浮点模型 /fp:[precise | except[-] | fast | strict ]  
通过禁用可更改浮点计算精度的优化,可提高等式和不等式的浮点测试的一致性。

启用浮点异常
可靠的浮点异常模型。 异常在触发后立即引发。 默认情况下关闭此选项。 将减号追加到此选项将显式禁用它。

创建可热修补映像 /hotpatch 

当 /hotpatch 用于编译时,编译器确保每个函数的第一个指令为至少两个字节,这是热修补的要求。

语言


禁用语言扩展 /Za 
Visual C++ 编译器提供许多在 ANSI C 或 ANSI C++ 标准中指定的那些功能以外的功能。
这些功能统称为 C 和 C++ 的 Microsoft 扩展。 这些扩展在指定 /Za 选项时不可用。
如果打算将程序移植到其他环境,请禁用语言扩展。

将WChar_t视为内置类型 /Zc:wchar_t[-]  
如果 /Zc:wchar_t 处于打开状态,wchar_t 将映射到 Microsoft 专用本机类型 __wchar_t。 
如果指定了 /Zc:wchar_t-(带有一个减号),wchar_t 将映射到 unsigned short 的 typedef。 
C++ 标准要求 wchar_t 是内置类型。

强制For循环范围中的合规性 /Zc:forScope[-]  就是决定变量在超出for循环之后,是否还存在

启用运行时类型信息 /GR[-]  
当 /GR 启用时,编译器将定义 _CPPRTTI 预处理器宏。 
默认情况下,/GR 处于打开状态。 
/GR- 将禁用运行时类型信息。
如果编译器无法在代码中静态解析对象类型,则使用 /GR。 
当代码使用 dynamic_cast 运算符 或 typeid 时,通常需要 /GR 选项。 
但是,/GR 会导致映像的 .rdata 节增大。 
如果您的代码不使用 dynamic_cast 或 typeid,则使用 /GR- 可能会生成较小的映像。

OpenMP支持
#pragma omp 用于指定 Directives 和 Clauses。 
如果未在编译中指定 /openmp,编译器将忽略 OpenMP 子句和指令。 
即使未指定 /openmp,OpenMP 函数调用也由编译器处理。

链接器

常规->附加库目录:寻找.lib文件的搜索目录。允许用户重写环境路径库LIBPATH。

输入->附加依赖项:指定要添加到链接命令行的附加项,如kernel32.lib库(C++的库会把函数、类的声明放在*.h中,实现放在*.cpp或*.cc中。编译之后,*.cpp,*.cc,*.c会被打包成一个.lib文件,这样可以保护源代码)

常见问题:

1.包含目录和附加包含目录(库目录和附加库目录)的区别:

包含目录:修改了系统的include宏的值,是全局的;
附加包含目录:用于当前项目,对其他项目没有影响。附加的意思就是额外的,对包含目录或库目录的一个补充。

(库目录和附加库目录的区别同上)

2.可知包含目录和附加包含目录(库目录和附加库目录)的区别主要在于全局还是当前,那么当需要对某工程添加这些目录时,通常情况下,都是在附加包含目录和附加库目录中添加的。

要使用一个库,除了要include其头文件以外(附加包含目录),还要在链接过程中把lib加进去(附加库目录、附加依赖项)。

添加方法:

附加包含目录---添加工程的头文件目录:项目->属性->配置属性->C/C++->常规->附加包含目录:加上头文件的存放目录

附加库目录---添加文件引用的lib静态库路径:  项目->属性->配置属性->链接器->常规->附加库目录:加上lib文件的存放目录

附加依赖项---添加工程引用的lib文件名:  项目->属性->配置属性->链接器->输入->附加依赖项:加上lib文件名(相当于在代码中插入了linker注释,#pragma comment(lib, "abc.lib"))

源文件中只需声明原型就可以了,寻找真正的函数实现(就是找到符号地址)是链接器的工作。编译器都会将printf的定义所在的lib库设定为默认链接,你不管它,它就默默给你加上去了。如果你使用一些非默认的lib,就需要你手工告诉连接器了,比如,当你使用输入法的相关API,就要加入Imm32.lib,这需要你人工在链接器(linker)选项里加入。同理,你自己做的lib,也要你手工引入。
你也可以在代码里插入linker注释,
(不同编译器写法不尽相同)
#pragma comment(lib, "abc.lib")
这样其实是在预处理阶段做了一个记录,让最后的链接阶段做这个操作而已。
但我不建议你使用这种预处理注释,还是老老实实地在工程属性的linker选项里加入需要链接的lib。

3.当需要向项目中添加.dll动态链接库时,直接将需要添加的.dll文件拖拽到项目生成的.exe所在的文件夹下即可(项目->属性->配置属性->常规->输出目录,可以看到.exe生成在哪个目录下)。

4.在添加上述几个目录的路径的时候,可以看到$(xxxx),这就是宏了,可以点开右下角的宏查看这些分别代表什么字符串。

这里写图片描述

相关文章:

  • VS项目属性的一些配置项的总结
  • 引入Irvine32库
  • vs2019安装教程
  • cef3 Binary Distributions下载及示例编译
  • VS2019直接编译cmake项目
  • C++调用构造函数的方式
  • chrome和Chromium有什么区别
  • C++ 函数指针及delegate的几种方法
  • C++中 模板Template的使用
  • c++函数后加冒号
  • CEF-概述和常用功能介绍(GeneralUsage翻译)
  • 引用计数
  • CEF之多进程调试
  • 理解WebKit和Chromium: Content API和CEF3
  • C++ explicit关键字详解
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • CSS 三角实现
  • eclipse(luna)创建web工程
  • IP路由与转发
  • Objective-C 中关联引用的概念
  • PermissionScope Swift4 兼容问题
  • Protobuf3语言指南
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • python3 使用 asyncio 代替线程
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • 多线程 start 和 run 方法到底有什么区别?
  • 二维平面内的碰撞检测【一】
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 记一次和乔布斯合作最难忘的经历
  • 解析带emoji和链接的聊天系统消息
  • 前端知识点整理(待续)
  • 系统认识JavaScript正则表达式
  • 运行时添加log4j2的appender
  • 再次简单明了总结flex布局,一看就懂...
  • 智能合约开发环境搭建及Hello World合约
  • Android开发者必备:推荐一款助力开发的开源APP
  • FaaS 的简单实践
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • (1)Nginx简介和安装教程
  • (175)FPGA门控时钟技术
  • (pytorch进阶之路)扩散概率模型
  • (补)B+树一些思想
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (一)kafka实战——kafka源码编译启动
  • (转)编辑寄语:因为爱心,所以美丽
  • (转)甲方乙方——赵民谈找工作
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .skip() 和 .only() 的使用
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • @JoinTable会自动删除关联表的数据
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116