Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Легкая часть (потому что она не относится к платформе) - это разделение "gcc" и "g++":

  • gcc - это компилятор GNU C из GCC (сборник компиляторов GNU).
  • g++ - это компилятор GNU С++ из GCC.

Жесткая часть, потому что она специфична для платформы, имеет значение "CC" (и "cc" ).

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

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

В HP-UX по умолчанию "cc" по-прежнему является компилятором K & R-only 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 обычно не могут использовать библиотеки С++. Таким образом, С++ имеет больший набор доступных библиотек.

Обратите внимание, что если вы находитесь в Solaris, объектный код, созданный CC, несовместим с кодом объекта, созданным g++, - это два отдельных компилятора с отдельными соглашениями для таких операций, как обработка исключений и манипуляция имени (и имя искажение намеренно отличается тем, что несовместимые объектные файлы не связаны друг с другом!). Это означает, что если вы хотите использовать библиотеку, скомпилированную с CC, вы должны скомпилировать всю вашу программу с помощью CC. Это также означает, что если вы хотите использовать одну библиотеку, скомпилированную с CC и другую, скомпилированную с g++, вам не повезло. Вы должны перекомпилировать одну из библиотек как минимум.

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

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

Ответ 2

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

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

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

Ответ 3

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

Точно так же с c++.

[email protected]:~/Desktop/c++$ whereis c++
c++: /usr/bin/c++ /usr/include/c++ /usr/share/man/man1/c++.1.gz  
[email protected]:~/Desktop/c++$ ls -l /usr/bin/c++
lrwxrwxrwx 1 root root 21 Jul 31 14:00 /usr/bin/c++ -> /etc/alternatives/c++
[email protected]:~/Desktop/c++$ ls -l /etc/alternatives/c++
lrwxrwxrwx 1 root root 12 Jul 31 14:00 /etc/alternatives/c++ -> /usr/bin/g++