Vscode g++ findet keine .cpp-Definitionsdateien

Lesezeit: 4 Minuten

Benutzer-Avatar
Raijin

Ich versuche, ein C++-Beispiel mit mehreren .cpp- und .hpp-Dateien zu kompilieren, aber g++ findet keine Elementfunktionsdefinition.


main.cpp:

#include <iostream>
#include "Person.hpp"

int main()
{
    std::cout << "HELL!\n";
    
    Person a{"Jiraya"};
    std::cout << a.getName() << "\n";
    a.setName("Niko");
    a.do_smt();
}

Person.hpp:

#pragma once

#include <string>

using std::string;

class Person
{
private:
    string name;

public:
    Person();
    Person(const string &n);
    void do_smt();
    string getName(){return name;}
    void setName(const string& n);

Person.cpp:

    #pragma once
    #include <iostream>
    #include "Person.hpp"
    
    Person::Person(const string &n) : name{n}
    {
    }
    
    void Person::setName(const string &n)
    {
        name = n;
    }
    
    void Person::do_smt()
    {
        std::cout << "???";
    }

Aufgaben.json:

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++ build active file",
            "command": "/usr/bin/g++",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}",
                "-iquote${workspaceFolder}/headers"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "Task generated by Debugger."
        }
    ],
    "version": "2.0.0"
}

Terminalausgabe:

> Executing task: C/C++: g++ build active file <

Starting build...
/usr/bin/g++ -fdiagnostics-color=always -g /home/raijin/Documents/Code/C++/sandbox/main.cpp -o /home/raijin/Documents/Code/C++/sandbox/main -iquote/home/raijin/Documents/Code/C++/sandbox/headers
/usr/bin/ld: /tmp/ccN0pJKE.o: in function `main':
/home/raijin/Documents/Code/C++/sandbox/main.cpp:9: undefined reference to `Person::Person(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/bin/ld: /home/raijin/Documents/Code/C++/sandbox/main.cpp:11: undefined reference to `Person::setName(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/bin/ld: /home/raijin/Documents/Code/C++/sandbox/main.cpp:12: undefined reference to `Person::do_smt()'
collect2: error: ld returned 1 exit status

Build finished with error(s).

Terminal will be reused by tasks, press any key to close it.

Hier ist die Projektordnerstruktur:

Ordnerstruktur

Ich habe hinzugefügt "-iquote${workspaceFolder}/headers" Arg ein tasks.json um .hpp in einem Unterverzeichnis zu finden. Es scheint nicht mit .cpp-Dateien zu funktionieren. Was mache ich? (Auch wenn ich umziehe Person.cpp zu ${workspaceFolder} ergibt die gleiche Terminalausgabe)

  • Die Befehlszeile, die Sie g++ gegeben haben, ist /usr/bin/g++ -fdiagnostics-color=always -g /home/raijin/Documents/Code/C++/sandbox/main.cpp -o /home/raijin/Documents/Code/C++/sandbox/main -iquote/home/raijin/Documents/Code/C++/sandbox/headers. Es gibt kein Person.cpp da drin. Sie haben g++ nicht gesagt, dass es diese Datei auch kompilieren muss. Fügen Sie es hinzu, wo immer Sie es hinzugefügt haben main.cpp.

    – Benutzer17732522

    25. Januar um 22:37 Uhr


  • Bitte zeigen Sie Ihre tasks.json denn das ist die Fehlerquelle.

    – drescherjm

    25. Januar um 22:41 Uhr


  • Ich habe das Argument „-iquote${workspaceFolder}/headers“ in task.json hinzugefügt, um .hpp in einem Unterverzeichnis zu finden. Es scheint nicht mit .cpp-Dateien zu funktionieren. Das ist richtig, es hat nichts mit Quelldateien zu tun. Sie müssen die Quelldateien genauso auflisten wie main.cpp oder einen oder mehrere Platzhalter verwenden, wenn sich die Dateien in unterschiedlichen Ordnern befinden.

    – drescherjm

    25. Januar um 22:53 Uhr


  • @drescherjm hat den Tasks.json-Code hinzugefügt

    – Raijin

    25. Januar um 22:59 Uhr

  • Dein Fehler ist hier: "${file}", es bedeutet, nur die aktive Datei zu kompilieren und alle anderen Quelldateien zu ignorieren. Sie sollten diese Zeile durch ersetzen "${workspaceFolder}/*.cpp", und hinzufügen "${workspaceFolder}/classes/*.cpp", als nächste Zeile.

    – drescherjm

    25. Januar um 23:01 Uhr


In deiner tasks.json Sie verwenden die Standardeinstellung ${file} kompilieren Sie also nur die aktive Datei und nicht alle Quelldateien in Ihrer Ordnerstruktur.

Die VSCode-Dokumentation erklärt, wie Sie dies für den Fall aller Quelldateien im selben Ordner hier beheben können: https://code.visualstudio.com/docs/cpp/config-linux#_modifying-tasksjson

Die Lösung ist zu ersetzen ${file} mit "${workspaceFolder}/*.cpp"

In Ihrem Fall haben Sie mehr als 1 Ordner mit Quelldateien. Sie können einen ähnlichen Fix auf den zweiten Ordner anwenden, indem Sie Folgendes hinzufügen: "${workspaceFolder}/classes/*.cpp"

die ganze task.json wäre also:

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++ build active file",
            "command": "/usr/bin/g++",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${workspaceFolder}/*.cpp",
                "${workspaceFolder}/classes/*.cpp",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}",
                "-iquote${workspaceFolder}/headers"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "Task generated by Debugger."
        }
    ],
    "version": "2.0.0"
}

1019260cookie-checkVscode g++ findet keine .cpp-Definitionsdateien

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy