'std :: cout'에 대한 정의되지 않은 참조


197

이것이 예일까요?

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

오류가 발생합니다.

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

또한이 예는 다음과 같습니다.

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

오류가 발생합니다.

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

참고 : Debian Wheezy를 사용하고 있습니다.


161
g++대신 사용해보십시오 gcc. gccC 용이며 C ++ 표준 라이브러리에 액세스 할 수 없습니다.
juanchopanza

2
글쎄, 그것은 확실히 문제를 해결했다. 내가 이해하는 것처럼 GCC는 Gnu Compiler Collection의 약어입니다. 필요할 때 g ++ 컴파일러를 호출해서는 안됩니까? 따라서 gcc 명령은 대신 c 컴파일러를 호출합니다.
D1X

1
@ D1X 컴파일러와 별도로 링커를 호출했기 때문입니다. 작성할 때 C ++ 시작 라이브러리가 필요 gcc -o edit main.o하다는 것을 알지 못합니다 main.o.
MM


4
Q : 필요할 때 g ++ 컴파일러를 호출해서는 안됩니까? A : gcc 이상은 필요에 따라 gfortran, gjc 등을 불러야합니다.
paulsm4

답변:


278

다음을 사용하여 프로그램을 컴파일하십시오.

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

등의 cout필요가 C ++ 표준 라이브러리에 존재하는 명시 적 링크 와 함께 -lstdc++사용하는 경우를 gcc; g++기본적으로 표준 라이브러리를 연결합니다.

으로 gcc( g++보다 선호해야 함 gcc)

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

11
수있는 C ++ 코드를 컴파일하는 데 사용할 수의 점은 없다는 것입니다 링크 는 C ++ 라이브러리. gcc추가하면 잘 작동합니다 -lstdc++.
일부 프로그래머 친구

3
-Wallgcc / g ++ 명령 행 예제를 제공 할 때 항상 포함하십시오 . 초기 단계에서 멍청한 놈을 좋은 습관으로 만드는 데 도움이되고 모든 시간을 도로에서 더 절약 할 수 있습니다. ;-)
Paul R

4
언제부터 iostream과 std::cout표준 템플릿 라이브러리의 일부입니까?
TC

1
왜 오류가 필요합니까? 나는 문서를 개정했으며 잘 이해하면 경고 오류가 발생하고 프로젝트를 쉽게 컴파일 할 수 없게됩니다.
D1X

7
@ D1X : 프로그래머들에게는 경고 를 무시 하는 불쾌한 습관이 있기 때문에 . 실제로 경고 -Wall하고 심지어 -Wextra경고 하는 모든 것은 매우 실제적인 문제이거나 쉽게 고칠 수있는 조잡한 코딩입니다. 여기서 메시지는 컴파일러 경고를 귀찮은 대신 코드를 개선 할 수있는 유용한 포인터로 간주하는 습관을들이는 것입니다. 있습니다 수백 영업 이익을 사용했다면 처음부터 필요하지 않았을 것이다 여기에 SO에 대한 질문은 -Wall -Wextra. -Werror단순히 그것을 강화하고 있습니다.
DevSolar

42

예, g++명령을 사용 하면 나를 위해 일했습니다.

g++ my_source_code.cpp

1
다음으로 실행./a.out
kaleidawave

2

메이크 파일

makefile로 작업하고 있고 나처럼 여기에 있다면, 이것은 아마도 당신이 찾고있는 것입니다.

메이크 파일을 사용하는 경우 cc아래와 같이 변경해야 합니다.

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

CC = g++

my_executable : main.o
    $(CC) -o my_executable main.o
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.