gccи g++являются драйверами компилятора коллекции компиляторов GNU (которая когда-то была просто компилятором GNU C ).
Несмотря на то, что они автоматически определяют, какие бэкэнды ( cc1cc1plus...) вызывать в зависимости от типа файла, если -x languageони не переопределены , они имеют некоторые различия.
Вероятно, наиболее важным отличием в их настройках по умолчанию является то, с какими библиотеками они связываются автоматически.
В соответствии с настройками ссылок онлайн-документации GCC и тем, как вызывается g ++ , g++это эквивалентно gcc -xc++ -lstdc++ -shared-libgcc(1-й - это опция компилятора, 2-й - это опции компоновщика). Это можно проверить, запустив оба -vпараметра (он отображает команды запуска бэкэнда).
Из этого ответа я делаю вывод, что фактически команда g ++ - это просто gcc с кучей флагов. Почему тогда в linux есть два разных двоичных файла (примерно одинакового размера) для gcc и g ++? Разве мы не должны иметь только один двоичный файл и одну символическую ссылку (или что-то в этом роде)?
УчихаИтачи
9
@Uchihaltachi - это жесткие ссылки, и при загрузке они проверяют, argv[0]какой вызов следует использовать. Это довольно распространено среди основных утилит UNIX.
Смак
439
GCC: коллекция компиляторов GNU
Ссылки на все разные языки, которые поддерживаются компилятором GNU.
gcc: Компилятор g++GNU C: Компилятор GNU C ++
Основные отличия:
gccскомпилирует: *.c\*.cppфайлы как C и C ++ соответственно.
g++скомпилирует: *.c\*.cppфайлы, но все они будут обрабатываться как файлы C ++.
Также, если вы используете g++для связывания объектных файлов, он автоматически связывается в библиотеках std C ++ ( gccне делает этого).
gcc Компиляция файлов C имеет меньше предопределенных макросов.
gccКомпиляция *.cppи g++компиляция *.c\*.cppфайлов имеет несколько дополнительных макросов.
Дополнительные макросы при компиляции *.cppфайлов:
Вы можете связать стандартную библиотеку C ++ gcc, передав -lstdc++параметр.
Денилсон Са Майя
16
Существует больше различий между «gcc» и «g ++», чем только в стандартных библиотеках, поэтому gcc -lstdc++вы все равно не получите такого же поведения, как g++. Мы помещаем все это специфичное для языка поведение в его собственный драйвер по причине, для которой это существует. :-)
Ti Strga
8
Мой комментарий не говорит просто о ссылках ... в этом суть. Даже просто ограничив обсуждение связыванием (что не было вашим ответом), пользователь все равно не сможет использовать всю стандартную библиотеку C ++, только указав -lstdc++, поскольку будут отсутствовать зависимости от математики, RTTI и информации об исключениях. Будет ли данный тест ссылаться или не получится, будет зависеть от операционной системы и от того, какие функции C ++ используются в тестовом примере, и опять же, поэтому все эти знания встроены в драйвер g ++, а не оставлены на усмотрение пользователя, чтобы выяснить ,
Ti Strga
10
Поверьте мне, мы часто обсуждаем это, обычно когда пользователь Linux пытается переместить свой неполный Makefile на другую платформу. :-) Стадия g ++ link делает намного больше, чем gcc -lstdc++на других ОС, особенно когда целью является встроенная платформа. К счастью, именно поэтому мы поставляем g ++ в первую очередь.
Ti Strga
10
Строки спецификации создаются так, чтобы быть специфичными для компилятора, которые, в свою очередь, являются специфическими для операционной системы и цели. Поэтому, если вы запустите -dumpspec(например) кросс-компилятор, ориентированный на встроенную систему, вы увидите различия. Существуют не только различия в компоновщиках ... о чем и был ваш ответ (макросы препроцессора, пути, несколько библиотек времени выполнения). Похоже, мы говорим мимо друг друга, но, как бывший мейнтейнер GCC, уверяю вас, я знаком с тем, что такое интерфейсы, а какие нет.
Ti Strga
82
Для c ++ вы должны использовать g ++.
Это тот же компилятор (например, коллекция компиляторов GNU). GCC или G ++ просто выбирают другой интерфейс с другими параметрами по умолчанию.
В двух словах: если вы используете g ++, интерфейс скажет компоновщику, что вы можете захотеть связать его со стандартными библиотеками C ++. Интерфейс gcc этого не сделает (также он может связываться с ними, если вы укажете правильные параметры командной строки).
+1 Также моя man-страница GNU / Linux gcc говорит: «Когда вы компилируете программы на C ++, вы должны вместо этого вызывать GCC как g ++».
эллиптический вид
35
В чем разница между g++и gcc?
gccиз одного языка "GNU C Compiler" превратился в многоязычную "коллекцию компиляторов GNU". Термин «GNU C Compiler» до сих пор иногда используется в контексте программирования на Си.
Например, команда Ubuntu 16.04 и 18.04 man g++возвращает GCC(1)страницу руководства.
Ubuntu 16.04 и 18.04 man gccутверждает, что ...
g++ принимает в основном те же параметры, что и gcc
и это по умолчанию ...
... использование gccне добавляет библиотеку C ++. g++это программа, которая вызывает GCC и автоматически указывает связь с библиотекой C ++. Он рассматривает файлы .c, .h и .i как исходные файлы C ++ вместо исходных файлов C, если не используется -x. Эта программа также полезна при предварительной компиляции заголовочного файла C с расширением .h для использования в компиляциях C ++.
Ищите gccсправочные страницы для получения более подробной информации о вариантах отклонений между gccи g++.
Какой из них следует использовать для общей разработки C ++?
Технически, либо gccили g++могут быть использованы для разработки общего C ++ с действующими параметрами настройки. Однако g++поведение по умолчанию естественно выровнено с разработкой C ++.
Обычный способ запустить GCC - запустить исполняемый файл с именем gcc, или machine-gccпри кросс-компиляции, или machine-gcc-versionзапустить определенную версию GCC. Когда вы компилируете программы на C ++, вы должны g++вместо этого вызывать GCC .
(Поздно, но для потомков). Как указывали другие ответы, это ни в коем случае не «единственное заметное различие», если только у читателя нет искаженного определения знатности.
underscore_d
16
Хотя команды gcc и g ++ делают очень похожие вещи, g ++ разработана как команда, которую вы вызываете для компиляции программы на C ++; он предназначен для того, чтобы автоматически делать правильные вещи.
За кулисами они действительно одна и та же программа. Как я понимаю, оба решают, компилировать ли программу как C или как C ++ на основе расширения имени файла. Оба способны связываться со стандартной библиотекой C ++, но только g ++ делает это по умолчанию. Так что если у вас есть программа, написанная на C ++, которая не нуждается в связывании со стандартной библиотекой, gcc будет делать правильные вещи; но тогда g ++. Так что на самом деле нет причин не использовать g ++ для общей разработки на C ++.
Если посмотреть на дерево процессов, то кажется, что gcc и g ++ являются бэкендом для других инструментов, которые в моей среде: cc1plus.exe, cc1.exe, collect2.exe, as.exe, ld.exe
gcc отлично работает как metatool, если у вас правильное расширение или установлены правильные флаги -std -x. Смотрите это
«GCC» - это общий сокращенный термин для коллекции компиляторов GNU. Это и самое общее имя для компилятора, и имя, используемое, когда акцент делается на компиляции программ на C (поскольку ранее аббревиатура расшифровывалась как «GNU C Compiler»).
При ссылке на компиляцию C ++ обычно называют компилятор «G ++». Поскольку существует только один компилятор, его также можно назвать «GCC» независимо от языкового контекста; однако термин «G ++» более полезен, когда акцент делается на компиляции программ на C ++.
Я тестировал gcc и g ++ в системе linux. Используя MAKEFILE, я могу определить компилятор, используемый "GNU make". Я проверил с помощью так называемой функции «динамической памяти» «C плюс плюс»:
int main(){int* myptr =newint;* myptr =1;
printf("myptr[0] is %i\n",*myptr);return0;}
Только g ++ может успешно скомпилироваться на моем компьютере, а gcc сообщит об ошибке
undefined reference to `operator new(unsigned long)'
Поэтому мой собственный вывод - gcc не полностью поддерживает «C плюс плюс». Кажется, что выбор g ++ для исходных файлов C ++ - лучший вариант.
Вы должны сделать две работы: 1. выбрать язык 2. выбрать такую библиотеку, как libstdc ++
PersianGulf
-1
gcc и g ++ являются компилятором GNU. Они оба компилируют c и c ++. Разница в том, что файлы * .c gcc рассматривает как программу ac, а g ++ видит ее как программу ac ++. Файлы * .cpp считаются программами c ++. c ++ - это супер-набор c, а синтаксис более строгий, поэтому будьте осторожны с суффиксом.
C ++ - это другой язык, не строгий надмножество C, поэтому компиляция с неверным целевым языком может привести к неожиданным результатам. Также обратите внимание, что g++также будет интерпретироваться .ccкак расширение имени файла только для C ++.
Ответы:
gcc
иg++
являются драйверами компилятора коллекции компиляторов GNU (которая когда-то была просто компилятором GNU C ).Несмотря на то, что они автоматически определяют, какие бэкэнды (
cc1
cc1plus
...) вызывать в зависимости от типа файла, если-x language
они не переопределены , они имеют некоторые различия.Вероятно, наиболее важным отличием в их настройках по умолчанию является то, с какими библиотеками они связываются автоматически.
В соответствии с настройками ссылок онлайн-документации GCC и тем, как вызывается g ++ ,
g++
это эквивалентноgcc -xc++ -lstdc++ -shared-libgcc
(1-й - это опция компилятора, 2-й - это опции компоновщика). Это можно проверить, запустив оба-v
параметра (он отображает команды запуска бэкэнда).источник
argv[0]
какой вызов следует использовать. Это довольно распространено среди основных утилит UNIX.GCC: коллекция компиляторов GNU
gcc
: Компиляторg++
GNU C: Компилятор GNU C ++Основные отличия:
gcc
скомпилирует:*.c\*.cpp
файлы как C и C ++ соответственно.g++
скомпилирует:*.c\*.cpp
файлы, но все они будут обрабатываться как файлы C ++.g++
для связывания объектных файлов, он автоматически связывается в библиотеках std C ++ (gcc
не делает этого).gcc
Компиляция файлов C имеет меньше предопределенных макросов.gcc
Компиляция*.cpp
иg++
компиляция*.c\*.cpp
файлов имеет несколько дополнительных макросов.Дополнительные макросы при компиляции
*.cpp
файлов:источник
gcc
, передав-lstdc++
параметр.gcc -lstdc++
вы все равно не получите такого же поведения, какg++
. Мы помещаем все это специфичное для языка поведение в его собственный драйвер по причине, для которой это существует. :-)-lstdc++
, поскольку будут отсутствовать зависимости от математики, RTTI и информации об исключениях. Будет ли данный тест ссылаться или не получится, будет зависеть от операционной системы и от того, какие функции C ++ используются в тестовом примере, и опять же, поэтому все эти знания встроены в драйвер g ++, а не оставлены на усмотрение пользователя, чтобы выяснить ,gcc -lstdc++
на других ОС, особенно когда целью является встроенная платформа. К счастью, именно поэтому мы поставляем g ++ в первую очередь.-dumpspec
(например) кросс-компилятор, ориентированный на встроенную систему, вы увидите различия. Существуют не только различия в компоновщиках ... о чем и был ваш ответ (макросы препроцессора, пути, несколько библиотек времени выполнения). Похоже, мы говорим мимо друг друга, но, как бывший мейнтейнер GCC, уверяю вас, я знаком с тем, что такое интерфейсы, а какие нет.Для c ++ вы должны использовать g ++.
Это тот же компилятор (например, коллекция компиляторов GNU). GCC или G ++ просто выбирают другой интерфейс с другими параметрами по умолчанию.
В двух словах: если вы используете g ++, интерфейс скажет компоновщику, что вы можете захотеть связать его со стандартными библиотеками C ++. Интерфейс gcc этого не сделает (также он может связываться с ними, если вы укажете правильные параметры командной строки).
источник
В чем разница между
g++
иgcc
?gcc
из одного языка "GNU C Compiler" превратился в многоязычную "коллекцию компиляторов GNU". Термин «GNU C Compiler» до сих пор иногда используется в контексте программирования на Си.g++
Является компилятор С ++ для GNU Compiler Collection. Какgnat
и компилятор Ada дляgcc
. см. Использование коллекции компиляторов GNU (GCC)Например, команда Ubuntu 16.04 и 18.04
man g++
возвращаетGCC(1)
страницу руководства.Ubuntu 16.04 и 18.04
man gcc
утверждает, что ...и это по умолчанию ...
Ищите
gcc
справочные страницы для получения более подробной информации о вариантах отклонений междуgcc
иg++
.Какой из них следует использовать для общей разработки C ++?
Технически, либо
gcc
илиg++
могут быть использованы для разработки общего C ++ с действующими параметрами настройки. Однакоg++
поведение по умолчанию естественно выровнено с разработкой C ++.В справочную страницу Ubuntu 18.04 добавлен следующий абзац:
источник
Одно заметное отличие состоит в том, что если вы передадите
.c
файл в gcc, он будет скомпилирован как C.Поведение по умолчанию в g ++ заключается в обработке
.c
файлов как C ++ (если-x c
не указано иное).источник
Хотя команды gcc и g ++ делают очень похожие вещи, g ++ разработана как команда, которую вы вызываете для компиляции программы на C ++; он предназначен для того, чтобы автоматически делать правильные вещи.
За кулисами они действительно одна и та же программа. Как я понимаю, оба решают, компилировать ли программу как C или как C ++ на основе расширения имени файла. Оба способны связываться со стандартной библиотекой C ++, но только g ++ делает это по умолчанию. Так что если у вас есть программа, написанная на C ++, которая не нуждается в связывании со стандартной библиотекой, gcc будет делать правильные вещи; но тогда g ++. Так что на самом деле нет причин не использовать g ++ для общей разработки на C ++.
источник
Я заинтересовался этим вопросом и провел несколько экспериментов.
Я нашел это описание здесь , но оно очень короткое.
Затем я попытался поэкспериментировать с gcc.exe и g ++. Exe на моей машине с Windows:
Я попытался скомпилировать простые тестовые файлы c89, c99 и c ++ 1998, и это хорошо работает для меня с правильным соответствием расширений для языка
Но когда я пытаюсь запустить инструмент "gnu compiler collection" таким способом:
Но этот все еще работает без ошибок
И это также
ps тестовые файлы
Результаты:
Если посмотреть на дерево процессов, то кажется, что gcc и g ++ являются бэкендом для других инструментов, которые в моей среде: cc1plus.exe, cc1.exe, collect2.exe, as.exe, ld.exe
gcc отлично работает как metatool, если у вас правильное расширение или установлены правильные флаги -std -x. Смотрите это
источник
«GCC» - это общий сокращенный термин для коллекции компиляторов GNU. Это и самое общее имя для компилятора, и имя, используемое, когда акцент делается на компиляции программ на C (поскольку ранее аббревиатура расшифровывалась как «GNU C Compiler»).
При ссылке на компиляцию C ++ обычно называют компилятор «G ++». Поскольку существует только один компилятор, его также можно назвать «GCC» независимо от языкового контекста; однако термин «G ++» более полезен, когда акцент делается на компиляции программ на C ++.
Вы можете прочитать больше здесь .
источник
Я тестировал gcc и g ++ в системе linux. Используя MAKEFILE, я могу определить компилятор, используемый "GNU make". Я проверил с помощью так называемой функции «динамической памяти» «C плюс плюс»:
Только g ++ может успешно скомпилироваться на моем компьютере, а gcc сообщит об ошибке
Поэтому мой собственный вывод - gcc не полностью поддерживает «C плюс плюс». Кажется, что выбор g ++ для исходных файлов C ++ - лучший вариант.
источник
gcc и g ++ являются компилятором GNU. Они оба компилируют c и c ++. Разница в том, что файлы * .c gcc рассматривает как программу ac, а g ++ видит ее как программу ac ++. Файлы * .cpp считаются программами c ++. c ++ - это супер-набор c, а синтаксис более строгий, поэтому будьте осторожны с суффиксом.
источник
g++
также будет интерпретироваться.cc
как расширение имени файла только для C ++.