VS Code will not build c++ programs with multiple .ccp source files

57,762

Solution 1

in tasks.json:

        "label": "g++.exe build active file",
        "args": [
            "-g",
            "${fileDirname}\\**.cpp",
            //"${fileDirname}\\**.h",
            "-o",
            "${fileDirname}\\${fileBasenameNoExtension}.exe",
        ],

in launch.json:

"preLaunchTask": "g++.exe build active file"

it will work if your sources are in separated folder

Solution 2

feeling lazy,

This is tasks.json of vscode for linux distros, to compile multiple cpp files.

{
"version": "2.0.0",
"tasks": [
    {
        "type": "shell",
        "label": "C/C++: 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
        }
    }
]

}

Solution 3

This is a Windows answer for the same problem:

I was struggling with this as well until I found the following answer at https://code.visualstudio.com/docs/cpp/config-mingw :

You can modify your tasks.json to build multiple C++ files by using an argument like "${workspaceFolder}\\*.cpp" instead of ${file}. This will build all .cpp files in >your current folder. You can also modify the output filename by replacing "${fileDirname}\\${fileBasenameNoExtension}.exe" with a hard-coded filename (for >example "${workspaceFolder}\\myProgram.exe").

Note that the F in workspaceFolder is capitalized.

As an example, in my tasks.json file in my project, the text in between the brackets under "args" originally appeared as follows:

"-g",
  "${file}",
  "-o",
  "${fileDirname}\\${fileBasenameNoExtension}.exe"

This gave me reference errors because it was only compiling one and not both of my files.

However, I was able to get the program to work after changing that text to the following:

"-g",
"${workspaceFolder}\\*.cpp",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"

Solution 4

If you have multiple files and one depends on a cpp file for another, you need to tell g++ to compile it as well, so the linker can find it. The simplest way would be:

$ g++ Cat.cpp main.cpp -o Classes

As a side note, you should probably compile with warnings, minimally -Wall, likely -Wextra, and possibly -Wpedantic, so you know if something you're doing is problematic.

Solution 5

"tasks": [
    {
        "label": "echo",
        "type": "shell",
        "command": "g++",
        "args":[
            "-g","main.cpp","cat.cpp"
        ],
        "group": {
            "kind": "build",
            "isDefault": true
        }
    }

Just add cat.cpp in args and then try to run. It should run without error on VS code

Share:
57,762
Danny Hepple
Author by

Danny Hepple

I'm a 3D artist working in the North-East of the United Kingdom.

Updated on January 25, 2022

Comments

  • Danny Hepple
    Danny Hepple over 2 years

    Note that I'm using VS Code on Ubuntu 17.10 and using the GCC Compiler.

    I'm having trouble building a simple program which makes use of additional .ccp files. I'm probably missing something obvious here as I'm fairly new to programming but I'll explain what I've done so far. This is something that is stopping me from continuing with a tutorial I'm doing.

    I have written a very simple program to demonstrate my point as follows.

    main.ccp


    #include <iostream>
    #include "Cat.h"
    
    using namespace std;
    
    int main ()
    {
    
    speak();
    
    return 0;
    }
    

    Cat.h


    #pragma once
    
    
    
    void speak();
    

    Cat.ccp


    #include <iostream>
    #include "Cat.h"
    
    using namespace std;
    
    void speak()
    {
    std::cout << "Meow!!" << std::endl;
    
    }
    

    This simple program builds in both Codeblocks and Visual Studio Community 2017 no problem and I can't figure out what I need to do to make it run. This error at the bottom indicates that the Cat.ccp file is not being picked up at all. If I was to drop the definition from this Cat.ccp into the header file the program compiles and runs fine but I need to make use of that .ccp file as I understand this is the accepted way of separating code. I'll note that all the files are in the same folder too.

    I understand that I may need to tell VS Code where to look for the Cat.ccp file but it's strange to me that it finds the header in the same location. Nevertheless, after looking online I've been reading that I may need to place a directory into the c_cpp_intellisense_properties.json. Here's what mine looks like.

    {
    "configurations": [
        {
            "name": "Mac",
            "includePath": [
                "/usr/include",
                "/usr/local/include",
                "${workspaceRoot}"
            ],
            "defines": [],
            "intelliSenseMode": "clang-x64",
            "browse": {
                "path": [
                    "/usr/include",
                    "/usr/local/include",
                    "${workspaceRoot}"
                ],
                "limitSymbolsToIncludedHeaders": true,
                "databaseFilename": ""
            },
            "macFrameworkPath": [
                "/System/Library/Frameworks",
                "/Library/Frameworks"
            ]
        },
        {
            "name": "Linux",
            "includePath": [
                "/usr/include/c++/7",
                "/usr/include/x86_64-linux-gnu/c++/7",
                "/usr/include/c++/7/backward",
                "/usr/lib/gcc/x86_64-linux-gnu/7/include",
                "/usr/local/include",
                "/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed",
                "/usr/include/x86_64-linux-gnu",
                "/usr/include",
                "/home/danny/Documents/C++_Projects/24_-_Classes/Cat.cpp",
                "${workspaceRoot}",
                "/home/danny/Documents/C++_Projects/24_-_Classes/",
                "/home/danny/Documents/C++_Projects/24_-_Classes/.vscode",
                "/home/danny/Documents/C++_Projects/24_-_Classes/.vscode/Cat.cpp"
            ],
            "defines": [],
            "intelliSenseMode": "clang-x64",
            "browse": {
                "path": [
                    "/usr/include/c++/7",
                    "/usr/include/x86_64-linux-gnu/c++/7",
                    "/usr/include/c++/7/backward",
                    "/usr/lib/gcc/x86_64-linux-gnu/7/include",
                    "/usr/local/include",
                    "/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed",
                    "/usr/include/x86_64-linux-gnu",
                    "/usr/include",
                    "${workspaceRoot}",
                    "/home/danny/Documents/C++_Projects/24_-_Classes/",
                    "/home/danny/Documents/C++_Projects/24_-_Classes/.vscode/Cat.cpp"
                ],
                "limitSymbolsToIncludedHeaders": true,
                "databaseFilename": ""
            }
        },
        {
            "name": "Win32",
            "includePath": [
                "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/include",
                "${workspaceRoot}"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE"
            ],
            "intelliSenseMode": "msvc-x64",
            "browse": {
                "path": [
                    "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/include/*",
                    "${workspaceRoot}"
                ],
                "limitSymbolsToIncludedHeaders": true,
                "databaseFilename": ""
            }
        }
    ],
    "version": 3
    }
    

    At one point I wondered if I need to add a double command in there to tell the compiler to build both .ccp files in the tasks.json but I haven't managed to figure out how to do that, or even if that's the right approach.

    tasks.json


    {
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Build",
            "type": "shell",
            "command": "g++ -g /home/danny/Documents/C++_Projects/24_-_Classes/main.cpp -o Classes",
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher":"$gcc"
        }
    ]
    }
    

    Appreciate any help. And just in case you're wondering, the reason I don't just finish the tutorial in Codeblocks or VS Community is that I like to know what's going on under the hood in most things. Plus I'd like to get VS Code working for me as it's been great so far.

  • David C. Rankin
    David C. Rankin almost 6 years
    I guess that's one way to do it. Make sure he understands after adding the task, he will need to right-click on the file in the list to select "echo" to compile it.
  • user2225804
    user2225804 over 4 years
    It may be difficult for others to understand your answer. You should provide some explanation, in particular how it answers the question.
  • Anns98
    Anns98 over 4 years
    Im sorry.. im learning english and not fluent but i'll do my best
  • Johan
    Johan over 4 years
    It builds all files with .cpp name ending. The -o (outputfile) specifies what name the executable should have and where it should be located. For me on Linux the directory is called "workspaceFolder" i.e. "${workspaceFolder}/**.cpp"
  • Victor Ponamarev
    Victor Ponamarev over 4 years
    You suggest to add each file one by one? Seriously?
  • Victor Ponamarev
    Victor Ponamarev over 4 years
    Doesn't work in case .cpp is located in another directory, in above level of hierarchy.
  • HojjatK
    HojjatK about 4 years
    if your cpp files exists in a different folder rather ${fileDirname}, you can specified it relatively. for example for me it was like "${fileDirname}//..//**.cpp" which means the cpp located in the parent directory of .vscode.
  • TomSawyer
    TomSawyer about 4 years
    why the hell if i include files from other folder like "${fileDirname}/src/*.c", it won't work?
  • mLstudent33
    mLstudent33 almost 4 years
    Is the `\` windows syntax?
  • Tiago
    Tiago almost 4 years
    @Anns98 when using "${fileDirname}\\**.cpp", gcc takes the **.cpp as literal and I get the error "(...)**.c: No such file or directory"
  • Tiago
    Tiago almost 4 years
    @Tiago for those having the same problem, you have to use a forward slash to select all .cpp files, like "${fileDirname}/**.cpp" instead of "${fileDirname}\\**.cpp"
  • Anns98
    Anns98 almost 4 years
    @Tiago why dont you try "${fileDirname}\**.c"? i dont know exactly but it may work
  • Tiago
    Tiago almost 4 years
    look at my last comment, I managed to fix it. thank you anyway
  • klaus triendl
    klaus triendl over 3 years
    @mLstudent33 Yes, that's windows escape syntax.
  • KK2491
    KK2491 over 3 years
    Thanks for the answer, could you please let me know how would I include the header files?
  • arfneto
    arfneto over 2 years
    Well, you may call it simple. But it has nothing to do with the original question: the issue is how to tell VSCODE about the dependencies not g++
  • Admin
    Admin over 2 years
    no matter what i do , "${workspaceFolder}\\**.cpp", "${workspaceFolder}/**.cpp" or "${workspaceFolder}/*.cpp" Vs code take it literally and return the "No such file or directory" error. I test it with the Terminal directly and g++ build all files with no problem. I am using Ubuntu.
  • Shivam Pal
    Shivam Pal over 2 years
    does this works for nested folders?. I've been trying to figure out a way to make it work for nested folders with something like ${workspaceFolder}\\**\\*.cpp
  • A P
    A P about 2 years
    and then how would i run it?>
  • KBurchfiel
    KBurchfiel about 2 years
    @APars Within Visual Studio Code, the shortcut to run programs is F5 (or Shift + F5 to skip debugging). Or you could use Ctrl + Shift + B to build the program.