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:
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 keinPerson.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 habenmain.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