g ++와 gcc의 차이점은 무엇입니까?


875

g ++와 gcc의 차이점은 무엇입니까? 일반적인 c ++ 개발에 사용해야하는 것은 무엇입니까?


g ++ => c ++ 컴파일러 gcc => c 컴파일러
Nagappa

답변:


727

gcc그리고 g++는 GNU 컴파일러의 컴파일러 드라이버입니다 컬렉션 (한 번에 단지 GNU에 한때 C 컴파일러 ).

cc1 cc1plus파일 형식에 따라 호출 할 백엔드 ( ...)를 자동으로 결정하지만로 재정의하지 않는 한 -x language약간의 차이가 있습니다.

기본값에서 가장 중요한 차이점은 자동으로 링크되는 라이브러리입니다.

GCC의 온라인 설명서에 따르면 링크 옵션방법 g ++ IS 호출 , g++에 해당합니다 gcc -xc++ -lstdc++ -shared-libgcc(1은 컴파일러 옵션, 2 두 링커 옵션입니다입니다). 이 -v옵션 은 옵션 과 함께 실행하여 확인할 수 있습니다 (백엔드 툴체인 명령이 표시됨).


13
이 대답에서, 효과적으로 g ++ 명령은 플래그가 많은 gcc 일 뿐이라는 결론을 내립니다. 왜 리눅스에서 gcc와 g ++에 대해 두 개의 다른 바이너리 (대략 같은 크기)가 있습니까? 바이너리와 심볼릭 링크 하나만 있으면 안됩니까?
UchihaItachi

9
@Uchihaltachi이 파일은 하드 링크이며 부팅 할 때 argv[0]어떤 호출을 사용해야하는지 확인 합니다. 이것은 핵심 UNIX 유틸리티에서 일반적입니다.
Relish

438

GCC : GNU 컴파일러 모음

  • GNU 컴파일러가 지원하는 다른 모든 언어를 참조합니다.

gcc: GNU C 컴파일러
g++: GNU C ++ 컴파일러

주요 차이점 :

  1. gcc*.c\*.cpp파일을 C 및 C ++로 컴파일 합니다.
  2. g++컴파일 : *.c\*.cpp파일이지만 모두 C ++ 파일로 취급됩니다.
  3. 또한 g++객체 파일을 연결하는 데 사용 하는 경우 std C ++ 라이브러리에서 자동으로 연결됩니다 ( gcc이 작업을 수행하지 않음).
  4. gcc C 파일을 컴파일하면 미리 정의 된 매크로 수가 적습니다.
  5. gcc파일 컴파일 *.cppg++컴파일 *.c\*.cpp에는 몇 가지 추가 매크로가 있습니다.

*.cpp파일을 컴파일 할 때 추가 매크로 :

#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern

37
매개 변수 gcc를 전달 하여 std C ++ 라이브러리를 링크 할 수 있습니다 -lstdc++.
Denilson Sá Maia

16
'gcc'와 'g ++'사이에는 표준 라이브러리보다 더 많은 차이점이 있으므로 gcc -lstdc++여전히 같은 동작을 얻지 못합니다 g++. 우리는 이유에 따라 모든 언어 별 동작을 자체 드라이버에 넣습니다. 그것이 바로 그 이유입니다. :-)
Ti Strga 2016 년

8
내 의견은 단지 링크에 대해서만 말하는 것이 아닙니다. 그것이 요점입니다. 토론을 링크 (응답이 아닌)로 제한하더라도 사용자는 여전히 지정하여 만 전체 C ++ 표준 라이브러리를 사용할 수 없습니다-lstdc++ 수학, RTTI 및 예외 정보 누락 종속성이있을 것 같은. 주어진 테스트 케이스 링크 또는 실패 여부는 운영 체제 및 테스트 케이스에서 사용하는 C ++ 기능에 따라 달라 지므로, 모든 지식이 사용자에게 맡겨지지 않고 g ++ 드라이버에 내장되어 있습니다. .
Ti Strga

10
날 믿어, 우리는 일반적으로 리눅스 사용자가 불완전한 Makefile을 다른 플랫폼으로 옮기려고 할 때이 토론을 많이한다. :-) g ++ 링크 단계는 gcc -lstdc++특히 대상이 임베디드 플랫폼 인 경우 다른 OS 보다 많은 작업을 수행 합니다. 다행스럽게도, 우리가 g ++을 처음에 제공하는 이유입니다.
Ti Strga

10
스펙 문자열은 컴파일러에 맞게 구성되며 운영 체제 및 대상에 따라 다릅니다. -dumpspec예를 들어 임베디드 시스템을 대상으로하는 크로스 컴파일러에서 실행 하면 차이점이 나타납니다. 링커의 차이점 이상의 것이 있습니다 ... 다시 말하지만, 당신의 대답은 (전 처리기 매크로, 경로 포함, 여러 런타임 라이브러리)입니다. 우리는 서로 과거를 이야기하고있는 것처럼 보이지만 전 GCC 관리자로서 프론트 엔드가 무엇인지에 대해 잘 알고 있습니다.
Ti Strga

82

C ++의 경우 g ++를 사용해야합니다.

동일한 컴파일러입니다 (예 : GNU 컴파일러 컬렉션). GCC 또는 G ++는 기본 옵션이 다른 다른 프런트 엔드를 선택합니다.

간단히 말하면 : g ++을 사용하면 프론트 엔드는 링커에게 C ++ 표준 라이브러리와 링크 할 수 있다고 알려줍니다. gcc 프론트 엔드는 그렇게하지 않습니다 (올바른 명령 행 옵션을 전달하면 링크 할 수도 있습니다).


3
+1 또한 GNU / Linux gcc 매뉴얼 페이지에 "C ++ 프로그램을 컴파일 할 때 GCC를 g ++로 호출해야합니다."
타원형보기

35

차이점은 무엇이며 g++그리고 gcc?

gcc단일 언어 "GNU C Compiler"에서 다국어 "GNU Compiler Collection"으로 발전했습니다. "GNU C Compiler"라는 용어는 여전히 C 프로그래밍의 맥락에서 사용됩니다.

g++ 이다 는 GNU 컴파일러 컬렉션에 대한 C ++ 컴파일러. 등 gnat의 에이다 컴파일러입니다 gcc. GCC (GNU Compiler Collection) 사용을 참조하십시오.

예를 들어, Ubuntu 16.04 및 18.04 man g++명령은 GCC(1)매뉴얼 페이지를 반환합니다 .

우분투 16.04 및 18.04 man gcc는 ...

g++ 대부분 같은 옵션을 받아들입니다 gcc

그리고 그 기본값은 ...

...의 사용은 gccC ++ 라이브러리를 추가하지 않습니다. g++GCC를 호출하고 C ++ 라이브러리에 대한 링크를 자동으로 지정하는 프로그램입니다. -x를 사용하지 않으면 .c, .h 및 .i 파일을 C 소스 파일 대신 C ++ 소스 파일로 처리합니다. 이 프로그램은 C ++ 컴파일에 사용하기 위해 확장자가 .h 인 C 헤더 파일을 사전 컴파일 할 때도 유용합니다.

gcc사이의 옵션 차이에 대한 자세한 내용 은 매뉴얼 페이지를 검색하십시오 . gccg++

일반적인 C ++ 개발에 어느 것을 사용해야합니까?

기술적으로 gcc또는 g++적용 가능한 옵션 설정을 사용하여 일반 C ++ 개발에 사용할 수 있습니다. 그러나 g++기본 동작은 자연스럽게 C ++ 개발에 맞춰져 있습니다.

우분투 18.04 매뉴얼 페이지 다음 단락을 추가 :

GCC를 실행하는 일반적인 방법은이라는 실행 파일을 실행 gcc하거나 machine-gcc크로스 컴파일 할 때 또는 machine-gcc-version특정 버전의 GCC를 실행하는 것입니다. C ++ 프로그램을 컴파일 할 때 g++대신 GCC를 호출해야 합니다.


21

주목할만한 차이점 중 하나는 .c파일을 gcc에 전달하면 C로 컴파일된다는 것입니다.

g ++의 기본 동작은 .c파일을 C ++ 로 처리하는 것 -x c입니다 (지정 하지 않은 경우).


19
다른 답변에서 지적했듯이 독자가 주목할만한 정의를 왜곡하지 않는 한 이것은 "유일한 주목할만한 차이"가 아닙니다.
underscore_d

16

gcc 및 g ++ 명령은 매우 유사한 기능을 수행하지만 g ++는 C ++ 프로그램을 컴파일하기 위해 호출하는 명령으로 설계되었습니다. 자동으로 옳은 일을하기위한 것입니다.

무대 뒤에서 그들은 실제로 같은 프로그램입니다. 알다시피, 둘 다 파일 이름 확장자를 기준으로 프로그램을 C 또는 C ++로 컴파일할지 여부를 결정합니다. 둘 다 C ++ 표준 라이브러리와 링크 할 수 있지만 기본적으로 g ++만이이를 수행합니다. 따라서 표준 라이브러리에 링크 할 필요가없는 C ++로 작성된 프로그램이 있다면 gcc는 올바른 일을 수행 할 것입니다. 그러나 g ++도 마찬가지입니다. 따라서 일반적인 C ++ 개발에 g ++를 사용하지 않는 이유는 없습니다.


12

이 문제에 관심을 갖고 실험을 수행했습니다.

  1. 나는 그 설명을 찾을 여기 , 그러나 그것은 매우 짧습니다.

  2. 그런 다음 Windows 컴퓨터에서 gcc.exe 및 g ++. exe를 실험하려고했습니다.

    $ g++ --version | head -n1 
    g++.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3
    
    $ gcc --version | head -n1
    gcc.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3
  3. c89, c99 및 c ++ 1998 간단한 테스트 파일을 컴파일하려고 시도했으며 언어와 일치하는 올바른 확장명으로 잘 작동합니다.

    gcc -std=c99 test_c99.c
    gcc -std=c89 test_c89.c 
    g++ -std=c++98 test_cpp.cpp
    gcc -std=c++98 test_cpp.cpp
  4. 그러나 그런 식으로 "gnu compiler collection"도구를 실행하려고 할 때 :

    $ gcc -std=c++98 test_cpp.c
    cc1.exe: warning: command line option '-std=c++98' is valid for C++/ObjC++ but not for C [enabled by default]
  5. 그러나 이것은 여전히 ​​오류없이 작동합니다.

    $ gcc -x c++ -std=c++98 test_cpp.c
  6. 그리고 이것도

    $ g++ -std=c++0x test_cpp_11.cpp 

PS 테스트 파일

$ cat test_c89.c test_c99.c test_cpp.cpp

// C89 compatible file
int main()
{
    int x[] = {0, 2};
    return sizeof(x);
}

// C99 compatible file
int main()
{
    int x[] = {[1]=2};
    return sizeof(x);
}

// C++1998,2003 compatible file
class X{};
int main()
{
    X x;
    return sizeof(x);
}

// C++11
#include <vector>
enum class Color : int{red,green,blue}; // scoped enum
int main()
{
    std::vector<int> a {1,2,3}; // bracket initialization
    return 0;
}

결과:

  1. 프로세스 트리를 보면 gcc 및 g ++가 내 환경에서 cc1plus.exe, cc1.exe, collect2.exe, as.exe, ld.exe 와 같은 다른 도구로 백엔드 인 것처럼 보입니다.

  2. gcc는 올바른 확장자가 있거나 올바른 -std -x 플래그를 설정 한 경우 metatool로 잘 작동합니다. 참조


9

“GCC”는 GNU 컴파일러 컬렉션의 일반적인 약칭입니다. 이것은 컴파일러의 가장 일반적인 이름이며 C 프로그램을 컴파일 할 때 강조되는 이름입니다.

C ++ 컴파일을 언급 할 때는 일반적으로 컴파일러를 "G ++"이라고합니다. 컴파일러는 하나뿐이므로 언어 ​​컨텍스트에 관계없이 "GCC"라고 부르는 것이 정확합니다. 그러나 "G ++"라는 용어는 C ++ 프로그램 컴파일에 중점을 둘 때 더 유용합니다.

자세한 내용은 여기를 참조 하십시오 .


0

나는 리눅스 시스템에서 gcc와 g ++를 테스트하고 있었다. MAKEFILE을 사용하여 "GNU make"에 사용되는 컴파일러를 정의 할 수 있습니다. "C plus plus"의 소위 "동적 메모리"위치 지정 기능으로 다음을 테스트했습니다.

int main(){

int * myptr = new int;
* myptr = 1;
printf("myptr[0] is %i\n",*myptr);
return 0;
}

gcc 만 오류를보고하는 동안 g ++ 만 내 컴퓨터에서 성공적으로 컴파일 할 수 있습니다.

undefined reference to `operator new(unsigned long)'

그래서 내 자신의 결론은 gcc가 "C plus plus"를 완전히 지원하지 않는다는 것입니다. C ++ 소스 파일에 g ++를 선택하는 것이 더 나은 옵션 인 것 같습니다.


당신은 두 가지 일을해야합니다 : 1. 언어를 선택하십시오 2. libstdc ++로 라이브러리를 선택하십시오
PersianGulf

-1

gcc와 g ++는 모두 GNU 컴파일러입니다. 그들은 c와 c ++를 컴파일합니다. 차이점은 * .c 파일의 경우 gcc는이를 ac 프로그램으로 취급하고 g ++는이를 ac ++ 프로그램으로 간주합니다. * .cpp 파일은 c ++ 프로그램으로 간주됩니다. c ++는 c의 상위 집합이며 구문이 더 엄격하므로 접미사에주의하십시오.


1
C ++는 C의 엄격한 수퍼 셋이 아닌 다른 언어이므로 잘못된 대상 언어로 컴파일하면 예기치 않은 결과가 발생할 수 있습니다. 또한 C ++ 전용 파일 이름 확장자로 g++해석 .cc됩니다.
underscore_d
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.