Using C++ on Linux in VS Code
In this tutorial, you will configure Visual Studio Code to use the GCC C++ compiler (g++) and GDB debugger on Linux. GCC stands for GNU Compiler Collection; GDB is the GNU debugger.
After configuring VS Code, you will compile and debug a simple C++ program in VS Code. This tutorial does not teach you GCC, GDB, Ubuntu or the C++ language. For those subjects, there are many good resources available on the Web.
If you have trouble, feel free to file an issue for this tutorial in the VS Code documentation repository.
Prerequisites
To successfully complete this tutorial, you must do the following:
-
Install Visual Studio Code.
-
Install the C++ extension for VS Code. You can install the C/C++ extension by searching for 'c++' in the Extensions view (
kb(workbench.view.extensions)
).
Ensure GCC is installed
Although you'll use VS Code to edit your source code, you'll compile the source code on Linux using the g++ compiler. You'll also use GDB to debug. These tools are not installed by default on Ubuntu, so you have to install them. Fortunately, that's easy.
First, check to see whether GCC is already installed. To verify whether it is, open a Terminal window and enter the following command:
gcc -v
If GCC isn't installed, run the following command from the terminal window to update the Ubuntu package lists. An out-of-date Linux distribution can sometimes interfere with attempts to install new packages.
sudo apt-get update
Next install the GNU compiler tools and the GDB debugger with this command:
sudo apt-get install build-essential gdb
Create Hello World
From the terminal window, create an empty folder called projects
to store your VS Code projects. Then create a subfolder called helloworld
, navigate into it, and open VS Code in that folder by entering the following commands:
mkdir projects
cd projects
mkdir helloworld
cd helloworld
code .
The code .
command opens VS Code in the current working folder, which becomes your "workspace". As you go through the tutorial, you will create three files in a .vscode
folder in the workspace:
tasks.json
(compiler build settings)launch.json
(debugger settings)c_cpp_properties.json
(compiler path and IntelliSense settings)
Add hello world source code file
In the File Explorer title bar, select New File and name the file helloworld.cpp
.
Paste in the following source code:
#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;
return 0;
}
Now press kb(workbench.action.files.save)
to save the file. Notice that your files are listed in the File Explorer view (kb(workbench.view.explorer)
) in the side bar of VS Code:
You can also enable Auto Save to automatically save your file changes, by checking Auto Save in the main File menu.
The Activity Bar on the edge of Visual Studio Code lets you open different views such as Search, Source Control, and Run. You'll look at the Run view later in this tutorial. You can find out more about the other views in the VS Code User Interface documentation.
Note: When you save or open a C++ file, you may see a notification from the C/C++ extension about the availability of an Insiders version, which lets you test new features and fixes. You can ignore this notification by selecting the
X
(Clear Notification).
Explore IntelliSense
In the helloworld.cpp
file, hover over vector
or string
to see type information. After the declaration of the msg
variable, start typing msg.
as you would when calling a member function. You should immediately see a completion list that shows all the member functions, and a window that shows the type information for the msg
object:
You can press the kbstyle(Tab)
key to insert the selected member. Then, when you add the opening parenthesis, you'll see information about arguments that the function requires.
Run helloworld.cpp
Remember, the C++ extension uses the C++ compiler you have installed on your machine to build your program. Make sure you have a C++ compiler installed before attempting to run and debug helloworld.cpp
in VS Code.
-
Open
helloworld.cpp
so that it is the active file. -
Press the play button in the top right corner of the editor.
-
Choose g++ build and debug active file from the list of detected compilers on your system.
You'll only be asked to choose a compiler the first time you run helloworld.cpp
. This compiler will be set as the "default" compiler in tasks.json
file.
-
After the build succeeds, your program's output will appear in the integrated Terminal.
The first time you run your program, the C++ extension creates tasks.json
, which you'll find in your project's .vscode
folder. tasks.json
stores build configurations.
Your new tasks.json
file should look similar to the JSON below:
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "C/C++: g++ build active file",
"command": "/usr/bin/g++",
"args": [
"-g",
"$\{file\}
",
"-o",
"$\{fileDirname\}
/$\{fileBasenameNoExtension\}
"
],
"options": {
"cwd": "/usr/bin"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
]
}
Note: You can learn more about
tasks.json
variables in the variables reference.
The command
setting specifies the program to run; in this case that is g++.
The args
array specifies the command-line arguments that will be passed to g++. These arguments must be specified in the order expected by the compiler.
This task tells g++ to take the active file ($\{file\}
), compile it, and create an executable file in the current directory ($\{fileDirname\}
) with the same name as the active file but without an extension ($\{fileBasenameNoExtension\}
), resulting in helloworld
for our example.
The label
value is what you will see in the tasks list; you can name this whatever you like.
The detail
value is what you will see as the description of the task in the tasks list. It's highly recommended to rename this value to differentiate it from similar tasks.
From now on, the play button will read from tasks.json
to figure out how to build and run your program. You can define multiple build tasks in tasks.json
, and whichever task is marked as the default will be used by the play button. In case you need to change the default compiler, you can run Tasks: Configure default build task. Alternatively you can modify the tasks.json
file and remove the default by replacing this segment:
"group": {
"kind": "build",
"isDefault": true
},