답변:
gcc
그리고 g++
는 GNU 컴파일러의 컴파일러 드라이버입니다 컬렉션 (한 번에 단지 GNU에 한때 C 컴파일러 ).
cc1
cc1plus
파일 형식에 따라 호출 할 백엔드 ( ...)를 자동으로 결정하지만로 재정의하지 않는 한 -x language
약간의 차이가 있습니다.
기본값에서 가장 중요한 차이점은 자동으로 링크되는 라이브러리입니다.
GCC의 온라인 설명서에 따르면 링크 옵션 과 방법 g ++ IS 호출 , g++
에 해당합니다 gcc -xc++ -lstdc++ -shared-libgcc
(1은 컴파일러 옵션, 2 두 링커 옵션입니다입니다). 이 -v
옵션 은 옵션 과 함께 실행하여 확인할 수 있습니다 (백엔드 툴체인 명령이 표시됨).
argv[0]
어떤 호출을 사용해야하는지 확인 합니다. 이것은 핵심 UNIX 유틸리티에서 일반적입니다.
GCC : GNU 컴파일러 모음
gcc
: GNU C 컴파일러
g++
: GNU C ++ 컴파일러
주요 차이점 :
gcc
*.c\*.cpp
파일을 C 및 C ++로 컴파일 합니다.g++
컴파일 : *.c\*.cpp
파일이지만 모두 C ++ 파일로 취급됩니다.g++
객체 파일을 연결하는 데 사용 하는 경우 std C ++ 라이브러리에서 자동으로 연결됩니다 ( gcc
이 작업을 수행하지 않음).gcc
C 파일을 컴파일하면 미리 정의 된 매크로 수가 적습니다.gcc
파일 컴파일 *.cpp
및 g++
컴파일 *.c\*.cpp
에는 몇 가지 추가 매크로가 있습니다.*.cpp
파일을 컴파일 할 때 추가 매크로 :
#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
gcc
를 전달 하여 std C ++ 라이브러리를 링크 할 수 있습니다 -lstdc++
.
gcc -lstdc++
여전히 같은 동작을 얻지 못합니다 g++
. 우리는 이유에 따라 모든 언어 별 동작을 자체 드라이버에 넣습니다. 그것이 바로 그 이유입니다. :-)
-lstdc++
수학, RTTI 및 예외 정보 누락 종속성이있을 것 같은. 주어진 테스트 케이스 링크 또는 실패 여부는 운영 체제 및 테스트 케이스에서 사용하는 C ++ 기능에 따라 달라 지므로, 모든 지식이 사용자에게 맡겨지지 않고 g ++ 드라이버에 내장되어 있습니다. .
gcc -lstdc++
특히 대상이 임베디드 플랫폼 인 경우 다른 OS 보다 많은 작업을 수행 합니다. 다행스럽게도, 우리가 g ++을 처음에 제공하는 이유입니다.
-dumpspec
예를 들어 임베디드 시스템을 대상으로하는 크로스 컴파일러에서 실행 하면 차이점이 나타납니다. 링커의 차이점 이상의 것이 있습니다 ... 다시 말하지만, 당신의 대답은 (전 처리기 매크로, 경로 포함, 여러 런타임 라이브러리)입니다. 우리는 서로 과거를 이야기하고있는 것처럼 보이지만 전 GCC 관리자로서 프론트 엔드가 무엇인지에 대해 잘 알고 있습니다.
C ++의 경우 g ++를 사용해야합니다.
동일한 컴파일러입니다 (예 : GNU 컴파일러 컬렉션). GCC 또는 G ++는 기본 옵션이 다른 다른 프런트 엔드를 선택합니다.
간단히 말하면 : g ++을 사용하면 프론트 엔드는 링커에게 C ++ 표준 라이브러리와 링크 할 수 있다고 알려줍니다. gcc 프론트 엔드는 그렇게하지 않습니다 (올바른 명령 행 옵션을 전달하면 링크 할 수도 있습니다).
차이점은 무엇이며 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
그리고 그 기본값은 ...
...의 사용은
gcc
C ++ 라이브러리를 추가하지 않습니다.g++
GCC를 호출하고 C ++ 라이브러리에 대한 링크를 자동으로 지정하는 프로그램입니다. -x를 사용하지 않으면 .c, .h 및 .i 파일을 C 소스 파일 대신 C ++ 소스 파일로 처리합니다. 이 프로그램은 C ++ 컴파일에 사용하기 위해 확장자가 .h 인 C 헤더 파일을 사전 컴파일 할 때도 유용합니다.
및 gcc
사이의 옵션 차이에 대한 자세한 내용 은 매뉴얼 페이지를 검색하십시오 . gcc
g++
일반적인 C ++ 개발에 어느 것을 사용해야합니까?
기술적으로 gcc
또는 g++
적용 가능한 옵션 설정을 사용하여 일반 C ++ 개발에 사용할 수 있습니다. 그러나 g++
기본 동작은 자연스럽게 C ++ 개발에 맞춰져 있습니다.
우분투 18.04 매뉴얼 페이지 다음 단락을 추가 :
GCC를 실행하는 일반적인 방법은이라는 실행 파일을 실행
gcc
하거나machine-gcc
크로스 컴파일 할 때 또는machine-gcc-version
특정 버전의 GCC를 실행하는 것입니다. C ++ 프로그램을 컴파일 할 때g++
대신 GCC를 호출해야 합니다.
주목할만한 차이점 중 하나는 .c
파일을 gcc에 전달하면 C로 컴파일된다는 것입니다.
g ++의 기본 동작은 .c
파일을 C ++ 로 처리하는 것 -x c
입니다 (지정 하지 않은 경우).
gcc 및 g ++ 명령은 매우 유사한 기능을 수행하지만 g ++는 C ++ 프로그램을 컴파일하기 위해 호출하는 명령으로 설계되었습니다. 자동으로 옳은 일을하기위한 것입니다.
무대 뒤에서 그들은 실제로 같은 프로그램입니다. 알다시피, 둘 다 파일 이름 확장자를 기준으로 프로그램을 C 또는 C ++로 컴파일할지 여부를 결정합니다. 둘 다 C ++ 표준 라이브러리와 링크 할 수 있지만 기본적으로 g ++만이이를 수행합니다. 따라서 표준 라이브러리에 링크 할 필요가없는 C ++로 작성된 프로그램이 있다면 gcc는 올바른 일을 수행 할 것입니다. 그러나 g ++도 마찬가지입니다. 따라서 일반적인 C ++ 개발에 g ++를 사용하지 않는 이유는 없습니다.
이 문제에 관심을 갖고 실험을 수행했습니다.
나는 그 설명을 찾을 여기 , 그러나 그것은 매우 짧습니다.
그런 다음 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
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
그러나 그런 식으로 "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]
그러나 이것은 여전히 오류없이 작동합니다.
$ gcc -x c++ -std=c++98 test_cpp.c
그리고 이것도
$ 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;
}
결과:
프로세스 트리를 보면 gcc 및 g ++가 내 환경에서 cc1plus.exe, cc1.exe, collect2.exe, as.exe, ld.exe 와 같은 다른 도구로 백엔드 인 것처럼 보입니다.
gcc는 올바른 확장자가 있거나 올바른 -std -x 플래그를 설정 한 경우 metatool로 잘 작동합니다. 참조 이
“GCC”는 GNU 컴파일러 컬렉션의 일반적인 약칭입니다. 이것은 컴파일러의 가장 일반적인 이름이며 C 프로그램을 컴파일 할 때 강조되는 이름입니다.
C ++ 컴파일을 언급 할 때는 일반적으로 컴파일러를 "G ++"이라고합니다. 컴파일러는 하나뿐이므로 언어 컨텍스트에 관계없이 "GCC"라고 부르는 것이 정확합니다. 그러나 "G ++"라는 용어는 C ++ 프로그램 컴파일에 중점을 둘 때 더 유용합니다.
나는 리눅스 시스템에서 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 ++를 선택하는 것이 더 나은 옵션 인 것 같습니다.
gcc와 g ++는 모두 GNU 컴파일러입니다. 그들은 c와 c ++를 컴파일합니다. 차이점은 * .c 파일의 경우 gcc는이를 ac 프로그램으로 취급하고 g ++는이를 ac ++ 프로그램으로 간주합니다. * .cpp 파일은 c ++ 프로그램으로 간주됩니다. c ++는 c의 상위 집합이며 구문이 더 엄격하므로 접미사에주의하십시오.
g++
해석 .cc
됩니다.