В чем разница между g ++ и gcc? - PullRequest
774 голосов
/ 06 октября 2008

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

Ответы [ 10 ]

649 голосов
/ 06 октября 2008

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

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

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

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

395 голосов
/ 06 октября 2008

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

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

gcc: GNU C Compiler
g ++: компилятор 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
72 голосов
/ 06 октября 2008

Для c ++ вы должны использовать g ++.

Это тот же компилятор (например, коллекция компиляторов GNU). GCC или G ++ просто выбирают другой интерфейс с другими параметрами по умолчанию.

В двух словах: если вы используете g ++, интерфейс скажет компоновщику, что вы можете захотеть связать его со стандартными библиотеками C ++. Интерфейс gcc этого не сделает (также он может связываться с ними, если вы укажете правильные параметры командной строки).

24 голосов
/ 05 января 2016

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

gcc превратилась из одного языка "Компилятор GNU C" в многоязычную "Коллекцию компиляторов GNU". Термин «Компилятор GNU C» все еще иногда используется в контексте программирования на Си.

g++ - это компилятор C ++ для коллекции компиляторов GNU. Например, 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 ++, вы должны вместо этого вызывать GCC как g++.

17 голосов
/ 06 октября 2008

Единственное заметное отличие состоит в том, что если вы передадите .c в gcc, он будет скомпилирован как C, тогда как g ++ всегда будет обрабатывать его как C ++.

16 голосов
/ 06 октября 2008

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

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

10 голосов
/ 16 марта 2015

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

  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" таким образом:

    $ 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 
    

p.s. Тестовые файлы

$ 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 флаги. См это

9 голосов
/ 18 октября 2012

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

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

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

1 голос
/ 02 ноября 2016

Я тестировал 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 ++.

0 голосов
/ 12 августа 2014

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

...