Разница между CC, GCC и G ++? - PullRequest
       23

Разница между CC, GCC и G ++?

77 голосов
/ 04 октября 2009

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

Ответы [ 3 ]

103 голосов
/ 04 октября 2009

Ответ на этот вопрос зависит от платформы; то, что происходит в 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. Вы должны использовать альтернативные имена компиляторов ('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 ++, - это два отдельных компилятора с отдельными соглашениями для таких вещей, как обработка исключений и искажение имен (и имени mangling сознательно отличается, чтобы несовместимые объектные файлы не были связаны друг с другом!). Это означает, что если вы хотите использовать библиотеку, скомпилированную с помощью CC, вы должны скомпилировать всю свою программу с помощью CC. Это также означает, что если вы хотите использовать одну библиотеку, скомпилированную с помощью CC, а другую - скомпилированную с помощью g ++, вам не повезло. Вы должны перекомпилировать хотя бы одну из библиотек.

С точки зрения качества создаваемого ассемблера, GCC (GNU Compiler Collection) делает очень хорошую работу. Но иногда нативные компиляторы работают немного лучше. Я полагаю, что компиляторы Intel имеют более обширную оптимизацию, которая еще не была воспроизведена в GCC. Но любые подобные понтификации опасны, пока мы не знаем, на какой платформе вы заинтересованы.

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

22 голосов
/ 04 октября 2009

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

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

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

3 голосов
/ 13 августа 2018

Я хочу добавить только одну информацию о том, что cc в Linux. Это связано с GCC. Чтобы проверить это. enter image description here

Аналогично, то же самое с 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++
...