菜鸟笔记
提升您的技术认知

Visual Studio基本使用

安装

软件下载关联地址(老版本要求登录,新版本是在线安装)VS2017 VS2019

Visual Studio 2022 路线图 | Microsoft Docs   (工具站MSDN, 我告诉你 - 做一个安静的工具站)

配置安装选项

VS2008按下选项 > X64编译器和工具 - VS2008配置x64平台,即64位编译器,如下:

默认安装根目录

 - VS2013:C:\Program Files (x86)\Microsoft Visual Studio 12.0

 - VS2015:C:\Program Files (x86)\Microsoft Visual Studio 14.0

 - VS2017:C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional(专业版安装目录)

 - VS2019:C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional(专业版安装目录)

Visual Studio Installer

 VS2017、VS2019使用在线安装,增加了Visual Studio Installer(在开始菜单里面或者下面的路径)

 Visual Studio Installer:C:\Program Files (x86)\Microsoft Visual Studio\Installer

 语言包:点击 安装 或者 更多-> 修改 找到语言包 选择语言(使用vcpkg需要安装英语)

 VSTO:进入Installer,单个组件选项的搜索框,搜索VSTO安装

关于在线安装下载缓慢或者0B/s,可将DNS从114.114.114.114(国内的DNS地址)备用地址改成8.8.8.8或8.8.4.4(谷歌公司的DNS地址)

卸载

老版本卸载,从 Releases · microsoft/VisualStudioUninstaller · GitHub

下载Setup.ForcedUninstall.exe,并以管理员运行,输入Y,等待完成...

VS2017、VS2019可通过Visual Studio Installer卸载不同模块

编译

sln编译

  脚本编译解决方案,即脚本自动编译sln文件(VS2019无VSxxCOMNTOOLS类似环境变量,需手动指定)

# VS对应的环境变量存在,并不代表已经安装,还得看devenv.exe和devenv.com是否存在
VS90COMNTOOLS=c:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\
VS120COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\
VS140COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\
VS2017INSTALLDIR=C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional

# Visual Studio 2013 (2008 2015类似)
set VCENV="%VS120COMNTOOLS%..\IDE\devenv.com"
# Visual Studio 2017
set VCENV="%VS2017INSTALLDIR%\Common7\IDE\devenv.com"

# 编译解决方案 
%VCENV% G:\wesproject\wes-textengine\Src\Text.sln /ReBuild "Debug|x64" 
/Out "Window-Debug-x64-log.txt"

# 清理解决方案 
%VCENV% G:\wesproject\wes-textengine\Src\Text.sln /Clean "Debug|x64" 
/Out "Window-Debug-x64-log.txt"

# 查看帮助
%VCENV% /?

nmake编译

  make调用nmake,make.bat如下:

@echo off

if "%1"=="check" GOTO CHECK
if "%1"=="clean" GOTO CLEAN

copy /y Win32\config.h src\config.h
copy /y Win32\unistd.h examples\unistd.h

nmake -f Win32\Makefile.msvc
goto END


:CHECK
nmake -f Win32\Makefile.msvc check
goto END

:CLEAN
nmake -f Win32\Makefile.msvc clean
goto END

:END

  Makefile.msvc文件参考https://github.com/erikd/libsamplerate/blob/master/Win32/Makefile.msvc

  vs的makefile文件说明

# 引用shell命令,如erase和echo
-@erase -@echo 
# 定义变量和引用变量
CPP=cl.exe $(CPP)
# 包含目录 VC目录和WinSDK目录
# -   VC目录VS2013包含目录如下:
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include
# -   WinSDK目录WinSDK8.1包含目录如下:
C:\Program Files (x86)\Windows Kits\8.1\Include\um
C:\Program Files (x86)\Windows Kits\8.1\Include\shared
C:\Program Files (x86)\Windows Kits\8.1\Include\winrt
# 库目录 VC目录和WinSDK目录
# -   VC目录VS2013库目录如下:
# --  x86
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib
# --  x64
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib\amd64
# -   WinSDK目录WinSDK8.1包含目录如下:
# --  x86
C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86
# --  x64
C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x64

编译器直接编译

  启动cmd,配置编译器cl环境

# VS2013编译器(VS2010和VS2015类似)
call "%VS120COMNTOOLS%"vsvars32.bat
# VS2017编译器
call "%VS2017INSTALLDIR%\Common7\Tools\VsDevCmd.bat"
# VS2019编译器x64架构编译器(若选择x86,可不加后面参数)
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\Tools\VsDevCmd.bat" -arch=amd64

  编译链接脚本

# 
cl /c /I. /Iffmpeg\include /DWIN64 /W3 /WX- /wd4996 /GS /GR /Zi /Od /MDd /EHsc /nologo main.cpp
#
link main.obj /LIBPATH:. /LIBPATH:.\ffmpeg\include /DYNAMICBASE avformat.lib avcodec.lib /DEBUG /MACHINE:X64 /SUBSYSTEM:CONSOLE /PDB:main.pdb /OUT:main.exe

调试

库调试两种方式

1. 启动调试

  库工程属性 > 配置属性 > 调试 > 命令

     指定运行程序(包含目录和运行程序)

2. 附加调试

  菜单 > 调试 > 附加到进程 

     从列表中指定运行程序,然后附加

release下调试四步设置

  1. C/C++ --> 常规 --> 调试信息格式 --> 程序数据库 (/Zi) ;
  2. C/C++ --> 常规 --> 优化 --> 优化 --> 已禁用 (/Od);
  3. 链接器 --> 常规--> 启动增量链接 --> 是 (/INCREMENTAL);
  4. 链接器 --> 调试 --> 生成调试信息 --> 生成调试信息 (/DEBUG)。

调试技巧

   行号右键可添加条件断点和操作断点(vs2017可以),操作断点输出 {变量名},右键变量可增加值更改中断

  调试 > 窗口

   模块窗口 - 可查看库名称,加载路径,是否加载符号,以及加载的符号文件,右键可加载符号

   堆栈窗口 - 

   并行堆栈 - 

   显示诊断工具 - 

设置

工程属性

解决方案资源管理器 > 右键工程 > 选择属性 > 属性页界面(或 主菜单 > 调试 > xxx属性 > 属性页界面)

常规

  • 输出目录               $(OutDir)
  • 中间目录               $(IntDir)
  • 目标文件名            $(TargetName)
  • 目标文件扩展名     $(TargetExt)
  • 生成日志文件         编译链接命令日志
  • 平台工具集             Visual Studio 2013 (v120)

调试

  • 命令                        启动程序全路径
  • 命令参数                 程序启动参数
  • 工作目录                 默认$(ProjectDir),通常修改为$(OutDir)
  • 环境                        PATH=$(QTDIR)\bin%3b$(PATH)或PATH=$(QTDIR)\bin;$(PATH)

 C/C++

→ 常规

  • 附加包含目录          /I[路径]
  • 调试信息格式          /Zi 常用
  • 警告等级                  /W0 - /W4 /Wall IDE的默认/W3命令行默认/W1,/W禁止显示所有警告,/Wall显示所有警告
  • 将警告视为错误       /WX-
  • 多处理编译              /MP

→ 优化

  • 优化                         /Od /O1 /O2 /Ox   禁止 大小最小化  速度最小化  完全优化

→ 预处理                         

  • 预处理器定义           /D "_DEBUG"

→ 代码生成

  • 启动C++异常            /EHsc 同步异常处理模型
  • 运行库                      /MDd /MD /MTd /MT
  • 结构成员对齐           /Zp[数字]
  • 启用增强指令集     
  • 浮点模型                  /fp:precise

→ 语言

  • 将WChar_t视为内置类型           /Zc:wchar_t   /Zc:wchar_t-
  • 启动运行时类型信息                  /GR[-] 启动RTTI(主要用于typeid和dymatic_cast)
  • C++语言标准                             /std:c++14     /std:c++17  /std:c++latest        VS2017以上

→ 高级

  • 调用约定                                    __cdecl (/Gd)   __stdcall (/Gz)
  • 编译为                                       编译为 C 代码 (/TC)   编译为 C++ 代码 (/TP)
  • 禁用特定警告                             /wd[数字]

→ 命令行

  • /source-charset:utf-8                指定原代码编码                               (VS 2015 update 2以上)
  • /execution-charset:utf-8           指定执行文件编码                            (VS 2015 update 2以上)
  • /utf-8                                        同时指定原代码编码和执行文件编码(VS 2015 update 2以上)

链接器

→ 常规

  • 启动增量链接                            /INCREMENTAL或者 /INCREMENTAL:NO(对应生成同名*.ilk文件)
  • 附加库目录                                /LIBPATH:"<目录>"

→ 输入

  • 附加依赖项                              "*.lib"
  • 模块定义文件                           /DEF:"*.def" (动态库需要导出的接口)

→ 调试

  • 生成调试信息                           /DEBUG 或者没有
  • 生成程序数据库文件                /PDB:""

→ 系统

  • 子系统                                     /SUBSYSTEM:CONSOLE 或 /SUBSYSTEM:WINDOWS
  • 堆栈保留大小                          /STACK:"2000000" 默认1MB

→ 高级

  • 导入库                                    /IMPLIB:"<生成导入库lib的路径>"
  • 目标计算机                             /MACHINE:X86或者/MACHINE:X64

也可以新建一张属性表(属性管理器中),设定用户宏,然后可以通过从父集或项目默认设置继承来设置相关项

另外: /DLL   /OUT:"*.dll"

手动:/FORCE:MULTIPLE 忽略变量多重定义

工具菜单

获取工具和功能(VS2017以上)

   进入Visual Studio Installer

选项(主菜单 > 工具 > 选项 > 工具选项设置界面)

   文本编辑器

   → C/C++

  • 常规       -   行号
  • 滚动条   -   使用垂直滚动条的缩略图模式

   调试

   → 符号

  • 可以指定pdb搜索目录,默认会自动搜索dll库所在目录的位置

工具

发行组件

(Redistributable)

在VS的安装目录下有个VC/redist目录,里面可以找到运行库(如msvcp120.dll msvcr120.dll)和运行库安装程序

VS相关文件下载网站 https://visualstudio.microsoft.com/zh-hans/downloads/

在网页其他工具和框架可以找到最新Redistributable安装包,点击旧版本链接可找到其他版本Redistributable安装包

安装VS后后,会将相应平台库拷贝到c:\Windows\System32和c:\Windows\SysWOW64目录;

集成工具

在VS的安装目录下有个Common7/Tools目录下

- errlook.exe   通过 [Visua Studio ->工具->错误查找]   启动 ---  查看GetLastError()错误码描述 

- guidgen.exe 通过 [Visua Studio ->工具->创建GUID] 启动 --- 创建GUID

VC工具

VS2013:C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin

   进入C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\Shortcuts目录,点击相应图标,或执行如下命令:

# VS2013 开发人员命令提示  
call "%VS120COMNTOOLS%"VsDevCmd.bat
# VS2013 x86 本机工具命令提示
pushd "%VS120COMNTOOLS%"..\..\VC
call vcvarsall.bat x86
popd
# VS2013 x64 本机工具命令提示
pushd "%VS120COMNTOOLS%"..\..\VC
call vcvarsall.bat amd64
popd
# VS2013 x64 兼容工具命令提示
pushd "%VS120COMNTOOLS%"..\..\VC
call vcvarsall.bat x86_amd64
popd
# VS2013 ARM 兼容工具命令提示
pushd "%VS120COMNTOOLS%"..\..\VC
call vcvarsall.bat x86_arm
popd
# 常用
pushd "%VS120COMNTOOLS%"..\..\VC && call vcvarsall.bat x86_amd64 && popd

   最后,运行dumpbin、lib和nmake 

dumpbin

 - 显示COFF格式的文件信息,比如像vc编译器生成的目标文件(obj),可执行文件(exe)和动态链接库(DLLs)等。

# 查看导出接口和依赖库与库接口
dumpbin /exports FreeImage.dll
dumpbin /imports FreeImage.dll
dumpbin /imports FreeImage.exe
 
# 查看依赖库
dumpbin /dependents FreeImage.dll
 
# 查看dll和exe是32位还是64位 看FILE HEADER VALUES下一行是x86还是x64
#  macos下 lipo  -info *.a 或 *.dylib
# ubuntu下 file *.a 查看有无x86-64,表明是否是64位
dumpbin /headers FreeImage.dll
# 若是调试库,还能看到调试的pdb位置
 
# 查看符号表
#  macos下 nm  -nm *.dylib
dumpbin /symbols *.lib
 
# 查看库的公共符号
# 参数1 将按对象顺序显示符号及其偏移量。
# 参数2 将显示对象的偏移量和索引号,然后按字母顺序列出这些符号及每个符号的对象索引
# 若要两个输出都获得,指定不带数字参数
dumpbin /linkermember   *.lib
dumpbin /linkermember:1 *.lib
dumpbin /linkermember:2 *.lib

lib

# 判断lib文件对应是静态库还是动态库 结果包含obj则是静态库 结果包含dll则是动态库
lib /list hello.lib
 
# linux下所有对象文件(.o文件)列表
ar -t hello.a

nmake

 - nmake [/f makefile] [targets]

  • /?   帮助信息
  • /s   取消显示已执行的命令
  • /p   显示 NMAKE 信息
  • /nologo 不显示版权和版本号
nmake /nologo /s /f makefile.msvc

扩展工具

VAssistX番茄助手

(VS2008)

--- 默认c:\Program Files (x86)\Visual Assist X\目录;

--- 将将VA_X.dll的文件放入目录内;

(VS2012以上)

--- 找到%USERPROFILE%\AppData\Local\Microsoft\VisualStudio目录;

--- 找到VS对应目录,目录有数字代表,比如12代表2013,进入目录找到Extensions目录;

--- 找到其中有几个目录,其中一个含有VA相关文件,将VA_X.dll的文件放入目录内;

Image Watch

--- 自定义natvis文件放在C:\Users\<用户>\Documents\Visual Studio 20xx\visualizers目录

# natvis模板

处理工具 

nasm和yasm

nasm.props、nasm.targets、nasm.xml和yasm.props、yasm.targets、yasm.xml存放路径

Visual Studio 2013:   C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\BuildCustomizations
Visual Studio 2015:   C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\BuildCustomizations
Visual Studio 2017:   C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\BuildCustomizations   (VS专业版)
Visual Studio 2019:   C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Microsoft\VC\v160\BuildCustomizations       (VS专业版)

nasm.exe和yasm.exe

Visual Studio 2017: C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC
Visual Studio 2019:  C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC (x64就放64bit,如何兼容还有待研究)

特点

编译选项

优化 - release下默认开启优化

  • assert会被跳过不执行;

支持标准

VS2013 - 支持大部分c99和c++11,不支持如下:

  • 关键字inline,c不支持c99的inline,需用__line代替,但cpp支持;
  • 关键字restrict,c不支持;
  • 关键字explicit,cpp不支持c++11的explicit;
  • 支持char16_t、char32_t、u16string和u32string,但不支持u"xxx"和U"xxx"

VS2017

  • 支持u"xxx"和U"xxx"

宏定义

  • WIN32
  • __cplusplus
  • WINVER

名词解释

增量链接

启动增量链接编译,每次编译链接的时候为每个函数预留一部分空间, 编译链接时, 只是修改你修改过的函数对应的代码, 其它二进制代码保持不变,跟增量升级一个道理;没启动增量链接编译,把obj删除, 然后重新生成,若在调试得重新开始调试;

分析

sln文件

  vs2013,空工程


Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.40629.0
MinimumvisualStudioVersion = 10.0.40219.1
Global
	GlobalSection(SolutionProperties) = preSolution
		HideSolutionNode = FALSE
	EndGlobalSection
EndGlobal

  vs2013,添加了一个工程

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.40629.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "audiodenoise", "audiodenoise\audiodenoise.vcxproj", "{8FED1CA7-C625-4D2E-BECB-34467AFB9936}"
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
		Debug|Win32 = Debug|Win32
		Debug|x64 = Debug|x64
		Release|Win32 = Release|Win32
		Release|x64 = Release|x64
	EndGlobalSection
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
		{8FED1CA7-C625-4D2E-BECB-34467AFB9936}.Debug|Win32.ActiveCfg = Debug|Win32
		{8FED1CA7-C625-4D2E-BECB-34467AFB9936}.Debug|Win32.Build.0 = Debug|Win32
		{8FED1CA7-C625-4D2E-BECB-34467AFB9936}.Debug|x64.ActiveCfg = Debug|x64
		{8FED1CA7-C625-4D2E-BECB-34467AFB9936}.Debug|x64.Build.0 = Debug|x64
		{8FED1CA7-C625-4D2E-BECB-34467AFB9936}.Release|Win32.ActiveCfg = Release|Win32
		{8FED1CA7-C625-4D2E-BECB-34467AFB9936}.Release|Win32.Build.0 = Release|Win32
		{8FED1CA7-C625-4D2E-BECB-34467AFB9936}.Release|x64.ActiveCfg = Release|x64
		{8FED1CA7-C625-4D2E-BECB-34467AFB9936}.Release|x64.Build.0 = Release|x64
	EndGlobalSection
	GlobalSection(SolutionProperties) = preSolution
		HideSolutionNode = FALSE
	EndGlobalSection
EndGlobal

def文件

LIBRARY  libsamplerate-0.dll
EXPORTS

src_new         @1
src_delete      @2

快捷键

Ctrl+K Ctrl+D                                            先选中代码,代码格式化

Ctrl+U                                                       先选中代码,小写

Shift+Ctrl+U                                              先选中代码,大写

Tab                                                           先选中代码,前进一个tab键

Shift+Tab                                                  先选中代码,后退一个tab键

参考

VS2017 Devenv命令行开关

VS2017 Devenv Rebuild

MSVC工具

nmake2017

版本

WIN_VER 系统版本
0x500 Windows 2000
0x501 Windows xp
0x600 Windows vista
0x601 Windows 7
0x0602 Windows 8
0x0A00 Windows 10
名称 内部版本(MSVC++) _MSC_VER
Visual Studio 2008 9.0 1500
Visual Studio 2010 10.0 1600
Visual Studio 2013 12.0 1800
Visual Studio 2015 14.0
Visual Studio 2017 15.0
Visual Studio 2019 16.0