referensi tidak terdefinisi untuk 'std :: cout'


194

Haruskah ini menjadi contoh:

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

Itu melempar kesalahan:

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

Juga, contoh ini:

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

melempar kesalahan:

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

Catatan: Saya menggunakan Debian Wheezy.


158
Coba g++alih-alih gcc. gccadalah untuk C dan tidak akan memberi Anda akses ke pustaka standar C ++.
juanchopanza

2
Nah, itu pasti menyelesaikan masalah. Seperti yang saya pahami, GCC adalah singkatan dari Gnu Compiler Collection. Bukankah seharusnya memanggil kompilator g ++ saat dibutuhkan? Jadi, perintah gcc memanggil c compiler sebagai gantinya ...
D1X

1
@ D1X itu karena Anda memanggil tautan secara terpisah dari kompiler. ketika Anda menulisnya gcc -o edit main.otidak tahu itu main.oakan membutuhkan pustaka startup C ++.
MM


4
T: Bukankah seharusnya memanggil kompilator g ++ saat dibutuhkan? A: Tidak lebih dari gcc harus memanggil gfortran, gjc, ... dll dll sesuai kebutuhan.
paulsm4

Jawaban:


275

Kompilasi program dengan:

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

sebagai cout hadir dalam C ++ standar perpustakaan, yang akan membutuhkan menghubungkan eksplisit dengan -lstdc++ketika menggunakan gcc; g++menghubungkan perpustakaan standar secara default.

Dengan gcc, ( g++harus lebih disukai daripada gcc)

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

11
Itu dapat digunakan untuk mengkompilasi kode C ++, masalahnya adalah ia tidak terhubung dengan pustaka C ++. gccakan bekerja dengan baik jika Anda hanya menambahkan -lstdc++.
Beberapa programmer dude

3
Harap selalu sertakan -Wallketika memberikan contoh baris perintah gcc / g ++ - ini membantu untuk membuat noobs menjadi kebiasaan yang baik pada tahap awal dan menghemat waktu semua orang lebih jauh. ;-)
Paul R

4
Sejak kapan iostreams dan std::coutbagian dari Perpustakaan Template Standar?
TC

1
Mengapa -Werror dibutuhkan? Saya telah merevisi dokumentasi dan jika saya mengerti dengan baik akan membuat kesalahan peringatan dan akan membuat proyek saya kurang mudah untuk dikompilasi.
D1X

7
@ D1X: Karena ada kebiasaan buruk di antara programmer untuk mengabaikan peringatan. Sebenarnya segala sesuatu yang -Walldan bahkan -Wextramemperingatkan tentang masalah yang sangat nyata, atau pengkodean ceroboh yang dapat dengan mudah diperbaiki. Pesan di sini adalah untuk membiasakan diri di mana Anda menganggap peringatan kompiler sebagai petunjuk yang bermanfaat di mana kode Anda dapat ditingkatkan, alih-alih gangguan. Ada ratusan pertanyaan di sini di SO yang tidak akan diperlukan di tempat pertama jika OP telah digunakan -Wall -Wextra. -Werrorhanya memperkuat itu.
DevSolar

42

Ya, menggunakan g++perintah berhasil untuk saya:

g++ my_source_code.cpp

kemudian jalankan dengan./a.out
kaleidawave

2

Makefiles

Jika Anda bekerja dengan makefile dan Anda berakhir di sini seperti saya, maka ini mungkin yang Anda cari atau:

Jika Anda menggunakan makefile, maka Anda perlu mengubah ccseperti yang ditunjukkan di bawah ini

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

untuk

CC = g++

my_executable : main.o
    $(CC) -o my_executable main.o
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.