I am learning C++ and I want to use VS Code as my code editor. I created a simple project that has a file with the main method and 2 other files to define a class (a .h and a .cpp). I created the default build task in VS Code to compile my code (g++ build active file), only to get a compile error: undefined reference for the class constructor. I saw that it was related to the linker not finding the implementation because it wasn't included in the build. So I modified my build task to build all .cpp :
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "g++ build active file",
"command": "/usr/bin/g++",
"args": [
"-g",
"${fileDirname}/*.cpp",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "/usr/bin"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
But now when I build the project, I get this error: /path/to/project/*.cpp": No such file or directory. Meaning that *.cpp wasn't interpreted as a wildcard. I am using the default C++ extension for VS Code if is relevant. Am I missing some configuration in my task? How can I make this work? For a large project the method in which I manually add all cpp files as arguments is obviously not appropriate so I would like to make this method to work. Thanks in advace!
This is a tough question to deal with because everyone's computers have different programs, files etc... For reference, I am on windows 10.
This worked for me and it's worth trying...
in tasks.json, either add a new task or modify the existing one to look as follows:
{
"label": "g++.exe build active file",
"args": [
"-g",
"${fileDirname}\\*.cpp",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
],
"command": "g++.exe",
"options": {
"cwd": "${workspaceFolder}",
},
"group": "build",
"type": "shell"
}
Make a new file under .vscode called c_cpp_properties.json: The following may be different if you are using another compiler or OS
{
"configurations": [
{
"name": "Win32",
"includePath": [
"C:\\msys64\\mingw64\\include\\c++",
"C:\\msys64\\mingw64\\lib\\gcc\\x86_64-w64-mingw32\\11.2.0\\include", "${workspaceFolder}/**"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"compilerPath": "C:\\msys64\\mingw64\\bin\\gcc.exe",
"cStandard": "c11",
"cppStandard": "c++20",
"intelliSenseMode": "gcc-x64"
}
],
"version": 4
}
Now in launch.json, you need to change the "preLaunchTask" to match the task's name we just created in tasks.json. This will tell vscode to first compile/build the program... then to run it:
Mine now looks like this:
{
"version": "0.2.0",
"configurations": [
{
"name": "g++.exe - Build and debug active file",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "C:\\msys64\\mingw64\\bin\\gdb.exe",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "g++.exe build active file"
}
]
}
Note that the name we chose is not exactly describing what the new task actually does, feel free to change it, but if you do... make sure to update both the "label" in tasks.json and "preLaunchTask" in launch.json to be identical.
Related
I've set up my vs code for c++ debugging and it's running fine. However the auto detection doesn't recognize c++11 standard and marks error and warning messages. My compiler is set to c++20 and I'm able to run code without problem.
example
I've searched the internet and only find 1 similar post which said the issue went away after VSCode and extension update, so I guess this must mean I had some set up wrong. I've tried to turned off IntelliSense engine and it didn't work, and all I can find about problemmatcher said "$gcc" is recommended for macOS, so I guess that should work too.
Here's my task.json
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: clang++ build active file",
"command": "/usr/bin/clang++",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
"-std=c++20",
"-stdlib=libc++"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc",
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
],
"version": "2.0.0"
}
lauch.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": "(lldb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "lldb",
"preLaunchTask": "C/C++: clang++ build active file"
}
]
}
c_cpp_properties.json
{
"configurations": [
{
"name": "Mac",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [],
"macFrameworkPath": [
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks"
],
"compilerPath": "/usr/bin/clang++",
"cStandard": "c17",
"cppStandard": "c++20",
"compilerArgs": [],
"intelliSenseMode": "macos-clang-x64"
}
],
"version": 4
}
Update
After I installed gcc and LLVM, somehow it messed up my configurations and all C++ compilers cannot be found in tasks. So I uninstalled all compilers, reinstalled xcode command line tools and move usr/bin to top of PATH. After the clang++ compiler reappers in build task configuration, the error squiggles are working with C++11 code. My best guess is that some settings got reset during the process and it's using the correct arguments for intellisense.
So I'm just starting to learn C++ and I decided to use Visual Studio Code as my development environment and use the clang++ compiler on macOS.
I followed the official Using Clang in Visual Studio Code guide and ended up with the following configuration files:
tasks.json (compiler build settings)
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "[mthree] 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
}
}
]
}
launch.json (debugger settings)
{
"version": "0.2.0",
"configurations": [
{
"name": "[mthree] clang++ - Build and debug active file",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "lldb",
"preLaunchTask": "[mthree] clang++ build active file"
}
]
}
c_cpp_properties.json (compiler path and IntelliSense settings)
{
"configurations": [
{
"name": "Mac",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [],
"macFrameworkPath": [
"/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks"
],
"compilerPath": "/usr/bin/clang++",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "macos-clang-x64"
}
],
"version": 4
}
Now my problem has to do with Intellisense -- while the code completion/suggestion works fine, I just don't see any of the function descriptions.
Here is a simple example:
No description for the append() function
If I go to the definition of the string append function, it takes me to /Library/Developer/CommandLineTools/usr/include/c++/v1/string. And yes, this file happens indeed to not have any descriptive documentation in it. Here's what it says at the top:
// -*- C++ -*-
//===--------------------------- string -----------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
Therefore, does anyone know what I should do in order for Intellisense to show the complete documentation (i.e tell me what the functions do in 'plain English')?
Thanks!
I had the same issue. I found this post. I ended up installing gcc in Homebrew, but didn't set "compilerPath": "/opt/homebrew/Cellar/gcc/11.2.0/bin/g++-11" and got the function description showing up properly.
Note that I'm using Windows 10 x64, MinGW 9.2.0, VSCode 1.54.1.
My goal is to build and run multiple .cpp files in current folder and different levels subfolders I use. I've tried it configuring tasks.json and c_cpp_properties.json files with help of these articles: https://code.visualstudio.com/docs/cpp/c-cpp-properties-schema-reference
https://code.visualstudio.com/docs/cpp/config-mingw
VS Code will not build c++ programs with multiple .ccp source files
I tried to configure my c_cpp_properties.json by adding this instruction:
"includePath": [
"${workspaceFolder}/*"
]
And I modified also my tasks.json like this:
"args": [
"-std=c++17",
"-g",
"${workspaceFolder}\\*.cpp",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
]
It actually works for the case I would like to build multiple .cpp files in the main directory. I have a folder vscode_prj, then I have .vscode inside (I attach all my configuration files here), and all files I have inside vscode_prj are build OK, but if I try to create a new folder inside vscode_prj, for example vscode_prj/project1 and I have a few .cpp files inside project1 it's not working and I can't build these files. I just recieve this error:
g++.exe: error: C:\Users\username\folderfolder\_prj\vscode_prj\*.cpp: Invalid argument
g++.exe: fatal error: no input files
compilation terminated.
So, as I understand, compiler just can't find my source files inside subfolder. And it doesn't matter if I have one source file in this folder or several, it's just not build. I appreciate any help and excuse me for my English, it's my first question here, because I just don't know what to do. Thanks.
Attachments:
vscode_prj/.vscode/c_cpp_properties.json:
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/*"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"compilerPath": "C:\\MinGW\\bin\\gcc.exe",
"cStandard": "gnu17",
"cppStandard": "c++17",
"intelliSenseMode": "gcc-x64",
"compilerArgs": [
"-std=c++17"
]
}
],
"version": 4
}
vscode_prj/.vscode/tasks.json:
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++.exe build active file",
"command": "C:\\MinGW\\bin\\g++.exe",
"args": [
"-std=c++17",
"-g",
"${workspaceFolder}\\*.cpp",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "C:\\MinGW\\bin"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "compiler: C:\\MinGW\\bin\\g++.exe"
}
]
}
vscode_prj/.vscode/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": "g++.exe - Сборка и отладка активного файла",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"miDebuggerPath": "C:\\MinGW\\bin\\gdb.exe",
"setupCommands": [
{
"description": "Включить автоматическое форматирование для gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++.exe build active file"
}
]
}
vscode_prj/.vscode/settings.json:
{
"files.associations": {
"*.tcc": "cpp",
"iosfwd": "cpp",
"iostream": "cpp",
"string": "cpp",
"iomanip": "cpp"
}
}
I am trying to follow this guide exactly
https://code.visualstudio.com/docs/cpp/config-clang-mac
Everything works fine until I reach the step "Debug helloworld.cpp", I am able to use the "tasks.json" file to build the .cpp file and run it in the command line. However as soon as I add the "launch.json" file outlined in "Debug helloworld.cpp" everything stops working and I get the following errors as soon as I try to debug.
expected ';' at end of declaration
range-based for loop is a C++11 extension [-Wc++11-extensions]
I have looked at many other stack overflow posts claiming that clang++ is defaulting to c++03 whereas I need to be using c++11, however the guide above uses
-std=c++17 as an argument.
The guide itself even provides the following related help at the bottom.
If you see build errors mentioning "C++11 extensions", you may not have updated your task.json build task to use the clang++ argument --std=c++17. By default, clang++ uses the C++98 standard, which doesn't support the initialization used in helloworld.cpp. Make sure to replace the entire contents of your task.json file with the code block provided in the Build helloworld.cpp section.
Which I definitely did do as you can see in the tasks.json file I linked below, so I don't see what the problem could be.
Any help at all would be appreciated.
tasks.json file...
{
"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": "build"
},
{
"type": "cppbuild",
"label": "C/C++: clang++ build active file",
"command": "/usr/bin/clang++",
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
]
}
launch.json file...
{
// 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": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "lldb",
"preLaunchTask": "C/C++: clang++ build active file"
}
]
}
c_cpp_properties.json file...
{
"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
}
Your launch.json calls the "C/C++: clang++ build active file" task. You want it to call your "clang++ build active file" task.
You don't need the -stdlib=libc++ on a Mac.
That is because your VSCode Debug Extension, does little matter with configuration files.
Do not use Microsoft C/C++(Identifier: ms-vscode.cpptools, for C/C++
IntelliSense, debugging, and code browsing)!
Just use CodeLLDB to debug C++ on mac. Just use CodeLLDBv1.4.5. Do not use the latest version of CodeLLDB(CodeLLDBv1.6.x has caused much more buggers since Nov 5, 2020, and never fix. that bugger version 1.6.10 has taken me seven days to config debug C++
with VSCode on mac, made me in trouble, made me depressed even masturbate 4 times in a week.).
Setup C++11 debug with VSCode on mac: Details of successful configuration refer to here.
I've been reading at almost every question related to include paths in vscode but I just can't solve my issue.
My project folder's custom libraries is in the following path
"/home/gdl/DSS2-DEV/infra"
The infra folder is structured as such:
>Infra
>Include
... some header files
>lib1
>Include
... header files
>src
... cpp files
>lib2
>Include
... header files
>src
... cpp files
So, in order to use any of these libraries, I set up the vscode environment
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "g++ - Build and debug active file",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [ {"name": "LD_LIBRARY_PATH", "value": "/usr/local/lib:$LD_LIBRARY_PATH" }],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++ build active file",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
tasks.json
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "C/C++: g++ build active file",
"command": "/usr/bin/g++",
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
"-I",
"/home/gdl/DSS2-DEV/infra"
],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"group": "build"
}
]
}
c_cpp_properties.json
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/home/gdl/DSS2-DEV/infra"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++14",
"intelliSenseMode": "clang-x64"
}
],
"version": 4
}
and yet, not a single library can be included:
cpp file
#include <cstdio>
#include <libadm.h>
int main()
{
return 0;
}
Executing task: /usr/bin/g++ -g /home/gdl/DSS2-DEV/infra/parser.cpp -o /home/gdl/DSS2-DEV/infra/parser -I /home/gdl/DSS2-DEV/infra <
/home/gdl/DSS2-DEV/infra/parser.cpp:2:20: fatal error: libadm.h: No such file or directory
#include <libadm.h>
I tried using slashes but it doesn't change a thing. What drives me crazy is that if I CTRL-click the library it actually shows me the header file of that library, meaning that vscode is correctly linking files togheter.
I also tried using quotes instead of brackets for the include but nothing works