gcc로 C ++ 프로그램 컴파일


84

질문 : gcc 컴파일러로 C ++ 프로그램을 컴파일하는 방법은 무엇입니까?

info.c :

#include<iostream>
using std::cout;
using std::endl;
int main()
{
   #ifdef __cplusplus
   cout << "C++ compiler in use and version is " << __cplusplus << endl;
   #endif
   cout <<"Version is " << __STDC_VERSION__ << endl;
   cout << "Hi" << __FILE__ << __LINE__ << endl;
}

그리고 내가 컴파일하려고 할 때 info.c

$ gcc info.C

Undefined                       first referenced
 symbol                             in file
cout                                /var/tmp/ccPxLN2a.o
endl(ostream &)                     /var/tmp/ccPxLN2a.o
ostream::operator<<(ostream &(*)(ostream &))/var/tmp/ccPxLN2a.o
ostream::operator<<(int)            /var/tmp/ccPxLN2a.o
ostream::operator<<(long)           /var/tmp/ccPxLN2a.o
ostream::operator<<(char const *)   /var/tmp/ccPxLN2a.o
ld: fatal: Symbol referencing errors. No output written to a.out
collect2: ld returned 1 exit status

gcc 컴파일러는 C ++ 프로그램을 컴파일 할 수 없습니까? 관련 메모에서 gcc와 g ++의 차이점은 무엇입니까? 감사,


답변:


136

gcc는 실제로 C ++ 코드를 잘 컴파일 할 수 있습니다. 받은 오류는 컴파일러 오류가 아니라 링커 오류입니다.

컴파일 라인을 다음과 같이 변경하면 확률이 높습니다.

gcc info.C -lstdc++

표준 C ++ 라이브러리에 연결하면 잘 작동합니다.

그러나 당신은 당신의 삶을 더 쉽게 만들고 g ++를 사용해야합니다.


편집하다:

Rup 은 다른 답변에 대한 그의 의견 에서 가장 잘 말합니다 .

[...] gcc는 파일 확장자에 따라 올바른 백엔드 컴파일러를 선택하고 (즉, .c를 C로, .cc를 C ++로 컴파일 함) 기본적으로 표준 C 및 GCC 도우미 라이브러리에 대해 바이너리를 연결합니다. 입력 언어; g ++는 또한 모든 C 소스를 C ++로 컴파일하고 (즉, .c와 .cc를 C ++로 컴파일 함), 입력 언어에 관계없이 링크 단계에 libstdc ++를 포함한다는 점을 제외하고는 확장을 기반으로 올바른 백엔드를 선택합니다.


41

코드에 .c 확장자를 지정하면 컴파일러는 C ++가 아닌 C 코드라고 생각합니다. C ++ 컴파일러 드라이버는 g ++라고합니다. gcc 드라이버를 사용하면 표준 C ++ 라이브러리가 기본적으로 링크되지 않으므로 링커 문제가 발생합니다. 따라서 원하는 :

g++ myprog.cpp

코드를 이식하고 싶지 않고 함께 일하는 사람들에게 미움을받을 준비가되어 있지 않다면 대문자 .C 확장자를 사용하는 것도 고려하지 마십시오.


@Neil : 내가 알 수 있듯이 gcc는 .C(자본) 확장을 C ++ 확장으로 간주합니다 . 다음은 잘 작동합니다. gcc test.C -lstdc++ -o test또는 g++ test.C -o test.
Evan Teran

3
@Evan 예, 물론 그렇습니다. 그렇다고해서 대소 문자를 구분하는 모든 파일 이름처럼 끔찍한 이식성 문제를 일으킬 수 있으므로 반드시 사용해야한다는 의미는 아닙니다. C ++ 파일의 확장자는 항상 .cpp 여야합니다. 이것은 문제를 일으키지 않으며 모든 일반적인 운영 체제에서 작동하도록 보장됩니다.


12

기본적으로 gcc는 파일 확장자에 따라 언어를 선택하지만 gcc가 -x 옵션을 사용하여 다른 언어 백엔드를 선택하도록 강제 할 수 있습니다.

gcc -x c++

더 많은 옵션은 "출력 종류를 제어하는 ​​옵션"의 gcc 맨 페이지에 자세히 설명되어 있습니다. 예를 들어 http://linux.die.net/man/1/gcc (페이지에서 텍스트 검색)를 참조하십시오 -x language.

이 기능은 gcc가 파일 확장자를 사용하여 언어를 추측 할 수없는 경우에 매우 유용합니다. 예를 들어 코드를 생성하고 stdin을 통해 gcc에 공급하는 경우입니다.


11

gcc와 g ++의 차이점은 다음과 같습니다.

     gcc            |        g++
compiles c source   |   compiles c++ source

gcc 대신 g ++를 사용하여 C ++ 소스를 컴파일하십시오.


16
여기의 다른 답변에서와 같이 그것보다 조금 더 복잡합니다. gcc는 파일 확장자에 따라 올바른 백엔드 컴파일러를 선택하고 (즉, .c를 C로, .cc를 C ++로 컴파일) 기본적으로 입력 언어에 관계없이 표준 C 및 GCC 도우미 라이브러리에 대한 바이너리를 연결합니다. g ++는 또한 모든 C 소스를 C ++로 컴파일하고 (즉, .c와 .cc를 C ++로 컴파일 함), 입력 언어에 관계없이 링크 단계에 libstdc ++를 포함한다는 점을 제외하고는 확장을 기반으로 올바른 백엔드를 선택합니다.
Rup

1
@Rup : 맞습니다, 이것은 기본적으로 내 대답에서 말한 것입니다.
Evan Teran

1

내가 올바르게 기억하면 gcc는 접미사에서 파일 유형을 결정합니다. 따라서 foo.cc로 만들면 작동합니다.

그리고, 다른 질문에 대답, 즉, "GCC"와 "g ++"의 차이입니다. gcc는 올바른 컴파일러를 선택하는 프런트 엔드입니다.


1

그것은 나를 위해 잘 작동했습니다. cmd의 한 줄 코드입니다.

먼저 gcc (c 용) 또는 g ++ (c ++ 용) 컴파일러를 설치했는지 확인합니다 .

gcc 유형의 cmd에서 :

gcc-버전

g ++ 유형의 경우 cmd에서 :

g ++-버전

설치되어 있으면 계속 진행하십시오.

이제 cmd를 사용하여 .c 또는 .cpp를 컴파일하십시오.

대한 이 .c 구문 :

gcc -o exe_filename yourfilename.c

예:

gcc -o myfile myfile.c

여기서 exe_filename (예 : myfile) 은 컴파일 후 생성하려는 .exe 파일 의 이름입니다 (참고 : 여기에 확장자를 입력하지 않았습니다). 그리고 yourfilename.c (예 : myfile.c) 는 확장자가 .c 인 소스 파일 입니다.

이제 .c 파일이 포함 된 폴더로 이동하면 확장명이 .exe 인 파일을 찾을 수 있습니다. 그냥 열어. 만세..

대한 의 .cpp 구문 :

g ++ -o exe_filename yourfilename.cpp

그 후 프로세스는 .c와 동일합니다.


2
질문은 "gcc 컴파일러로 C ++ 프로그램을 컴파일하는 방법"이었습니다. "gcc 컴파일러로 C 프로그램을 컴파일하는 방법 또는 g ++ 컴파일러로 C ++ 프로그램을 컴파일하는 방법"이 아닙니다.
DevX

좋은 캐치! @DevX
라지 쿠마르 반살
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.