В чем разница между g ++ и gcc?

875

В чем разница между g ++ и gcc? Какой из них следует использовать для общей разработки c ++?

Брайан Р. Бонди
источник
g ++ => компилятор c ++ gcc => компилятор c
Nagappa

Ответы:

728

gccи g++являются драйверами компилятора коллекции компиляторов GNU (которая когда-то была просто компилятором GNU C ).

Несмотря на то, что они автоматически определяют, какие бэкэнды ( cc1 cc1plus...) вызывать в зависимости от типа файла, если -x languageони не переопределены , они имеют некоторые различия.

Вероятно, наиболее важным отличием в их настройках по умолчанию является то, с какими библиотеками они связываются автоматически.

В соответствии с настройками ссылок онлайн-документации GCC и тем, как вызывается g ++ , g++это эквивалентно gcc -xc++ -lstdc++ -shared-libgcc(1-й - это опция компилятора, 2-й - это опции компоновщика). Это можно проверить, запустив оба -vпараметра (он отображает команды запуска бэкэнда).

Kodiologist
источник
13
Из этого ответа я делаю вывод, что фактически команда g ++ - это просто gcc с кучей флагов. Почему тогда в linux есть два разных двоичных файла (примерно одинакового размера) для gcc и g ++? Разве мы не должны иметь только один двоичный файл и одну символическую ссылку (или что-то в этом роде)?
УчихаИтачи
9
@Uchihaltachi - это жесткие ссылки, и при загрузке они проверяют, argv[0]какой вызов следует использовать. Это довольно распространено среди основных утилит UNIX.
Смак
439

GCC: коллекция компиляторов GNU

  • Ссылки на все разные языки, которые поддерживаются компилятором GNU.

gcc: Компилятор
g++GNU C: Компилятор GNU C ++

Основные отличия:

  1. gccскомпилирует: *.c\*.cppфайлы как C и C ++ соответственно.
  2. g++скомпилирует: *.c\*.cppфайлы, но все они будут обрабатываться как файлы C ++.
  3. Также, если вы используете g++для связывания объектных файлов, он автоматически связывается в библиотеках std C ++ ( gccне делает этого).
  4. gcc Компиляция файлов C имеет меньше предопределенных макросов.
  5. gccКомпиляция *.cppи g++компиляция *.c\*.cppфайлов имеет несколько дополнительных макросов.

Дополнительные макросы при компиляции *.cppфайлов:

#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
Мартин Йорк
источник
37
Вы можете связать стандартную библиотеку 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 этого не сделает (также он может связываться с ними, если вы укажете правильные параметры командной строки).

Нильс Пипенбринк
источник
3
+1 Также моя man-страница GNU / Linux gcc говорит: «Когда вы компилируете программы на C ++, вы должны вместо этого вызывать GCC как g ++».
эллиптический вид
35

В чем разница между 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утверждает, что ...

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 ++.

В справочную страницу Ubuntu 18.04 добавлен следующий абзац:

Обычный способ запустить GCC - запустить исполняемый файл с именем gcc, или machine-gccпри кросс-компиляции, или machine-gcc-versionзапустить определенную версию GCC. Когда вы компилируете программы на C ++, вы должны g++вместо этого вызывать GCC .

л - знак л
источник
21

Одно заметное отличие состоит в том, что если вы передадите .cфайл в gcc, он будет скомпилирован как C.

Поведение по умолчанию в g ++ заключается в обработке .cфайлов как C ++ (если -x cне указано иное).

njsf
источник
19
(Поздно, но для потомков). Как указывали другие ответы, это ни в коем случае не «единственное заметное различие», если только у читателя нет искаженного определения знатности.
underscore_d
16

Хотя команды gcc и g ++ делают очень похожие вещи, g ++ разработана как команда, которую вы вызываете для компиляции программы на C ++; он предназначен для того, чтобы автоматически делать правильные вещи.

За кулисами они действительно одна и та же программа. Как я понимаю, оба решают, компилировать ли программу как C или как C ++ на основе расширения имени файла. Оба способны связываться со стандартной библиотекой C ++, но только g ++ делает это по умолчанию. Так что если у вас есть программа, написанная на C ++, которая не нуждается в связывании со стандартной библиотекой, gcc будет делать правильные вещи; но тогда g ++. Так что на самом деле нет причин не использовать g ++ для общей разработки на C ++.

Зафод
источник
12

Я заинтересовался этим вопросом и провел несколько экспериментов.

  1. Я нашел это описание здесь , но оно очень короткое.

  2. Затем я попытался поэкспериментировать с gcc.exe и g ++. Exe на моей машине с Windows:

    $ g++ --version | head -n1 
    g++.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3
    
    $ gcc --version | head -n1
    gcc.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3
  3. Я попытался скомпилировать простые тестовые файлы c89, c99 и c ++ 1998, и это хорошо работает для меня с правильным соответствием расширений для языка

    gcc -std=c99 test_c99.c
    gcc -std=c89 test_c89.c 
    g++ -std=c++98 test_cpp.cpp
    gcc -std=c++98 test_cpp.cpp
  4. Но когда я пытаюсь запустить инструмент "gnu compiler collection" таким способом:

    $ gcc -std=c++98 test_cpp.c
    cc1.exe: warning: command line option '-std=c++98' is valid for C++/ObjC++ but not for C [enabled by default]
  5. Но этот все еще работает без ошибок

    $ gcc -x c++ -std=c++98 test_cpp.c
  6. И это также

    $ g++ -std=c++0x test_cpp_11.cpp 

ps тестовые файлы

$ cat test_c89.c test_c99.c test_cpp.cpp

// C89 compatible file
int main()
{
    int x[] = {0, 2};
    return sizeof(x);
}

// C99 compatible file
int main()
{
    int x[] = {[1]=2};
    return sizeof(x);
}

// C++1998,2003 compatible file
class X{};
int main()
{
    X x;
    return sizeof(x);
}

// C++11
#include <vector>
enum class Color : int{red,green,blue}; // scoped enum
int main()
{
    std::vector<int> a {1,2,3}; // bracket initialization
    return 0;
}

Результаты:

  1. Если посмотреть на дерево процессов, то кажется, что gcc и g ++ являются бэкендом для других инструментов, которые в моей среде: cc1plus.exe, cc1.exe, collect2.exe, as.exe, ld.exe

  2. gcc отлично работает как metatool, если у вас правильное расширение или установлены правильные флаги -std -x. Смотрите это

bruziuz
источник
9

«GCC» - это общий сокращенный термин для коллекции компиляторов GNU. Это и самое общее имя для компилятора, и имя, используемое, когда акцент делается на компиляции программ на C (поскольку ранее аббревиатура расшифровывалась как «GNU C Compiler»).

При ссылке на компиляцию C ++ обычно называют компилятор «G ++». Поскольку существует только один компилятор, его также можно назвать «GCC» независимо от языкового контекста; однако термин «G ++» более полезен, когда акцент делается на компиляции программ на C ++.

Вы можете прочитать больше здесь .

Минь-Триет Фам Чан
источник
0

Я тестировал gcc и g ++ в системе linux. Используя MAKEFILE, я могу определить компилятор, используемый "GNU make". Я проверил с помощью так называемой функции «динамической памяти» «C плюс плюс»:

int main(){

int * myptr = new int;
* myptr = 1;
printf("myptr[0] is %i\n",*myptr);
return 0;
}

Только g ++ может успешно скомпилироваться на моем компьютере, а gcc сообщит об ошибке

undefined reference to `operator new(unsigned long)'

Поэтому мой собственный вывод - gcc не полностью поддерживает «C плюс плюс». Кажется, что выбор g ++ для исходных файлов C ++ - лучший вариант.

magicmax
источник
Вы должны сделать две работы: 1. выбрать язык 2. выбрать такую ​​библиотеку, как libstdc ++
PersianGulf
-1

gcc и g ++ являются компилятором GNU. Они оба компилируют c и c ++. Разница в том, что файлы * .c gcc рассматривает как программу ac, а g ++ видит ее как программу ac ++. Файлы * .cpp считаются программами c ++. c ++ - это супер-набор c, а синтаксис более строгий, поэтому будьте осторожны с суффиксом.

Маркус Торнтон
источник
1
C ++ - это другой язык, не строгий надмножество C, поэтому компиляция с неверным целевым языком может привести к неожиданным результатам. Также обратите внимание, что g++также будет интерпретироваться .ccкак расширение имени файла только для C ++.
underscore_d