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

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

10 ответов


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

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

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

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


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

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

gcc: компилятор GNU C
G++: компилятор GNU C++

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

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

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

#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern

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

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

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


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

gcc эволюционировал из одного языка "компилятор GNU C", чтобы быть многоязычной "коллекцией компиляторов GNU". Термин "компилятор GNU C" все еще используется иногда в контексте программирования на языке C.

на g++ и компилятор C++ для коллекции компиляторов GNU. Как gnat является компилятором Ada для gcc. см. использование коллекции компиляторов GNU (GCC)

например, Ubuntu 16.04 и 18.04 возвращает GCC(1) страница руководства.

Ubuntu 16.04 и 18.04 man gcc утверждает, что ...

g++ принимает в основном те же параметры, что и gcc

и это значение по умолчанию ...

... использование gcc не добавляет библиотеку C++. g++ программа который вызывает GCC и автоматически указывает ссылку против с++ библиотека. Лечит .с. ,h и .я файлы как исходные файлы C++ вместо C исходные файлы, если не используется-x. Эта программа также полезна при предварительная компиляция файла заголовка C с помощью a .расширение h для использования в C++ компиляции.

Поиск gcc man-страницы для подробностей нравов о вариантах отклонений gcc и g++.

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

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

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

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


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

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


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

  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 
    

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.ехе, взыскать 2.exe, as.exe, ld.exe

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


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

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

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


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


Я тестировал gcc и g++ в системе linux. С помощью make-файла, можно определить compliler используется "пакет". Я тестировал с помощью так называемой "динамической памяти" функцию определения местоположения "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++ для исходных файлов c++ является лучшим вариантом.


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