




gcc и g++ - это драйверы компилятора GNU Compiler Коллекция (который когда-то был просто GNU Компилятор C).
Несмотря на то, что они автоматически определяют, какие серверные ВМ (cc1cc1plus ...) вызывать в зависимости от типа файла, если они не переопределены с помощью -x language, они имеют некоторые различия.
Вероятно, наиболее важным различием в их значениях по умолчанию является то, с какими библиотеками они связываются автоматически.
Согласно онлайн-документации GCC параметры ссылки и как вызывается g ++, g++ эквивалентен gcc -xc++ -lstdc++ -shared-libgcc (1-й вариант компилятора, 2-й два - параметры компоновщика). Это можно проверить, запустив оба параметра с параметром -v (он отображает выполняемые команды внутренней инструментальной цепочки).
Из этого ответа я прихожу к выводу, что по сути команда g ++ - это просто gcc с кучей флагов. Почему же тогда существуют два разных двоичных файла (примерно одинакового размера) для gcc и g ++ в linux? Разве нам не следует иметь только один двоичный файл и одну символическую ссылку (или что-то в этом роде)?
@Uchihaltachi эти файлы являются жесткими ссылками, и при загрузке они проверяют argv[0], чтобы увидеть, какой вызов следует использовать. Это довольно распространено среди основных утилит UNIX.
Где в документации написано, что g++ is equivalent to gcc -xc++ -lstdc++ -shared-libgcc? Он говорит только о том, что обрабатывает .c, .h и .i как C++ и автоматически связывает libstdC++. Если отправленная команда была правильной, файл .txt с допустимым кодом C++ компилируется, но вместо этого возвращает ошибку неподдерживаемого формата файла.
Для C++ вы должны использовать g ++.
Это тот же компилятор (например, коллекция компиляторов GNU). GCC или G ++ просто выберите другой интерфейс с другими параметрами по умолчанию.
Вкратце: если вы используете g ++, интерфейс сообщит компоновщику, что вы можете захотеть связать его со стандартными библиотеками C++. Интерфейс gcc этого не сделает (также он может связываться с ними, если вы передадите правильные параметры командной строки).
+1 Также моя страница руководства GNU / Linux gcc говорит: «Когда вы компилируете программы на C++, вы должны вместо этого вызывать GCC как g ++».
Одно заметное отличие состоит в том, что если вы передадите файл .c в gcc, он будет компилироваться как C.
По умолчанию g ++ обрабатывает файлы .c как C++ (если не указан -x c).
(Поздно, но для потомков). Как указывали другие ответы, это ни в коем случае не «единственное заметное различие», если у читателя нет искаженного определения значимости.
Хотя команды gcc и g ++ делают очень похожие вещи, g ++ спроектирован как команда, которую вы вызываете для компиляции программы на C++; он предназначен для того, чтобы автоматически поступать правильно.
За кулисами это одна и та же программа. Насколько я понимаю, оба решают, компилировать ли программу как C или как C++, в зависимости от расширения имени файла. Оба могут связываться со стандартной библиотекой C++, но по умолчанию это делает только g ++. Так что, если у вас есть программа, написанная на C++, которая не требует компоновки со стандартной библиотекой, gcc поступит правильно; но тогда и g ++ тоже. Так что действительно нет причин не использовать g ++ для общей разработки на C++.
GCC: Коллекция компиляторов GNU
gcc: компилятор GNU C
g++: компилятор GNU C++
Основные отличия:
gcc скомпилирует: файлы *.c\*.cpp как C и C++ соответственно.g++ скомпилирует: файлы *.c\*.cpp, но все они будут обрабатываться как файлы C++.g++ для связывания объектных файлов, он автоматически подключается к стандартным библиотекам C++ (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
Вы можете связать библиотеку std C++ в gcc, передав параметр -lstdc++.
Между 'gcc' и 'g ++' больше различий, чем только стандартными библиотеками, поэтому gcc -lstdc++ все равно не даст вам того же поведения, что и g++. Мы помещаем все это зависящее от языка поведение в отдельный драйвер по какой-то причине, для этого он существует. :-)
Мой комментарий не говорит о простом связывании ... в этом суть. Даже просто ограничив обсуждение связью (чего не было в вашем ответе), пользователь по-прежнему не сможет использовать всю стандартную библиотеку C++, указав только -lstdc++, поскольку будут отсутствовать зависимости от математики, RTTI и информации об исключениях. Будет ли данный тестовый пример связывать или нет, будет зависеть от операционной системы и от того, какие функции C++ используются в тестовом примере, и опять же, именно поэтому все эти знания встроены в драйвер g ++, а не оставляются на усмотрение пользователя для выяснения. .
Поверьте мне, мы часто обсуждаем это, обычно когда пользователь Linux пытается переместить свой неполный Makefile на другую платформу. :-) Этап связывания g ++ делает намного больше, чем gcc -lstdc++ в других операционных системах, особенно когда целью является встроенная платформа. К счастью, именно поэтому мы в первую очередь отправляем g ++.
Строки спецификации построены так, чтобы быть специфичными для компилятора, которые, в свою очередь, специфичны для операционной системы и цели. Поэтому, если вы запустите -dumpspec (например) на кросс-компиляторе, ориентированном на встроенную систему, вы увидите различия. Есть больше, чем просто отличия компоновщика ... что опять же, о чем был ваш ответ (макросы препроцессора, пути включения, несколько библиотек времени выполнения). Кажется, мы разговариваем друг с другом, но, как бывший сопровождающий GCC, уверяю вас, я знаком с интерфейсами, а что нет.
Итак, когда в данном приложении используется сочетание кода C и C++, мне кажется, что для компиляции код C должен идти в gcc, а C++ в g ++. Но когда дело доходит до связывания (будь то dll или исполняемый файл приложения), рекомендуется использовать g ++. Я правильно понял?
Также gcc может просто не работать с некоторыми файлами cpp, в то время как g ++ работает с ними без каких-либо проблем .. Даже после использования флага -x для gcc, чтобы указать ему, что это режим cpp, который я хочу. Я только что наткнулся на это и был очень удивлен. Опять же, это происходит из-за постоянного использования внешних интерфейсов для компиляции. XD
«GCC» - это общий сокращенный термин для коллекции компиляторов GNU. Это и самое общее имя компилятора, и имя, используемое, когда упор делается на компиляцию программ C (так как раньше это сокращение означало «GNU C Compiler»).
Говоря о компиляции C++, обычно называют компилятор «G ++». Поскольку существует только один компилятор, его также будет правильно называть «GCC» независимо от языкового контекста; однако термин «G ++» более полезен, когда упор делается на компиляцию программ на C++.
Вы можете прочитать больше здесь.
gcc и g ++ являются компиляторами GNU. Они оба компилируют c и C++. Разница в том, что для файлов * .c gcc рассматривает их как программу на c, а g ++ - как программу на C++. Файлы * .cpp считаются программами на C++. C++ - это супер-набор c, а синтаксис более строгий, поэтому будьте осторожны с суффиксом.
C++ - это другой язык, а не строгий надмножество C, поэтому компиляция с неправильным целевым языком может привести к неожиданным результатам. Также обратите внимание, что g++ также будет интерпретировать .cc как расширение имени файла только для C++.
Меня заинтересовал вопрос и провожу несколько экспериментов
Я нашел это описание здесь, но оно очень короткое.
Затем я попытался поэкспериментировать с 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 и 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
Но когда я пытаюсь запустить таким образом инструмент "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 флаги. См. это
В чем разница между g++ и gcc?
gcc превратился из одноязычного «компилятора GNU C» в многоязычную «коллекцию компиляторов GNU». Термин «компилятор GNU C» все еще иногда используется в контексте программирования на языке C.
g++является компилятор C++ для коллекции компиляторов GNU. Как и gnat, это компилятор Ada для gcc. см. Использование коллекции компиляторов GNU (GCC)
Например, команда man g++ в Ubuntu 16.04 и 18.04 возвращает страницу руководства GCC(1).
В Ubuntu 16.04 и 18.04 man gcc говорится, что ...
g++accepts mostly the same options asgcc
и что по умолчанию ...
... use of
gccdoes not add the C++ library.g++is a program that calls GCC and automatically specifies linking against the C++ library. It treats .c, .h and .i files as C++ source files instead of C source files unless -x is used. This program is also useful when precompiling a C header file with a .h extension for use in C++ compilations.
Поищите на страницах руководства gcc более подробную информацию о различиях между gcc и g++.
Какой из них следует использовать для общей разработки на C++?
Технически gcc или g++ можно использовать для общей разработки на C++ с соответствующими настройками параметров. Однако поведение по умолчанию g++ естественно согласовано с разработкой на C++.
Добавлен Справочная страница Ubuntu 18.04 'gcc', а Ubuntu 20.04 продолжает иметь следующий абзац:
The usual way to run GCC is to run the executable called
gcc, ormachine-gccwhen cross-compiling, ormachine-gcc-versionto run a specific version of GCC. When you compile C++ programs, you should invoke GCC asg++instead.
Я тестировал 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 ++ для исходных файлов C++ - лучший вариант.
Вам нужно выполнить две задачи: 1. выбрать язык 2. выбрать какую-нибудь библиотеку, например libstdC++.
g ++ => компилятор C++ gcc => компилятор c