Разница между CC, gcc и g ++?

107

В чем разница между 3 компиляторами CC, gcc, g ++ при компиляции кода C и C ++ с точки зрения генерации кода сборки, доступных библиотек, языковых функций и т. Д.?

Vehomzzz
источник
1
Как указано в моем ответе - ответ на ваш вопрос зависит от платформы, но платформа не указана.
Джонатан Леффлер,
3
Связанный вопрос: stackoverflow.com/questions/172587/…
Мартин Йорк

Ответы:

126

Ответ на этот вопрос зависит от платформы; то, что происходит в Linux, отличается, например, от того, что происходит в Solaris.

Самая простая часть (поскольку она не зависит от платформы) - это разделение на «gcc» и «g ++»:

  • gcc - это компилятор GNU C из GCC (Коллекция компиляторов GNU).
  • g ++ - компилятор GNU C ++ из GCC.

Сложная часть, поскольку она зависит от платформы, - это значение «CC» (и «cc»).

  • В Solaris CC обычно является именем компилятора Sun C ++.
  • В Solaris cc обычно является именем компилятора Sun C.
  • В Linux, если он существует, CC, вероятно, является ссылкой на g ++.
  • В Linux cc - это ссылка на gcc.

Однако даже в Solaris может оказаться, что cc - это старый компилятор C на основе BSD из /usr/ucb. На практике это обычно не устанавливается, и есть просто заглушка, которая выходит из строя, нанося ущерб тем, кто пытается скомпилировать и установить самонастраивающееся программное обеспечение.

В HP-UX по умолчанию cc по-прежнему установлен компилятор C только для K & R, чтобы разрешить повторное связывание ядра при необходимости, и непригоден для работы с современным программным обеспечением, поскольку он не поддерживает стандарт C. Вы должны использовать альтернативные имена компиляторов. ('согласно' IIRC). Точно так же в AIX системный компилятор C имеет такие имена, как «xlc» или «xlc32».

Традиционно системный компилятор по умолчанию назывался cc, и самоконфигурируемое программное обеспечение прибегает к этому имени, когда не знает, что еще использовать.

POSIX попытался законодательно обойти это, потребовав наличия программ c89 (изначально) и более поздних c99; это компиляторы, совместимые со стандартами C. ISO / IEC 9899: 1989 и 9899: 1999. Сомнительно, что 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) делает очень хорошую работу. Но иногда нативные компиляторы работают немного лучше. Я считаю, что компиляторы Intel имеют более обширные оптимизации, которые еще не были воспроизведены в GCC. Но любые подобные рассуждения опасны, пока мы не знаем, какая платформа вас интересует.

Что касается языковых функций, все компиляторы обычно довольно близки к текущим стандартам (C ++ 98, C ++ 2003, C99), но обычно есть небольшие различия между стандартным языком и языком, поддерживаемым компилятором. Поддержка более старого стандарта C89 практически одинакова (и полностью) для всех компиляторов C. Есть различия в темных углах языка. Вам необходимо понимать «неопределенное поведение», «поведение, определяемое системой» и «неопределенное поведение»; если вы вызовете неопределенное поведение, вы получите разные результаты в разное время. Есть также много опций (особенно с GCC) для настройки поведения компилятора. GCC имеет множество расширений, которые упрощают жизнь, если вы знаете, что ориентируетесь только на это семейство компиляторов.

Джонатан Леффлер
источник
1
А в OSX (по крайней мере, Sierra 10.2) это символическая ссылка на clang.
Джош Кодрофф
27

CC- переменная среды, относящаяся к системному компилятору C. На что он указывает (доступные библиотеки и т. Д.), Зависит от платформы. Часто он будет указывать /usr/bin/ccна настоящего c-компилятора (драйвера). На платформах Linux CCпочти всегда указывает на /usr/bin/gcc.

gccбинарный драйвер для коллекции компилятора GNU. Он может компилировать C, C ++ и, возможно, другие языки; он определяет язык по расширению файла.

g++представляет собой двоичный файл драйвера gcc, но с несколькими специальными параметрами, установленными для компиляции C ++. Примечательно (по моему опыту), g++по умолчанию будет связывать libstdc ++, а gccне нет.

Манагу
источник
1
Не могли бы вы объяснить, что вы имеете в виду под "двоичным драйвером"?
Эдан Маор
5
Большинство компиляторов C, но особенно GCC, имеют ряд программ, выполняющих компиляцию. Существует программа верхнего уровня, называемая «gcc», которая является драйвером компилятора; он анализирует множество параметров командной строки и координирует другие этапы компилятора - обычно синтаксический анализатор / анализатор, оптимизатор, ассемблер и компоновщик (препроцессор обычно не является отдельной фазой в наши дни, если вы не запрашиваете только предварительную обработку). Это (драйвер компилятора) довольно сложная программа, хотя она никогда не касается самого исходного файла C.
Джонатан Леффлер,
3
CC также является компилятором Sun C ++, а не переменной среды.
Джонатан Леффлер,
1
Компилятор SGI C ++ также является CC.
Алекс Тингл
Что ж, я полагаю, Манагу думает, что ./configure+ makeможет принимать переменную среды с именем, CCчтобы влиять на используемый компилятор C, но в остальном обычно нет переменной среды с таким именем.
эфемент
6

Я хочу добавить только одну информацию, что такое cc в Linux. Он связан с 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++
Уддхав Гаутам
источник