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

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

Ответы

Ответ 1

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

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

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

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

Ответ 2

GCC: сборник компиляторов GNU

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

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

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

  • gcc скомпилирует: *.c/*. cpp файлы как C и С++ соответственно.
  • g++ скомпилирует: *.c/*. cpp файлы, но все они будут рассматриваться как файлы С++.
  • Также, если вы используете g++ для связывания объектных файлов, он автоматически связывается в std-библиотеках С++ (gcc не делает этого).
  • gcc компиляция файлов C имеет меньше предопределенных макросов.
  • 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

Ответ 3

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

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

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

Ответ 4

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

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

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 более подробную информацию о вариантах отклонений между gcc и g++.

Какой из них следует использовать для общего развития C++?

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

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

  • Затем я попытался поэкспериментировать с 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
    
  • Я попытался скомпилировать простые тестовые файлы c89, c99 и С++ 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
    
  • Но когда я пытаюсь запустить инструмент "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]
    
  • Но это еще не работает без ошибок

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

    $ 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;
}

Выводы:

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

  • gcc отлично работает как metatool для, если у вас есть правильное расширение или задано правильное -std -x флаги. См. this

Ответ 8

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

При обращении к компиляции С++ обычно вызывается компилятор "g++". Поскольку существует только один компилятор, его также можно назвать "GCC" независимо от языкового контекста; однако термин "g++" более полезен, когда акцент делается на компиляции программ на С++.

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

Ответ 9

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

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 plus plus". Похоже, что выбор g++ для исходных файлов на С++ является лучшим вариантом.

Ответ 10

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