When I first started with VS Code on Linux, I found the C/C++ configuration somewhat confusing. I blundered through, wasted a bit of time and got there in the end. After a gap of a couple of years I did the same again recently on Raspberry Pi. It’s clearer in my mind now so I thought I’d explain it here. This works for Ubuntu, Raspberry Pi OS and should for most other Linuxes. (Not that I’ve tried them all…)
We’ll start with you having already installed Clang (or GCC) and VS Code, and the C/C++ extension for VS Code (shown above). So make sure those are all done.
Start by defining a Folder for VS Code. VS code doesn’t use projects but it manages everything relative to the currently defined Folder. It’ll ask you to open a folder initially. That’s where your source code etc will go. I created a folder called examples under my home folder and used that.
To compile anything C/C++ you also need two json files. These files are
- tasks.json
- c_cpp_properties.json
They are held in a hidden folder called .vscode in your current folder. Press F1 and you’ll see a popup menu. Type in C/C++ and you’ll see all the C/C++ items. Select C/C++: Edit Configurations (JSON). It’s highlighted below.

Now if you click that, and look in the folder examples you’ll see nothing but if you know how to view hidden files using the files utility (as shown below). Then you’ll see the folder .vscode. On Raspberry Pi the file explorer always shows hidden files.
Now look in that folder and you’ll see c_cpp_properties.json.
Next we want tasks.json. On the Terminal menu, click the bottom item which is Configure Default Build Task
It’ll ask you to select the clang build active task so click that and voila you now have tasks.json open in the editor.


Now I’ve created the standard hello world file in the file hw.c.
#include <stdio.h>
int main() {
printf("Hello world\n");
return 0;
}
So just do Terminal/Run Build Task and it will have clang compile the currently opened file. If you get terminal failed to launch (exit code: -1) then it’s likely that your hello world source file was not the currently opened file in the editor. You can see which file is open because its tab is brightest.
Note that hw.c is brighter than tasks.json on the left. On the right, the open file is tasks.json and its tab is brighter.


So what are the json files for?
The c_cpp_properties.json lets you specify include file paths. For instance if you have the SDL files installed, the include files are in /usr/include/SDL2

Note you can install SDL on linux by following these instructions.
The tasks.json file lets you specify which files are to be included and also linked.
Here I’ve just shown the args section from a tasks.json used to build SDL2 games.
"args": [
"-g",
"${file}",
"${workspaceFolder}/hr_time.c",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
"-lSDL2",
"-lSDL2_image",
"-lSDL2_mixer",
"-lm"
],
The -g option includes files. The ${file} is the current opened file and {workspaceFolder{} specifies the current folder where the file hr_time.c (used for timing). The -l is for linking files and links SDL2, SDL2_image and SDL2_mixer. The last -lm links math(s) code; technically the -l{name} flag tells the linker to link against lib{name}. So -lm links against libm, the c math library.