Fehler “undefinierter Verweis auf ‘std::cout'”

Lesezeit: 6 Minuten

Benutzer-Avatar
D1X

Soll das das Beispiel sein:

#include <iostream>
using namespace std;

int main()
{
    cout << "Hola, moondo.\n";
}

Es wirft den Fehler:

gcc -c main.cpp gcc -o edit main.o  main.o: In function `main':
main.cpp:(.text+0xa): undefined reference to `std::cout'
main.cpp:(.text+0xf): undefined reference to `std::basic_ostream<char,std::char_traits<char> >& std::operator<< <std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
main.o: In function `__static_initialization_and_destruction_0(int,int)':
main.cpp:(.text+0x3d): undefined reference to `std::ios_base::Init::Init()'
main.cpp:(.text+0x4c): undefined reference to `std::ios_base::Init::~Init()' collect2: error: ld
returned 1 exit status make: *** [qs] Error 1

Auch dieses Beispiel:

#include <iostream>

int main()
{
    std::cout << "Hola, moondo.\n";
}

wirft den Fehler:

gcc -c main.cpp gcc -o edit main.o  main.o: In function `main':
main.cpp:(.text+0xa): undefined reference to `std::cout'
main.cpp:(.text+0xf): undefined reference to `std::basic_ostream<char,std::char_traits<char> >& std::operator<<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char> >&, char const*)'
main.o: In function `__static_initialization_and_destruction_0(int,int)': main.cpp:(.text+0x3d): undefined reference to `std::ios_base::Init::Init()'
main.cpp:(.text+0x4c): undefined reference to `std::ios_base::Init::~Init()' collect2: error: ld
returned 1 exit status make: *** [qs] Error 1

Hinweis: Ich verwende Debian 7 (Wheezy).

  • Versuchen g++ anstatt gcc. gcc ist für C und gibt Ihnen keinen Zugriff auf die C++-Standardbibliothek.

    – Juanchopanza

    30. Januar 2015 um 13:21 Uhr


  • Nun, das hat das Problem definitiv gelöst. Soweit ich weiß, ist GCC das Akronym für Gnu Compiler Collection. Sollte es nicht bei Bedarf den g++ Compiler aufrufen? Der Befehl gcc ruft also stattdessen den c-Compiler auf …

    – D1X

    31. Januar 2015 um 14:42 Uhr

  • @D1X liegt daran, dass Sie den Linker separat vom Compiler aufgerufen haben. wenn du schreibst gcc -o edit main.o das weiß es nicht main.o wird C++-Startbibliotheken benötigen.

    – MM

    26. Februar 2015 um 4:22 Uhr

  • RTFM gcc.gnu.org/onlinedocs/gcc/Invoking-G_002b_002b.html

    – Jonathan Wakely

    4. Juni 2015 um 14:11 Uhr

  • F: Sollte es nicht bei Bedarf den g++ Compiler aufrufen? A: Nicht mehr als gcc sollte gfortran, gjc, … usw. usw. nach Bedarf aufrufen.

    – paulsm4

    16. Juli 2015 um 3:29 Uhr


Benutzer-Avatar
Shauryachats

Kompilieren Sie das Programm mit:

g++ -Wall -Wextra -Werror -c main.cpp -o main.o
     ^^^^^^^^^^^^^^^^^^^^ <- For listing all warnings when your code is compiled.

als cout ist in der C++-Standardbibliothek vorhanden, die benötigt würde explizite Verlinkung mit -lstdc++ beim Benutzen gcc; g++ bindet standardmäßig die Standardbibliothek ein.

Mit gcc(g++ sollte gegenüber bevorzugt werden gcc)

gcc main.cpp -lstdc++ -o main.o

  • Es kann verwendet werden, um C++-Code zu kompilieren, die Sache ist, dass dies nicht der Fall ist Verknüpfung mit der C++-Bibliothek. gcc wird gut funktionieren, wenn Sie nur hinzufügen -lstdc++.

    – Irgendein Programmierer-Typ

    30. Januar 2015 um 13:24 Uhr


  • Bitte immer angeben -Wall B. bei gcc/g++-Befehlszeilenbeispielen – es hilft, Noobs frühzeitig in gute Gewohnheiten zu versetzen und spart später allen Zeit. 😉

    – PaulR

    30. Januar 2015 um 13:29 Uhr

  • Seit wann ist iostreams und std::cout Teil der Standard Template Library?

    – TC

    30. Januar 2015 um 13:45 Uhr


  • Warum wird -Werror benötigt? Ich habe die Dokumentation überarbeitet und wenn ich sie gut verstehe, werden die Warnungen fehlerhaft und meine Projekte werden weniger einfach zu kompilieren sein.

    – D1X

    31. Januar 2015 um 15:02 Uhr

  • @D1X: Weil es unter Programmierern eine unangenehme Angewohnheit gibt ignorieren Warnungen. Praktisch alles, was -Wall und sogar -Wextra warnen ist entweder ein sehr reales Problem oder eine schlampige Codierung, die sehr einfach behoben werden kann. Die Botschaft hier ist, es sich zur Gewohnheit zu machen, Compiler-Warnungen als hilfreichen Hinweis darauf zu betrachten, wo Ihr Code verbessert werden könnte, anstatt als Ärgernis. Es gibt Hunderte von Fragen hier zu SO, die überhaupt nicht notwendig gewesen wären, wenn das OP verwendet worden wäre -Wall -Wextra. -Werror verstärkt das nur.

    – DevSolar

    2. Februar 2015 um 11:54 Uhr


Benutzer-Avatar
AB

Ja, verwenden g++ Befehl hat bei mir funktioniert:

g++ my_source_code.cpp

  • dann lauf mit ./a.out

    – Ben

    16. August 2019 um 20:45 Uhr

  • Klassisch. Das vergesse ich immer g++ ist eine Sache.

    – serg06

    22. Juni 2021 um 18:58 Uhr

Benutzer-Avatar
losnihciL

Vorausgesetzt code.cpp der Quellcode ist, wird Folgendes keine Fehler auslösen:

make code
./code

Hier kompiliert der erste Befehl den Code und erstellt eine ausführbare Datei mit demselben Namen, und der zweite Befehl führt sie aus. Eine Angabe ist nicht erforderlich g++ Stichwort in diesem Fall.

  • Eine gute Alternative und eine nette schnelle Einführung, um Dienstprogramm zu machen.

    – Raddevus

    27. Oktober 2020 um 14:15 Uhr

Makefiles

Wenn Sie mit einem Makefile arbeiten und wie ich hier gelandet sind, dann ist dies wahrscheinlich das, was Sie suchen, oder:

Wenn Sie ein Makefile verwenden, müssen Sie es ändern cc Wie nachfolgend dargestellt

my_executable : main.o
    cc -o my_executable main.o

zu

CC = g++

my_executable : main.o
    $(CC) -o my_executable main.o

Benutzer-Avatar
Netzhaut

FWIW, wenn Sie ein Makefile möchten, können Sie wie folgt antworten, indem Sie den Compiler oben wechseln.

# links stdc++ library by default
# CC := g++
# or
CC := cc

all: hello

util.o: util.cc
        $(CC) -c -o util.o  util.cc

main.o: main.cc
        $(CC) -c -o main.o  main.cc

# notice -lstd++ is after the .o files
hello: main.o util.o
        $(CC) -o hello main.o util.o -lstdc++

clean:
        -rm util.o main.o hello

  • Sind nicht machen Dateien abhängig von einem TAB-Zeichen? In dieser Antwort gibt es keine in der Markdown-Quelle. Zumindest könnte es erwähnt werden (falls es der Fall ist).

    – Peter Mortensen

    3. April um 13:55 Uhr


  • Es wurde darüber verteilt, um es in ein Format für die Anzeige als Codeblock im Markdown zu bringen. Wenn Sie wissen, wie man es bearbeitet, damit es wie Code aussieht und dennoch Makefile-Tabs hat, würde ich es begrüßen.

    – Netzhaut

    4. April um 17:06 Uhr

  • Sind nicht machen Dateien abhängig von einem TAB-Zeichen? In dieser Antwort gibt es keine in der Markdown-Quelle. Zumindest könnte es erwähnt werden (falls es der Fall ist).

    – Peter Mortensen

    3. April um 13:55 Uhr


  • Es wurde darüber verteilt, um es in ein Format für die Anzeige als Codeblock im Markdown zu bringen. Wenn Sie wissen, wie man es bearbeitet, damit es wie Code aussieht und dennoch Makefile-Tabs hat, würde ich es begrüßen.

    – Netzhaut

    4. April um 17:06 Uhr

1013460cookie-checkFehler “undefinierter Verweis auf ‘std::cout'”

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

Privacy policy