niezdefiniowane odniesienie do 'std :: cout'

197

Może to być przykład:

#include <iostream>
using namespace std;
int main()
{
    cout << "Hola, moondo.\n";
}

Zgłasza błąd:

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

Również ten przykład:

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

zgłasza błąd:

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

Uwaga: używam Debian Wheezy.

D1X
źródło
159
Spróbuj g++zamiast gcc. gccjest dla C i nie da ci dostępu do standardowej biblioteki C ++.
juanchopanza
2
To zdecydowanie rozwiązało problem. Jak rozumiem, GCC to skrót od Gnu Compiler Collection. Czy nie powinien wywoływać kompilatora g ++, gdy jest potrzebny? Więc polecenie gcc wywołuje zamiast tego kompilator c ...
D1X
1
@ D1X to dlatego, że wywołałeś linker oddzielnie od kompilatora. kiedy piszesz gcc -o edit main.o, nie wie, że main.obędzie potrzebował bibliotek startowych C ++.
MM
4
P: Czy w razie potrzeby nie powinien wywoływać kompilatora g ++? Odp .: Nie więcej niż gcc powinno w razie potrzeby wywoływać gfortran, gjc, itp. Itd.
paulsm4

Odpowiedzi:

277

Skompiluj program z:

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

jak coutjest obecna w C ++ biblioteki standardowej, która musiałaby wyraźne powiązanie ze -lstdc++podczas korzystania gcc; g++domyślnie łączy standardową bibliotekę.

Z gcc( g++powinno być lepsze niż gcc)

gcc main.cpp -lstdc++ -o main.o
shauryachats
źródło
11
To może być używany do kompilacji kodu C ++, jest to, że nie odwołuje się do biblioteki C ++. gccbędzie działać dobrze, jeśli tylko dodasz -lstdc++.
Jakiś programista koleś
3
Zawsze dołączaj -Wall, podając przykłady wiersza poleceń gcc / g ++ - pomaga to wczuć się w dobre nawyki noobów i oszczędza każdemu czas na dalszej drodze. ;-)
Paul R
4
Od kiedy iostreams jest std::coutczęścią Standardowej Biblioteki Szablonów?
TC
1
Dlaczego -Werror jest potrzebny? Poprawiłem dokumentację i, jeśli dobrze rozumiem, błędy ostrzeżeń zostaną wykonane, a moje projekty będą trudniejsze do skompilowania.
D1X
7
@ D1X: Ponieważ programiści mają nieprzyjemny zwyczaj ignorowania ostrzeżeń. Praktycznie wszystko, o -Wallczym nawet -Wextraostrzega, jest albo bardzo realnym problemem, albo niechlujnym kodowaniem, które można bardzo łatwo naprawić. Przesłaniem tutaj jest przyzwyczajenie się, w którym ostrzeżenia kompilatora są uważane za pomocny wskaźnik, w którym można ulepszyć kod, zamiast uciążliwego. Są tutaj setki pytań na temat SO, które nie byłyby potrzebne w pierwszej kolejności, gdyby użył PO -Wall -Wextra. -Werrorpo prostu to wzmacnia.
DevSolar,
42

Tak, użycie g++polecenia działało dla mnie:

g++ my_source_code.cpp
AB
źródło
następnie biegnij z./a.out
kaleidawave
2

Makefile

Jeśli pracujesz z plikiem makefile i wylądowałeś tutaj jak ja, to prawdopodobnie tego szukasz lub:

Jeśli używasz makefile, musisz zmienić, ccjak pokazano poniżej

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

do

CC = g++

my_executable : main.o
    $(CC) -o my_executable main.o
iggy12345
źródło