https://blog.csdn.net/qq_37429313/article/details/120588483
https://blog.csdn.net/weixin_45717218/article/details/121720410
0.安装 visual studio 2019, 带 windows Sdk 10。
方法1:
1.安装扩展 Easy C++ Projects
2.打开命令面板(ctrl+shift+p),输入 >easy, 选择新建C++工程
选择2019 MSVC工具集。
3.Easy自动从国外网站下载配置清单。下载失败,则使用当前目
录下的配置好的json文件。
方法2:
1.安装扩展 "C/C++ Runner"
2. 配置文件
.c_cpp_properties.json 配置编译环境(cl.exe),
settings.json
3. 配置 Runner 调试
方法3:
1. 基本调用3条命令解决:
(1) vcvarsall.bat
(2) cl.exe /c
(3) link.exe
(4) (2)和(3)可以合并:cl
2. 上面的命令,配置成两个json:
launch.son
task.json
3. lauch.son 调用 task.json。task.json调用"vcvarsall.bat"配置编译环境,
接着调用多个"Command"如: cl.exe, link.exe等,然后调用自己写的清理脚本(Clean.bat)
4.tasks.json 里"vcvarsall.bat"配置程序运行的VS环境,
使用Everything工具搜索位置,把完整路径加入到"args"参数里.
5."cppvsdbg"配置项使用“ms-vscode.cpptools-1.11.5-win32-x6”
扩展里的vsdbg.exe来调试程序。
6.CleanRubbish.bat 清理编译生成的文件
7.notepad++ + Hex-Editor 查看是否64位
以下展示方法3的配置文件:
//launch.json
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "2.0.0",
"configurations": [
{
"name": "cl.exe - 生成和调试活动文件",
"type": "cppvsdbg",
"request": "launch",
"program": "${workspaceFolder}/${fileBasenameNoExtension}.exe",
"args": [
],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"logging": {
"moduleLoad": false,
"trace": true
},
// "showDisplayString": true,
// "visualizerFile": "${workspaceRoot}/my.natvis",
// 使用.nativs处理显示数据,参考:
// https://docs.microsoft.com/visualstudio/debugger/create-custom-views-of-native-objects
// http://t.zoukankan.com/yilang-p-12432873.html
// "requireExactSource": true,
"console": "integratedTerminal", //使用内置终端
//"console": "externalTerminal",
"preLaunchTask": "cl.exe build active file",
"postDebugTask": "delete extra files"
}
]
}
//tasks.json
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"windows": {
"options": {
"shell": {
"executable": "cmd.exe",
"args": [
"/C",
// The path to VsDevCmd.bat depends on the version of Visual Studio you have installed.
// 仿制"Developer Command Prompt for VS 2019.lnk"
// "\"C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/Common7/Tools/VsDevCmd.bat\"",
// cmd> vcvarsall.bat --help
"\"C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Auxiliary/Build/vcvarsall.bat\" x64 10.0.19041.0",
"&&"
]
}
}
},
"tasks": [
{
"label": "cl.exe build active file", //要跟lunch中的preLaunchTask一致
"type": "shell",
// 多Command方式参考"Compound tasks":https://code.visualstudio.com/docs/editor/tasks#vscode
"command": "cl.exe",
// 按类别列出的编译器选项
// https://docs.microsoft.com/zh-cn/cpp/build/reference/compiler-options-listed-by-category?view=msvc-160
"args": [
//预处理器
// "/C", //在预处理期间保留注释。
// "/D{=|#}", //定义常数和宏。
// "/I", //在目录中搜索包含文件。
// "/FI", //预处理指定的包含文件(.h)等。
// "/FU", //强制使用文件名,就像已传递给指令 #using 一样。::指定要在此编译中引用的元数据文件。
//参考元编程:http://t.zoukankan.com/magicbowen-p-5533306.html
// "/PD", //打印所有宏定义。
//优化
"/Od", //禁用优化
//代码生成
"/EHsc", //启用C++异常:只处理在 throw 语句或函数调用中的异常;catch(...)子句不会 catch 异步构造异常。
// "/fp:precise", //“precise”浮点模型;结果可预测。
// "/Gd", //默认选项,使用 __cdecl 调用约定。 (仅限 x86)
// "/Gm-", //vs2019已弃用。 启用最小重新生成。
// "/GR-", //不启用运行时类型检查(RTTI),默认为打开。
"/GS", //启动安全检查,可检测堆栈缓冲区溢出。
//"/GZ", //已弃用。启用快速检查。 (与 /RTC1) 相同
// "/I", //在目录中搜索包含文件。
// "/RTC1", //启用等效于 (/RTCsu) 的快速运行时检查。
// "/RTCs", //启用堆栈帧运行时检查。
// "/RTCu", //启用未初始化的本地使用情况检查。
//诊断
// "/diagnostics:column", //编译时报告发现问题的行号和列号
// "/sdl", //启用更多安全功能和警告。
"/W3", //警告等级3
// "/w", //禁用所有警告。
// "/wo", //仅显示指定的警告一次。
// "/WX-", //不将警告视为错误
//链接
"/MDd", //多线程动态链接Debug版本,调用库(MSVCRT.lib + MSVCR80.DLL),为默认选项
//"/MTd", //多线程静态链接Debug版本,调用库(LIBCMT.lib)
//"/options:strict" //无法识别的编译器选项视为错误。
//语言
// "/std:c++14", //C++14 标准 ISO/IEC 14882:2014 (默认) 。
// "/std:c++17", //C++17 标准 ISO/IEC 14882:2017。
// "/std:c++20", //C++20 标准 ISO/IEC 14882:2020。
// "/std:c++latest", //最新的 C++ 标准预览版功能草稿。
// "/std:c11" //C11 标准 ISO/IEC 9899:2011。
// "/std:c17" //C17 标准 ISO/IEC 9899:2018。
// "/permissive-", //设置C++标准一致性模式。此选项禁用宽松行为,并设置 /Zc 编译器选项以执行严格的符合性。
// "/Zc:wchar_t", //指明 wchar_t 为内置类型
// "/Zc:forScope", //指定标准行为是使 for 循环的初始值设定项在 for 循环之后超出范围。
// "/Zc:inline", //内置函数或数据的声明和定义必须写一块,定义即是声明。(/Od 或 /GL 会使该项无效)
"/ZI", //将调试信息包含在与“编辑并继续”兼容的程序数据库中。 (仅 x86 和 x64 处理器可用)
//杂项
"/nologo", //显示执行命令。取消显示登录版权标志。
// "/c", //编译但不链接。仅创建 .obj 文件。
// "/JMC", //调试功能,可自动单步跳过系统、框架和其他非用户代码调用。
// "/Tp", // /Tp 指定非C++源文件为C++源文件。
// "/TP", // /TP 指定当前命令行所有文件为C++源文件
// "/FC", //显示在诊断文本中传递给 cl.exe 的源代码文件的完整路径。
// "/errorReport:prompt",//已弃用。 从 Windows Vista 开始,错误报告由 WINDOWS 错误报告 (WER) 控制。
// "/showIncludes", //在编译期间显示所有包含文件的列表。
// "/source-charset:[IANA_name | .CPID]" // 设置扩展的源字符集。如果代码存在多种字符(ASCII,UTF8,UNICODE)等建议配置该项。
//
// "/Fd\"x64\\Debug\\vc142.pdb\"",
// "/Fo\"x64\\Debug\\\"",
// "/Fe:${workspaceFolder}/${fileBasenameNoExtension}.exe", //指定编译器创建的 .exe或 DLL 的名称和目录。下一行必须紧跟路执行程序路径。
// "/Fe:${file}"
// "/Fe:${fileDirname}/${fileBasenameNoExtension}.exe",
"../${fileBasenameNoExtension}.cpp",
"/link",
"/SUBSYSTEM:CONSOLE", //生成控制台程序
"/MACHINE:X64", //生成64位程序
"/DEBUG:FASTLINK", //生成调试信息
"/INCREMENTAL", //启用增量链接
"/TLBID:1",
"/DYNAMICBASE", //使用地址空间布局随机化,加载时随机重新定基
"/NXCOMPAT", //指示可执行文件与 Windows 数据执行保护功能兼容
//"/VERBOSE", //打印链接器进度消息。
// "/VERSION", //分配版本号。
// "/MANIFEST", //创建并行程序集清单, 紧跟下一行为清单文件详细信息
// "\"/MANIFESTUAC:level='asInvoker' uiAccess='false'\"",
// // 程序集清单包括:程序集名称、版本信息、签名文件(hash值)、包含文件列表、文件类型列表、依赖库、安全权限列表、UAC级别、定制属性、产品信息等。
// "/manifest:embed",
// "/dll", //链接生成.dll文件
"/OUT:${workspaceFolder}/${fileBasenameNoExtension}.exe",
"/PDB:${workspaceFolder}/${fileBasenameNoExtension}.pdb",
// "/LIBPATH:${dir}", //依赖库目录
// "kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib",
"/IMPLIB:${workspaceFolder}/${fileBasenameNoExtension}.lib", //生成导入库(xx.lib)时指定文件名,没生成导入库时忽略该项
// "${workspaceFolder}/${fileBasenameNoExtension}.obj"
],
"problemMatcher": ["$msCompile"],
"group": {
"kind": "build",
"isDefault": true
}
},
{
"type": "shell",
"label": "delete extra files",
"command": "${workspaceFolder}/CleanRubbish.bat"
}
]
}
//CleanRubbish.bat
@echo off
set path=%fileDirname%
for /r %path% %%s in (*.exe *.ilK *.obj *.pdb) do (
del /f /s /q "%%s"
)
8.未能完美解决的是VS的有些代码格式在编辑阶段会提示错误,但实际编译没错。