链接器—常规—输出文件
这里的输出文件指的是最终生成的exe文件
C/C+±–常规—附加包含目录
这里指的是需要include的一些头文件所在的 目录,可以提前在项目文件中建立好include文件,然后在这里设置,以后将一些自定义的include头文件放在这个文件夹下
提前在项目文件夹下建立好include文件夹
链接器–常规—附加库目录
这里指的是lib文件存放的目录,可以提前在项目文件夹下,先把lib文件夹设置好。
同时还要设置好lib文件的名字
在链接器—输入—附加依赖项中,将lib文件加进去
这里就类似于代码中
#pragma comment(lib, “learnVS.lib”)
同时,所需的dll文件可以放在exe文件同级目录下
配置属性—常规
输出目录:这里指的是输出exe文件所在的目录,也可以提前设定好bin文件
中间目录:这里指的是中间生成的临时文件,可以提前设定好temp文件
目标文件名:就是生成的exe文件的名字
配置属性—平台工具集
Visual Studio的版本有很多种,打开不同的项目文件所需要VS版本不一致,高版本兼容低版本,因此可以设定打开的VS版本来编译项目。
VS各版本对应的工具集版本号如下:
-Visual Studio 2019: V142
-Visual Studio 2017: V141
-Visual Studio 2015: V140
-Visual Studio 2013: V120
-Visual Studio 2012: V110
-Visual Studio 2010: V100
-Visual Studio 2008: V90
-Visual Studio 2005: V80
-Visual Studio 2003: V71
-Visual Studio 2002: V70
-Visual Studio 6: V60
配置属性—常规—项目属性值—字符集
- 多字节字符集:
字符的宽度可以是一个字节也可以是两个字节;对于英语单词而言,一个英语单词占用一个字节,但是对于中文这些而言,不属于最早的ASCII字符,一个中文占用两个字节;多字节占用内存小,但是查找速度会变慢; - Unicode字符集:
统一将字符都占用两个字节;英文字符会在高位补0;Unicode查找字符更快,但是占用内存会变大;国际上为了通用更多语言,会优先使用Unicode字符集;
因字符集不同,所以一些代码注意事项:
(1) _T宏可以把一个引号引起来的字符串,根据你的环境设置,使得编译器会根据编译目标环境选择合适的(Unicode还是ANSI)字符处理方式;
比如说:cout << _T(“你好”) << endl;
L" “的作用是将ANSI字符串转为Unicode字符串,
比如:cout << L"你好” << endl;
(2)wchar_t与char的区别:
char占用一个字节,可用字符串处理函数:strcat( ),strcpy( ), strlen( )等以str打头的函数。wchar_t 占用两个字节,可用字符串处理函数:wcscat(),wcscpy(),wcslen()等以wcs打头的函数。为了让编译器识别Unicode字符串,必须以在前面加一个“L”,例如: wchar_t *szTest=L"This is a Unicode string";
配置属性—常规—MFC的属性
有三种选择:
(1)使用标准 Windows库:即不使用MFC;
(2)在静态库中使用MFC:程序编译时把用到的MFC DLL 的二进制代码编译到exe中,这样的话程序的体积较大,但优点是不需要计算机使用特定的MFC的dll文件。
(3)在共享DLL中使用MFC:程序编译时不会把MFC DLL的二进制代码编译到exe中,这样的话程序的体积较小,但缺点是在没有MFC DLL的机器上运行会出现错误:“无法启动程序……,由于应用程序配置不正确,未能启动此应用程序。”
C/C++ —预处理器—预处理器定义
WIN32、_DEBUGE、_UNICODE等其实是一些宏定义,在这里写上这些,相当于在本工程所有的文件中都写上了:
#define WIN32
#define _DEBUG
#define _UNICODE
这样,就可以达到一个多一个同一个代码在不同的配置环境在编译的结果文件不一样,从而实现跨平台。比如,在VC中,因为要有的环境是UNICODE,有些则不是,同一份代码为了在两种环境下都可以用,那么就会有以下宏定义(其实这就是twhar.h中的代码):
#ifdef _UNICODE
typedef wchar_t TCHAR;
#define __T(x) L##x
#define _T(x) __T(x)
#else
#define __T(x) x
typedef char TCHAR;
#endif
C/C++ —预处理器—代码生成—启用增强指令集
可选用 流式处理 SIMD 扩展 2 (/arch:SSE2) (/arch:SSE2)、 流式处理 SIMD 扩展 2 (/arch:SSE2) (/arch:SSE2) 进行加速
C/C++ —预处理器—代码生成—运行库
可以采用的方式有:多线程(/MT)、多线程调试(/MTd)、多线程DLL(/MD)、多线程调试DLL(/MDd)、单线程(/ML)、单线程调试(/MLd)
-
MT选项
链接LIB版的C和C++运行库。在链接时就会在将C和C++运行时库(LIBCMT.LIB、LIBC.LIB)集成到程序中,程序体积会变大。 -
MTd选项
LIB的调试版。 -
MD选项
使用DLL版的C和C++运行库,这样在程序运行时会动态的加载对应的DLL,程序体积会减小,缺点是在系统没有对应DLL时程序无法运行(需添加MSVCPxx.DLL、MSVCRxx.DLL)。 -
MDd选项
表示使用DLL的调试版。
带T的链接静态库lib;带D链接动态库dll;带d为调试版本,库名加d
运行库选择错误时,会有以下几种状况:
(1)LNK2038
当引用的库和当前项目设置的运行库不一致时,会出现error LNK2038: 检测到“RuntimeLibrary”的不匹配项…
(2) LNK2005
当引用的库或当前的库有一个使用/MT时,会出现error LNK2005:…
所以若当前VC项目不引用其他VC项目,则可以使用任意一种运行库选项;若需要引用其他VC项目,则所有的项目都需设置运行库选项为/MD。
链接器—常规—启动增量链接
一般的,Debug版本开启增量链接,会在源代码基础上增加代码,不会重新编排变量的内存地址,生成时不会全部重新编译,缺点是使代码臃肿;Release是关闭开启增量链接,编译Lib时会重新编译,重新分配变量的内存地址;
保存设置好的VS项目属性
有时候可以将自己配置的VS文件的项目属性保存下来,供另一个项目文件调用,这样就不需要重复更改项目属性了,也方便别人VS项目文件属性不一致,导致编译失败;
- 新建工程属性
打开视图—其他视图—属性管理器
在四种模式下选择一种,添加新项目属性表
会得到一个props文件,另一个项目可以在这里加载这个文件,就会自动得到项目的属性设置了;