C++: Was bedeutet dieser Fehler?


13.02.2021, 22:07

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

13.02.2021, 23:37

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.


13.02.2021, 23:45

Die Codes kann man unten bei meinen Antworten finden


14.02.2021, 12:44

Kann mir jemand helfen?


14.02.2021, 20:58

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

Vom Fragesteller als hilfreich ausgezeichnet
Aktuell kommt dieser Fehler:
undefined reference to `gets(std::string const&)'

Die Ursache:

  1. Du hast diese Funktion deklariert und rufst sie irgendwo auf.
  2. 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:

  1. Du zeigst Code für a(const std::string&), der Linker vermisst aber a(string). Das passt nicht zusammen!
  2. 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;
}
name123454321 
Fragesteller
 14.02.2021, 20:54

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
0
name123454321 
Fragesteller
 14.02.2021, 20:57

Ich habe die Lösung! (Siehe Ergänzung Frage)

0
ralphdieter  15.02.2021, 17:15
@name123454321
#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
1
Von Experte KarlRanseierIII bestätigt

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.

Woher ich das weiß:Berufserfahrung
name123454321 
Fragesteller
 13.02.2021, 20:36

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?

1
name123454321 
Fragesteller
 13.02.2021, 23:38

Ich habe neue Informationen zu meiner Frage ergänzt. (Siehe Frage oben)

1

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.

name123454321 
Fragesteller
 13.02.2021, 18:46

Aber ich habe die Implementierung in der .h Datei stehen.

1
TheQ86  13.02.2021, 18:50
@name123454321

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.

2
name123454321 
Fragesteller
 13.02.2021, 18:56
@TheQ86

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);
}
1
TheQ86  13.02.2021, 19:18
@name123454321

probier mal in der .cpp Datei das const rauszunehmen. das gibt bei mir auch Probleme. Im Prinzip sollte es im Header reichen.

2
TheQ86  13.02.2021, 19:57
@name123454321

Schau mal was @HTMLprogrammer geschrieben hat. Was passiert, wenn du die Headerdatei mitkompillierst

1
name123454321 
Fragesteller
 13.02.2021, 23:38
@TheQ86

Ich habe neue Informationen zu meiner Frage ergänzt. (Siehe Frage oben)

1

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 .

TheQ86  13.02.2021, 18:43

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.

10
FelixSH  13.02.2021, 19:03

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.

5
HTMLprogrammer  13.02.2021, 19:08

Deine Antworten zum Thema C++ sind auffallend schlecht bzw. oft fehlerhaft. Ist mir jetzt schon wiederholt aufgefallen.

4

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