Visual Studio 2017 及更高版本中提供了“打开文件夹”功能,可通过它打开源文件的文件夹并借助 IntelliSense、浏览、重构、调试及更多方面的支持立即开始进行编码。 在编辑、创建、移动或删除文件时,Visual Studio 会自动跟踪更改,并不断更新其 IntelliSense 索引。 不加载 .sln 或 .vcxproj 文件;如有需要,可以通过简单的 .json 文件指定自定义任务和生成及启动参数。 借助此功能,你可以将任何第三方生成系统集成到 Visual Studio 中。 有关“打开文件夹”的常规信息,请参阅
在 Visual Studio 中开发代码而无需创建项目或解决方案
。
CMake 和 Qt
CMake 集成在 Visual Studio IDE 中,作为 C++ 桌面工作负载的一个组件。 CMake 的工作流与本文中所述的工作流不同。 如果使用 CMake,请参阅
Visual Studio 中的 CMake 项目
。 你也可使用 CMake 生成 Qt 项目,或者可以使用适用于 Visual Studio 2015 或 Visual Studio 2017 的
Qt Visual Studio 扩展
。
其他生成系统
若要将 Visual Studio IDE 与主菜单中没有直接支持的生成系统或编译器工具集一起使用,请选择“文件 | 打开 | 文件夹”或按“Ctrl + Shift + Alt + O”
。导航到包含源代码文件的文件夹。 若要生成项目,请配置 IntelliSense 并设置调试参数,然后添加三个 JSON 文件:
若要使 IntelliSense 和浏览行为(如“转到定义”)能够正常运行,Visual Studio 需要知道正在使用的编译器类型、系统标头的位置以及任何其他包含文件的位置(如果它们不直接位于已打开的工作区文件夹中)
。 若要指定配置,可以从主工具栏的下拉列表中选择“管理配置”
:
Visual Studio 提供以下默认配置:
例如,如果选择“x64-Debug”,Visual Studio 会在根项目文件夹中创建名为“CppProperties.json”的文件
:
"configurations": [
"inheritEnvironments": [
"msvc_x64"
"name": "x64-Debug",
"includePath": [
"${env.INCLUDE}",
"${workspaceRoot}\\**"
"defines": [
"WIN32",
"_DEBUG",
"UNICODE",
"_UNICODE"
"intelliSenseMode": "windows-msvc-x64"
此配置继承 Visual Studio
x64 开发人员命令提示
的环境变量。 其中一个变量是
INCLUDE
,你可以通过使用
${env.INCLUDE}
宏在此处进行引用。
includePath
属性指示 Visual Studio 可在何处查找 IntelliSense 所需的所有源。 在此示例中,该属性表示“可在 INCLUDE 环境变量指定的所有目录中查找,也可在当前工作文件夹树中的所有目录中查找。”
name
属性是将在下拉列表中显示的名称,可以是你想要的任何内容。
defines
属性在遇到条件编译块时会向 IntelliSense 提供提示。
intelliSenseMode
属性基于编译器类型提供一些其他提示。 MSVC、GCC 和 Clang 可使用多个选项。
如果 Visual Studio 似乎忽略了 CppProperties.json 中的设置,请尝试向 .gitignore 文件(类似于
!/CppProperties.json
)添加异常
。
MinGW-w64 的默认配置
如果添加 MinGW-W64 配置,则 JSON 会如下所示:
"configurations": [
"inheritEnvironments": [
"mingw_64"
"name": "Mingw64",
"includePath": [
"${env.INCLUDE}",
"${workspaceRoot}\\**"
"intelliSenseMode": "linux-gcc-x64",
"environments": [
"MINGW64_ROOT": "C:\\msys64\\mingw64",
"BIN_ROOT": "${env.MINGW64_ROOT}\\bin",
"FLAVOR": "x86_64-w64-mingw32",
"TOOLSET_VERSION": "9.1.0",
"PATH": "${env.BIN_ROOT};${env.MINGW64_ROOT}\\..\\usr\\local\\bin;${env.MINGW64_ROOT}\\..\\usr\\bin;${env.MINGW64_ROOT}\\..\\bin;${env.PATH}",
"INCLUDE": "${env.MINGW64_ROOT}\\include\\c++\\${env.TOOLSET_VERSION};${env.MINGW64_ROOT}\\include\\c++\\${env.TOOLSET_VERSION}\\tr1;${env.MINGW64_ROOT}\\include\\c++\\${env.TOOLSET_VERSION}\\${env.FLAVOR}",
"environment": "mingw_64"
记下
environments
块。 它定义了类似于环境变量的属性,不仅在 CppProperties.json 文件中提供,还在其他配置文件 task.vs.json 和 launch.vs.json 中提供
。
Mingw64
配置继承
mingw_w64
环境,并使用其
INCLUDE
属性来指定
includePath
的值。 可以根据需要向此数组属性添加其他路径。
intelliSenseMode
属性设置为适用于 GCC 的值。 有关所有这些属性的详细信息,请参阅
CppProperties 架构参考
。
所有内容都显示正确后,将鼠标悬停在某个类型上时,将看到 GCC 标头中的 IntelliSense:
启用 IntelliSense 诊断
如果没有按预期看到 IntelliSense,可以进行故障排除,具体方法为依次转到
工具
>
选项
>
文本编辑器
>
C/C++
>
高级
,然后将
启用日志记录
设置为
true
。 若要开始,请尝试将“日志记录级别”设置为 5,“日志记录筛选器”设置为 8
。
输出通过管道传递给
输出窗口
,在你选择“*
显示输出来源:Visual C++ 日志
”时可见。 除了其他内容之外,输出还包含 IntelliSense 尝试使用的实际包含路径的列表。 如果路径与 CppProperties.json
中的路径不匹配,请尝试关闭文件夹并删除包含缓存浏览数据的 .vs
子文件夹。
使用 tasks.vs.json 定义生成任务
可以通过直接在 IDE 中作为任务运行来自动执行生成脚本,或者对当前工作区中的现有文件自动执行任何其他外部操作。 可以通过右键单击文件或文件夹并选择“配置任务”
来配置新任务。
此任务会在 .vs 文件夹中创建(或打开)tasks.vs.json 文件,该文件夹由 Visual Studio 在根项目文件夹中创建
。 可以在此文件中定义任意任务,然后使用从“解决方案资源管理器”上下文菜单调用它
。 继续以 GCC 为例,以下代码片段会显示一个完整的 tasks.vs.json 文件,其中包含一个调用 g++.exe(用于生成项目)的单个任务
。 假设项目包含单个名为 hello.cpp 的文件
。
"version": "0.2.1",
"tasks": [
"taskLabel": "build hello",
"appliesTo": "/",
"type": "default",
"command": "g++",
"args": [
"-g",
"-o",
"hello",
"hello.cpp"
JSON 文件放置在 .vs 子文件夹中
。 要查看该文件夹,请单击“解决方案资源管理器”顶部的“显示所有文件”按钮
。 可通过右键单击“解决方案资源管理器”中的根节点,然后选择“生成 hello”来运行此任务
。 任务完成后,“解决方案资源管理器”中应会显示新文件“hello.exe”
。
可以定义许多类型的任务。 以下示例显示定义单个任务的 tasks.vs.json 文件
。
taskLabel
定义上下文菜单中显示的名称。
appliesTo
定义可在其中执行命令的文件。
command
属性指 COMSPEC 环境变量,该变量定义控制台的路径(Windows 上的 cmd.exe)
。 你还可以引用 CppProperties.json 或 CMakeSettings.json 中声明的环境变量。
args
属性指定要调用的命令行。
${file}
宏检索“解决方案资源管理器”
中选定的文件。 下面的示例将显示当前所选 .cpp 文件的文件名。
"version": "0.2.1",
"tasks": [
"taskLabel": "Echo filename",
"appliesTo": "*.cpp",
"type": "command",
"command": "${env.COMSPEC}",
"args": ["echo ${file}"]
保存 tasks.vs.json 后,可以在文件夹中右键单击任一 .cpp 文件,选择上下文菜单中的“Echo 文件名”,并查看输出窗口中显示的文件名
。
有关详细信息,请参阅
Tasks.vs.json 架构参考
。
若要自定义程序的命令行参数和调试说明,请右键单击“解决方案资源管理器”中的可执行文件,并选择“调试和启动设置”
。 这会打开现有 launch.vs.json 文件,如果不存在任何文件,它将使用一组最小启动设置来创建一个新文件
。 首先,你可以选择希望配置的调试会话类型。 若要调试 MinGw-w64 项目,请选择“MinGW/Cygwin (gdb) 的 C/C++ 启动”
。 这会创建一个使用 gdb.exe 并对默认值进行一些有根据的猜测的启动配置
。 其中一个默认值为
MINGW_PREFIX
。 可以替换文本路径(如下所示),或在 CppProperties.json 中定义
MINGW_PREFIX
属性
:
"version": "0.2.1",
"defaults": {},
"configurations": [
"type": "cppdbg",
"name": "hello.exe",
"project": "hello.exe",
"cwd": "${workspaceRoot}",
"program": "${debugInfo.target}",
"MIMode": "gdb",
"miDebuggerPath": "c:\\msys64\\usr\\bin\\gdb.exe",
"externalConsole": true
若要开始调试,请选择“调试”下拉列表中的可执行文件,然后单击绿色箭头:
首先应会看到“正在初始化调试器”对话框,然后会看到正在运行程序的外部控制台窗口
。
有关详细信息,请参阅
launch.vs.json 架构参考
。
启动其他可执行文件
可以在计算机上定义任何可执行文件的启动设置。 下面的示例启动 7za 并通过将其他参数添加到
args
JSON 数组来指定它们
:
"version": "0.2.1",
"defaults": {},
"configurations": [
"type": "default",
"project": "CPP\\7zip\\Bundles\\Alone\\O\\7za.exe",
"name": "7za.exe list content of helloworld.zip",
"args": [ "l", "d:\\sources\\helloworld.zip" ]
保存该文件时,新配置将出现在“调试目标”下拉列表中,且可以选择该配置来启动调试程序。 可以根据需要创建任意数量的调试配置,用于任意数量的可执行文件。 如果现在按 F5,调试程序将启动并命中可能已设置的任何断点
。 现可使用所有熟悉的调试程序窗口及其功能。