어셈블리 코드 생성, 사용 가능한 라이브러리, 언어 기능 등에서 C 및 C ++ 코드를 컴파일 할 때 3 개의 컴파일러 CC, gcc, g ++의 차이점은 무엇입니까?
어셈블리 코드 생성, 사용 가능한 라이브러리, 언어 기능 등에서 C 및 C ++ 코드를 컴파일 할 때 3 개의 컴파일러 CC, gcc, g ++의 차이점은 무엇입니까?
답변:
이에 대한 대답은 플랫폼별로 다릅니다. 예를 들어 Linux에서 발생하는 작업은 Solaris에서 발생하는 작업과 다릅니다.
쉬운 부분은 (플랫폼에 한정되지 않기 때문에) 'gcc'와 'g ++'를 분리하는 것입니다.
플랫폼에 따라 다르기 때문에 어려운 부분은 'CC'(및 'cc')의 의미입니다.
그러나 Solaris에서도 cc는 .NET의 이전 BSD 기반 C 컴파일러 일 수 있습니다 /usr/ucb
. 실제로는 일반적으로 설치되지 않으며 실패한 스텁 만있어 자체 구성 소프트웨어를 컴파일하고 설치하려는 사람들에게 혼란을줍니다.
HP-UX에서 기본 'cc'는 필요한 경우 커널 재 링크를 허용하기 위해 설치된 K & R 전용 C 컴파일러이며 표준 C를 지원하지 않기 때문에 최신 소프트웨어 작업에 사용할 수 없습니다. 대체 컴파일러 이름을 사용해야합니다. ( 'acc'IIRC). 마찬가지로 AIX에서 시스템 C 컴파일러는 'xlc'또는 'xlc32'와 같은 이름을 사용합니다.
고전적으로 기본 시스템 컴파일러는 'cc'라고 불렸고 자체 구성 소프트웨어는 무엇을 사용해야할지 모를 때 그 이름으로 돌아갑니다.
POSIX는 프로그램 c89 (원래)와 이후의 c99가 존재하도록 요구함으로써이 문제를 해결하려고 시도했습니다. 이들은 ISO / IEC 9899 : 1989 및 9899 : 1999 C 표준과 호환되는 컴파일러입니다. POSIX의 성공 여부는 의심 스럽다.
이 질문은 기능과 라이브러리의 차이점에 대해 묻습니다. 이전과 마찬가지로 대답은 부분적으로는 플랫폼에 따라 다르며 부분적으로는 일반적입니다.
큰 차이는 C 컴파일러와 C ++ 컴파일러 사이에 있습니다. C ++ 컴파일러는 C ++ 프로그램을 허용하며 임의의 C 프로그램을 컴파일하지 않습니다. (C ++에서도 이해할 수있는 부분 집합에 C를 작성할 수 있지만 많은 C 프로그램은 유효한 C ++ 프로그램이 아닙니다.) 마찬가지로 C 컴파일러는 C 프로그램을 허용하고 대부분의 C ++ 프로그램을 거부합니다 (대부분의 C ++ 프로그램은 C에서 사용할 수없는 구문을 사용하기 때문입니다).
사용 가능한 라이브러리 세트는 언어에 따라 다릅니다. C ++ 프로그램은 일반적으로 주어진 플랫폼에서 C 라이브러리를 사용할 수 있습니다. C 프로그램은 일반적으로 C ++ 라이브러리를 사용할 수 없습니다. 따라서 C ++에는 더 많은 라이브러리 세트가 있습니다.
Solaris를 사용하는 경우 CC에서 생성 된 개체 코드는 g ++에서 생성 된 개체 코드와 호환되지 않습니다. 예외 처리 및 이름 맹 글링과 같은 작업에 대해 별도의 규칙을 사용하는 두 개의 개별 컴파일러입니다 (이름 맹 글링은 의도적으로 호환되지 않는 개체 파일이 서로 연결되지 않도록하기 위해 다릅니다!). 즉, CC로 컴파일 된 라이브러리를 사용하려면 전체 프로그램을 CC로 컴파일해야합니다. 또한 CC로 컴파일 된 라이브러리와 g ++로 컴파일 된 라이브러리를 사용하려는 경우 운이 좋지 않습니다. 최소한 라이브러리 중 하나를 다시 컴파일해야합니다.
생성 된 어셈블러의 품질 측면에서 GCC (GNU Compiler Collection)는 매우 훌륭합니다. 그러나 때로는 네이티브 컴파일러가 조금 더 잘 작동합니다. 인텔 컴파일러는 아직 GCC에서 복제되지 않은보다 광범위한 최적화 기능을 가지고 있다고 생각합니다. 그러나 우리는 당신이 어떤 플랫폼에 관심을 가지고 있는지 알지 못합니다.
언어 기능 측면에서 컴파일러는 일반적으로 현재 표준 (C ++ 98, C ++ 2003, C99)에 상당히 근접하지만 일반적으로 표준 언어와 컴파일러에서 지원하는 언어 간에는 약간의 차이가 있습니다. 이전 C89 표준 지원은 기본적으로 모든 C 컴파일러에 대해 동일하며 완전합니다. 언어의 어두운 모서리에 차이가 있습니다. '정의되지 않은 동작', '시스템 정의 동작'및 '지정되지 않은 동작'을 이해해야합니다. 정의되지 않은 동작을 호출하면 다른 시간에 다른 결과를 얻을 수 있습니다. 컴파일러의 동작을 조정할 수있는 많은 옵션 (특히 GCC 사용)도 있습니다. GCC에는 해당 컴파일러 제품군 만 대상으로한다는 것을 알고있는 경우 생활을 단순화하는 다양한 확장 기능이 있습니다.
CC
시스템의 C 컴파일러를 참조하는 환경 변수입니다. 가리키는 내용 (액세스 가능한 라이브러리 등)은 플랫폼에 따라 다릅니다. 종종 /usr/bin/cc
실제 c 컴파일러 (드라이버) 를 가리 킵니다 . Linux 플랫폼에서는 CC
거의 항상 /usr/bin/gcc
.
gcc
GNU 컴파일러 컬렉션의 드라이버 바이너리입니다. C, C ++ 및 기타 언어를 컴파일 할 수 있습니다. 파일 확장자로 언어를 결정합니다.
g++
는와 같은 드라이버 바이너리 gcc
이지만 C ++ 컴파일을위한 몇 가지 특수 옵션이 설정되어 있습니다. 특히 (내 경험상) g++
libstdc ++는 기본적으로 링크되지만 gcc
그렇지 않습니다.
./configure
+ make
가 CC
사용 된 C 컴파일러에 영향을주기 위해 명명 된 환경 변수를 취할 수 있다고 생각한다고 생각 하지만, 그렇지 않으면 일반적으로 그 이름의 환경 변수가 없습니다.
Linux에서 cc에 대한 정보를 하나만 추가하고 싶습니다. gcc와 연결되어 있습니다. 그것을 확인하십시오.
마찬가지로 C ++에서도 마찬가지입니다.
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ whereis c++
c++: /usr/bin/c++ /usr/include/c++ /usr/share/man/man1/c++.1.gz
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ ls -l /usr/bin/c++
lrwxrwxrwx 1 root root 21 Jul 31 14:00 /usr/bin/c++ -> /etc/alternatives/c++
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ ls -l /etc/alternatives/c++
lrwxrwxrwx 1 root root 12 Jul 31 14:00 /etc/alternatives/c++ -> /usr/bin/g++