tham chiếu không xác định đến 'std :: cout'


194

Đây có phải là ví dụ:

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

Nó ném lỗi:

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

Ngoài ra, ví dụ này:

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

ném lỗi:

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

Lưu ý: Tôi đang sử dụng Debian Wheezy.


158
Hãy thử g++thay vì gcc. gccdành cho C và sẽ không cấp cho bạn quyền truy cập vào thư viện chuẩn C ++.
juanchopanza

2
Vâng, điều đó chắc chắn đã giải quyết vấn đề. Theo tôi hiểu, GCC là từ viết tắt của Bộ sưu tập trình biên dịch Gnu. Không nên gọi trình biên dịch g ++ khi cần? Vì vậy, lệnh gcc gọi trình biên dịch c thay vì ...
D1X

1
@ D1X là vì bạn đã gọi trình liên kết riêng biệt với trình biên dịch. Khi bạn viết gcc -o edit main.onó không biết rằng main.osẽ cần thư viện khởi động C ++.
MM


4
Q: Không nên gọi trình biên dịch g ++ khi cần? A: Không nhiều hơn gcc nên gọi gfortran, gjc, ... vv, nếu cần.
paulsm4 16/07/2015

Câu trả lời:


275

Biên dịch chương trình với:

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

như couthiện diện trong thư viện chuẩn C ++, sẽ cần liên kết rõ ràng với -lstdc++khi sử dụng gcc; g++liên kết thư viện tiêu chuẩn theo mặc định.

Với gcc, ( g++nên được ưu tiên hơn gcc)

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

11
có thể được sử dụng để biên dịch mã C ++, điều này là nó không liên kết với thư viện C ++. gccsẽ hoạt động tốt nếu bạn chỉ cần thêm -lstdc++.
Một số lập trình viên anh chàng

3
Vui lòng luôn luôn bao gồm -Wallkhi đưa ra các ví dụ dòng lệnh gcc / g ++ - nó giúp đưa noobs thành thói quen tốt ở giai đoạn đầu và tiết kiệm thời gian của mọi người hơn nữa. ;-)
Paul R

4
Từ khi nào iostreams và std::coutlà một phần của Thư viện Mẫu Chuẩn?
TC

1
Tại sao -Werror cần thiết? Tôi đã sửa đổi tài liệu và nếu tôi hiểu rõ sẽ làm cho các cảnh báo lỗi và sẽ làm cho các dự án của tôi không dễ biên dịch.
D1X

7
@ D1X: Bởi vì có một thói quen khó chịu giữa các lập trình viên để bỏ qua các cảnh báo. Hầu như tất cả mọi thứ mà -Wallthậm chí -Wextracảnh báo là một vấn đề rất thực tế hoặc mã hóa cẩu thả có thể rất dễ dàng được sửa chữa. Thông điệp ở đây là tập thói quen mà bạn xem xét trình biên dịch cảnh báo một con trỏ hữu ích để mã của bạn có thể được cải thiện, thay vì phiền toái. Có hàng trăm câu hỏi ở đây về SO sẽ không cần thiết ngay từ đầu nếu OP đã sử dụng -Wall -Wextra. -Werrorchỉ đơn giản là củng cố điều đó.
DevSolar 2/2/2015

42

Có, sử dụng g++lệnh làm việc cho tôi:

g++ my_source_code.cpp

sau đó chạy với ./a.out
kaleidawave

2

Makefiles

Nếu bạn đang làm việc với một makefile và bạn đã kết thúc ở đây như tôi, thì đây có lẽ là thứ bạn đang tìm kiếm hoặc:

Nếu bạn đang sử dụng tệp tạo tệp, thì bạn cần thay đổi ccnhư hiển thị bên dưới

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

đến

CC = g++

my_executable : main.o
    $(CC) -o my_executable main.o
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.