C++: Was bedeutet dieser Fehler?
Hallo,
Bei meinem C++ Projekt bin ich mittlerweile relativ weit gekommen, aber ich habe leider keine Ahnung was diesen Fehler verursacht und wie ich diesen beheben kann. (Weswegen ich auch gerade diese Frage schreibe). Ich nutze den G++ Compiler und arbeite mit Visual Studio Code. Wie in meiner letzten Frage zu lesen ist, habe ich einen Header mit einer Funktion erstellt. Wenn ich mein Programm welches diese Funktion aufruft, kompilieren lasse kommt dieser Fehler:
C:\Users\Admin\AppData\Local\Temp\ccyIKrHY.o:a.cpp:(.text+0x1fa): undefined reference to `a(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
collect2.exe: error: ld returned 1 exit status
Was verursacht diesen Fehler und wie kann ich das beheben?
LG
Aktuell kommt dieser Fehler:
C:\Users\Admin\AppData\Local\Temp\ccmmJiU9.o:a.cpp:(.text+0x1db): undefined reference to `gets(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
collect2.exe: error: ld returned 1 exit status
NEUE INFORMATION: Ich dachte am Anfang dass eine Funktion die ich puts gennant habe funktioniert hat. Sie hat die ganze Zeit über auch nicht funktioniert. Ich wusste nur nicht dass es in C++ bereits so eine Funktion gibt die zufällig dass gleiche macht wie meine Funktion. Also: Ich kann überhaupt keine Funktionen in meinem Header erstellen.
Die Codes kann man unten bei meinen Antworten finden
Kann mir jemand helfen?
Ich habe endlich die Lösung! Ich weiß nicht genau wie das geht aber ich habe jezt in meine Haupt Datei anstatt #include "cli.h", #include "cli.cpp" geschrieben und es funktioniert!
5 Antworten
Aktuell kommt dieser Fehler:
undefined reference to `gets(std::string const&)'
Die Ursache:
- Du hast diese Funktion deklariert und rufst sie irgendwo auf.
- Du hast diese Funktion nicht definiert.
Punkt 2 scheitert manchmal an Kleinigkeiten, wenn z.B. Deine Definition
- in einem anderen Namespace liegt als die Deklaration
- einen Buchstabendreher im Namen hat
- leicht andere Argumente erwartet (fehlendes const oder &)
Damit definierst Du eine andere Funktion (was erlaubt ist). Aber die deklarierte und aufgerufene fehlt dann beim Linken.
________
Dein Code unter dieser Antwort sollte eigentlich linken. Seltsam ist nur:
- Du zeigst Code für a(const std::string&), der Linker vermisst aber a(string). Das passt nicht zusammen!
- Dein Code compiliert nicht, weil Du einen const string mit getline() ändern willst.
Hier hast Du eine Variante, die bei mir ausführbar ist:
cli.h:
#include <iostream>
#include <string>
#ifndef CLI_H
#define CLI_H
void puts(std::string);
void gets(std::string&);
#endif
cli.c++:
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <iterator>
#include <cctype>
#include "cli.h"
void puts(std::string args) {
std::cout << "| " << args << std::endl;
}
void gets(std::string& s) {
std::getline(std::cin, s);
}
int main()
{
puts("Was geht ab? "); // C-Funktion puts(char const*)
std::string answer;
gets(answer);
puts("Warum "+answer+"?"); // puts(std::string)
return 0;
}
#include "cli.cpp"
funktioniert zwar, ist aber unnötig (und unüblich).
Achte einfach darauf, alle erforderlichen cpp-Dateien beim Compilieren anzugeben:
g++ -o a.exe a.cpp cli.cpp
Wenn Du später immer mehr cli-Funktionen implementierst, kannst Du sie getrennt übersetzen und eine Bibliothek daraus machen:
g++ -c puts.cpp gets.cpp # erzeugt puts.o gets.o
ar rs libcli.a puts.o gets.o # erzeugt libcli.a
Die Bibliothek libcli.a enthält die fertig übersetzten Quelltexte.
Nun kannst Du Dein Programm mit dieser Bibliothek (libcli.a) übersetzen und linken:
g++ -o a.exe a.cpp -lcli
Wenn ich es so mache funktioniert es wirklich! :) Aber das Problem ist dass meine main Funktion in einer anderen Datei ist. In dieser Datei habe ich auch #include <...\cli.h> heschrieben aber es kommt der Fehler:
C:\Users\Admin\AppData\Local\Temp\ccsCiRZx.o:a.cpp:(.text+0x1db): undefined reference to `GETS(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)'
collect2.exe: error: ld returned 1 exit status
Das ist ein Fehler des Linkers, und nicht des Compilers.
Die Übersetzungseinheit mit der Implementierung der a(string) Funktion wurde nicht gefunden!
Achte darauf, alle Quelldateien zu übersetzen, und danach ALLE an den Linker zu übergeben.
Ich habe neue Informationen zu meiner Frage ergänzt. (Siehe Frage oben)
Also muss die .h Datei komlieren? Ist die Dateiendung eines komlierten Headers .exe? Und die .cpp muss ich auch zu auch zu einer .exe machen?
Sieht aus, als würdest Du eine Funktion aufrufen, die Du zwar deklariert hast, aber der Linker kann die Implementierung nicht finden.
Du musst die Implementierung entweder in einer anderen Quelldatei bereitstellen oder gegen eine Bibliothek linken, die eine Implementierung bereitstellt.
Aber ich habe die Implementierung in der .h Datei stehen.
In eine .h Datei kommen eigentlich nur die Header, also die Definition des Funktionskopfes. Die Implementierungen kommen dann in die CPP Datei.
Was helfen würde wären Quellcode und mit welchen Befehlen du kompillierst.
Mit diesem Befehl kompiliere ich:
g++ -o a.exe a.cpp
Und hier ist der Code der .h Datei:
#include <iostream>
#include <string>
#ifndef CLI_H
#define CLI_H
void puts(std::string); // Das ist eine andere Funktion aber die funktioniert
void a(const std::string&); // Die Problem-Funktion
#endif
Und hier ist der Code der .cpp Datei: (Sie liegen beide im selbem Verzeichnis)
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <iterator>
#include <cctype>
#include "cli.h"
using namespace std;
void puts(std::string args) {
cout << args << endl;
}
void a(const std::string& s) {
getline(std::cin, s);
}
probier mal in der .cpp Datei das const rauszunehmen. das gibt bei mir auch Probleme. Im Prinzip sollte es im Header reichen.
Schau mal was @HTMLprogrammer geschrieben hat. Was passiert, wenn du die Headerdatei mitkompillierst
Ich habe neue Informationen zu meiner Frage ergänzt. (Siehe Frage oben)
Deine Frage zeigt nur eins . Lerne erstmal die Grundlagen . Denn Du hast -100% Wissen , also nicht mal das was man hat wenn man nur ein einfaches Tutorial durchgearbeitet hat.
Also lerne was header dateien sind , was cpp dateien sind, wie man sie in einem programm zusammen compiliert etc . Also das Grundlagen Ding halt. Ja Programmieren fängt man bei 0 an und dann weiter ... , nicht auf seite 100 im buch anfangen , dann hat man auch sein Werkzeug um etwas richtig zu machen .
So ein bescheidenes Von-Oben-Herab wird alle verschrecken, die mit Programmieren anfangen. Schon mal dran gedacht, dass der Fragesteller schon ein Tutorial durchgearbeitet hat und jetzt mit einem Grundgerüst rumexperimentiert? Wie lange soll man Theorie lesen, bis man sich mal die Hände schmutzig macht? Du stellst hier nur das Unwissen des Fragestellers heraus, ohne für das konkrete Problem irgend etwas beizutragen.
Du könntest zumindest im Ansatz erklären, was das Problem ist, anstatt hier so generell den FS fertig zu machen. Dadurch lernt man immer noch wesentlich besser, als einfach mit der Info "Lern die Grundlagen". Dein Kommentar ist völlig wertlos.
Deine Antworten zum Thema C++ sind auffallend schlecht bzw. oft fehlerhaft. Ist mir jetzt schon wiederholt aufgefallen.
Dir wurde die Frage bereits beantwortet, es ist immernoch der gleiche Fehler, wenn auch nicht der selbe.
Sorge dafür, daß der Linker alles findet was er braucht. Wenn DU in Deinem Header Implementierungen hast, dann ist das eine eigene Übersetzungseinheit, die Du übersetzen solltest und die Du dann beim finalen Linken mit übergibst.
https://gcc.gnu.org/onlinedocs/gcc-10.2.0/gcc/Invoking-GCC.html#Invoking-GCC
Ich habe die Lösung! (Siehe Ergänzung Frage)