赞
踩
下面的方法基本是照抄官网的,只是翻译了一下,再加上一丢丢自己的备注。
本来不想麻烦的,因为VS code是很大众的编译器了,想着随便搜个教程,傻瓜式看着照搬就行了吧。结果不尽人意,排名靠前的试了试,都多少有问题,原理说的也不明白。最后还是自己去官网找了一下,英文看的不是很流利,但是非常傻瓜,使用方式,每一步的目的也都很清楚。
在这篇指导中,你将学到如何在macOS系统中,使用Clang/LLVM的编译和调试器配置Visual Studio Code。
下面以一个简单的C++例子作为演示。
Clang一般是mac默认安装的,打开终端并尝试以下命令,查看输出。
注:⌘+Space,输入’终端’可快捷打开。
clang --version
– 如果没有安装的话,可以使用下面的命令进行安装。
xcode-select --install
在mac的终端中,创建一个文件夹projects,专门用来保存你的工程。然后创建一个子文件夹,命名为helloworld。接着,进入该目录,并用vs code打开该目录。具体操作如下:
mkdir projects
cd projects
mkdir helloworld
cd helloworld
code .
如此方式打开vs code,会直接建立helloworld
工程,并默认创建.vscode
文件夹(’.'开头的文件或文件夹是隐藏的,使用管理员身份可以在终端看到)。在后续的教程中,会在该文件夹中生成三个文件。
tasks.json
(编译任务)launch.json
(调试运行配置)c_cpp_properties.json
(配置头文件路径和lib路径)注:这里因为我之前试了很多教程,导致我不知道默认安装的VS code是不是可以直接在终端调用了,可能是我给弄坏了。查了一下,自己再打开就行了。先打开vs code,然后使用快捷指令,⇧⌘P,打开命令提示框,选Install ‘code’ command in PATH。
在文件资源管理器中,点击新建文件图标,新建helloworld.cpp。
输入下面的代码:
#include <iostream> #include <vector> #include <string> using namespace std; int main() { vector<string> msg {"Hello", "C++", "World", "from", "VS Code", "and the C++ extension!"}; for (const string& word : msg) { cout << word << " "; } cout << endl; }
按下⌘S保存代码,在左侧文件管理器中可以看到已经出现了你的文件。
同时,你可以在file
菜单中设置Auto File
。
VisualStudio代码边缘的活动栏允许您打开不同的视图,如搜索、源代码管理和运行。在本教程后面的部分中,您将看到Run视图。您可以在VS代码用户界面文档中找到有关其他视图的更多信息。
注意:当您保存或打开C++文件时,您可能会看到C/C++扩展的关于内部版本的可用性的通知,这允许您测试新的特性和修复。您可以通过选择X
(清除通知)忽略此通知。
在helloworld.cpp
文件,将鼠标悬停在vector
或string
上以查看类型信息。在变量msg
的开始声明后键入msg.
就像调用成员函数时一样。您应该立即看到一个显示所有成员函数的列表和一个显示msg
对象类型信息的窗口:
你可以按下Tab键插入选择的选项。
接下来,在如何编译这个程序的过程中,你将创建tasks.json
文件。这个过程将通过Clang++创建可执行文件。
重要的是在编辑器中打开helloworld.cpp
文件,因为这一步需要对编辑器中的活动文件进行操作。
在主菜单中,选择 Terminal
> Configure Default Build Task
.在预选项中选择C/C++ clang++ build active file
,编译当前活跃的文件。
注:需要当前页面停留在main.cpp等文件中,不能停留在task.json这类的配置文件中,否则会编译失败。
这将在.vscode文件夹中,创建了task.json文件。
使用下面的文本替换原有的。
{ // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format "version": "2.0.0", "tasks": [ { "type": "shell", "label": "clang++ build active file", "command": "/usr/bin/clang++", "args": [ "-std=c++17", "-stdlib=libc++", "-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}" ], "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": ["$gcc"], "group": { "kind": "build", "isDefault": true } } ] }
这个json文件内容,在下面几点上不同于默认的json内容。
args
选项值为 c++17
,因为helloworld.cpp文件中有使用到c++17的特性。command
命令指定使用的编译程序。这个例子中,我们使用的是clang++.
args
是一个C++编译选项构成的数据。
${file}
表示当前的源文件,并在当前目录(${fileDirname}
)中创建可执行文件(${fileBasenameNoExtension}
)。
label
是您将在任务列表中看到的值。随便你叫什么名字。
problemMatcher
值选择用于在编译器输出中查找错误和警告的输出解析器。对于clang++
,如果使用$gcc
,将获得最佳结果。
group
对象中的“isDefault
”为true时,可以通过快捷键⇧⌘B,运行此任务(即生成可执行文件)。此属性仅为方便起见;如果将其设置为false,则仍可以使用“Terminal > Run Build Task.
”从终端菜单进行生成。
注意:如果想要了解更多关于task.json中的变量的意思,可以参照这里
让页面返回helloworld.cpp
,因为我们的编译操作是要操作当前活跃的文件。
为了编译这个任务,可以按下⇧⌘B
,当然前提是在上一步中要将 group中的 isDefalult 设置为true。
当开始编译时,编辑器下部会出现终端窗口,显示编译输出,如下。
点击 +
可以在helloworld
的工作目录下,创建一个终端,输入 ls
命令可以看到目录下的文件。
你可以通过 ./helloworld
运行这个程序。
你可以修改 ${file}
为 ${workspaceFolder}/*.cpp
,用来同时编译目录下的所有.cpp
文件。
你可以通过按下 F5 创建一个 launch.json
文件,或者在主菜单选择 Run > Add Configuration...
-> C++ (GDB/LLDB)
,最后在预选项中选择 lang++ build and debug active file.
此时,在编辑器中创建了一个 launch.json
文件并打开了。修改为如下内容:
{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "clang++ - Build and debug active file", "type": "cppdbg", "request": "launch", "program": "${fileDirname}/${fileBasenameNoExtension}", "args": [], "stopAtEntry": true, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "lldb", "preLaunchTask": "clang++ build active file" } ] }
program
表示你想要调试运行的可执行程序,${fileDirname}
表示当前工作目录,${fileBasenameNoExtension}
表示不带有扩展名的当前文件名。最终定位到的文件,应该是你生成可执行程序的位置即可,你甚至可以写绝对路径。
stopAtEntry
默认情况下是false
,该变量控制程序进入调试是否立即中断。
preLaunchTask
表示在调试前要完成的任务,他的值应该与上面配置的task.json
中label
值相同。
返回到helloworld.cpp
文件页面,原因等同于编译步骤,vs code
的操作是对当前的活跃文件进行的操作,否则你启动的任务使用到的相对路径就是不正确的。
按下 F5
或在菜单栏选择 Run > Start Debugging
。在阅读代码前,让我们先看一下界面上的变化:
Debug Output
标签页你可以看到调试输出。main
函数的第一行有高亮区域,这就是当前断点的位置。现在你可以开始执行这段代码了:
step over
单步执行代码,使高亮区域移动到 for (const string& word : msg)
step over
将跳过vector & string
等中间代码的内部执行操作。step over
,可以在左侧的变量窗口中,看到变量值的变化。DEBUG CONSOLE
窗口中。在2019年3月份的版本中,在执行完最后一句cout之前,DEBUG CONSOLE
窗口不会看到输出。(这里使区别的windows上的vs的)你可能会想在调试过程中,一直监视观察一个变量的变化吧。你可以为这个变量设置一个监视。
如果想要使用更多的C++扩展,可以创建一个c_cpp_properties.json
文件,比如你想改变编译器的路径,include路径,使用的C++标准(如C++17) 等。
按下 ⇧⌘P
,搜索并运行 C/C++: Edit Configurations (UI)
。
这会打开C++的配置页面。
这个文件在 .vscode/c_cpp_properties.json,如果你直接打开可以看到如下内容:
{ "configurations": [ { "name": "Mac", "includePath": ["${workspaceFolder}/**"], "defines": [], "macFrameworkPath": [ "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks" ], "compilerPath": "/usr/bin/clang", "cStandard": "c11", "cppStandard": "c++17", "intelliSenseMode": "clang-x64" } ], "version": 4 }
如果你要包含的头文件或lib文件不在你的工作目录,可以在这里修改Include path
。
compilerPath
是非常重要的配置。扩展使用它来推断C++
标准库头文件的路径。当扩展知道在哪里可以找到这些文件时,它可以提供一些有用的功能,比如智能补全和转到定义导航。
C++扩展会尝试填充一个 compilerPath 的默认路径,这取决与他在系统中搜索到的。搜索顺序如下:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/
我不知道这是什么。不翻译了。
On the C/C++ Configuration screen, scroll down and expand Advanced Settings and ensure that Mac framework path points to the system header files. For example: /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks
你此次配置好的环境,仍然可以方便的带到下次创建而工程中,只需要把 .vscode
文件夹下的json
文件拷贝过去即可。
最普遍的错误是,当进行编译或调试的时候,提示 helloworld.cpp
不是活跃文件,如 undefined _main
,ttempting to link with file built for unknown-unsupported file format
,等等。这是因为编译器正在尝试编译不是源代码的文件,比如 launch.json,
tasks.json
, 或 c_cpp_properties.json
文件。
如果你看到关于 C++11
扩展的错误,可能是因为你没有更新 task.json 文件,使用clang++
的 --std=c++17
参数,默认情况下,clang++
是遵循 c++98
标准的,它不支持helloworld.cpp
中使用到的初始化操作。为了确保你修改正确,你可以返回到上面的 进行编译 的步骤。
注:我们用到的初始化操作是c++ 17
才支持的,可以在en.cppreference.com
查到。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。