安装
软件下载关联地址(老版本要求登录,新版本是在线安装)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下调试四步设置
- C/C++ –> 常规 –> 调试信息格式 –> 程序数据库 (/Zi) ;
- C/C++ –> 常规 –> 优化 –> 优化 –> 已禁用 (/Od);
- 链接器 –> 常规–> 启动增量链接 –> 是 (/INCREMENTAL);
- 链接器 –> 调试 –> 生成调试信息 –> 生成调试信息 (/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 |