Вопрос
В чем разница между g++ и gcc?Какие из них следует использовать для общей разработки на C++?
Решение
gcc
и g ++
являются драйверами компилятора коллекции компилятора GNU (которая когда-то была просто GNU C) Компилятор ).
Даже если они автоматически определяют, какие бэкэнды ( cc1
cc1plus
...) вызывать в зависимости от типа файла, если они не переопределены с помощью -x language
, у них есть некоторые отличия.
Вероятно, наиболее важным отличием в их настройках по умолчанию является то, с какими библиотеками они связываются автоматически.
Согласно электронной документации GCC параметры ссылок и как вызывается g ++ , g ++
эквивалентно gcc -xc ++ -lstdc ++ -shared-libgcc
(1-й вариант - компилятор, 2-й вариант - компоновщик). Это можно проверить, запустив оба с параметром -v
(он отображает команды запуска бэкэнд-тулчейна).
Другие советы
ССЗ:Коллекция компиляторов GNU
- Ссылки на все языки, поддерживаемые компилятором GNU.
ГЦК:GNU C Компилятор
г++:Компилятор GNU C++
Основные отличия:
- gcc скомпилирует:Файлы *.c/*.cpp как C и C++ соответственно.
- g++ скомпилирует:*.c/*.cpp, но все они будут рассматриваться как файлы C++.
- Кроме того, если вы используете g++ для связывания объектных файлов, он автоматически связывается с библиотеками std 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
Для c ++ вы должны использовать g ++.
Это тот же самый компилятор (например, коллекция компиляторов GNU). GCC или G ++ просто выбирают другой интерфейс с другими параметрами по умолчанию.
В двух словах: если вы используете g ++, интерфейс скажет компоновщику, что вы можете захотеть связать его со стандартными библиотеками C ++. Интерфейс gcc этого не сделает (также он может связываться с ними, если вы укажете правильные параметры командной строки). Р>
В чем разница между g ++
и gcc
?
gcc
произошел от одного языка " Компилятор GNU C " быть многоязычной "коллекцией компиляторов GNU". Термин «Компилятор GNU C» до сих пор иногда используется в контексте программирования на Си.
Единственное заметное отличие состоит в том, что если вы передадите .c
в gcc, он будет скомпилирован как C, тогда как g ++ всегда будет обрабатывать его как C ++.
Хотя команды gcc и g ++ делают очень похожие вещи, g ++ разработана как команда, которую вы вызываете для компиляции программы на C ++; он предназначен для того, чтобы автоматически делать правильные вещи.
За кулисами они действительно одна и та же программа. Как я понимаю, оба решают, компилировать ли программу как C или как C ++ на основе расширения имени файла. Оба способны связываться со стандартной библиотекой C ++, но только g ++ делает это по умолчанию. Так что если у вас есть программа, написанная на C ++, которая не нуждается в связывании со стандартной библиотекой, gcc будет делать правильные вещи; но тогда g ++. Так что на самом деле нет причин не использовать g ++ для общей разработки на 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» таким образом:
$ 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
п.с.Тестовые файлы
$ 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 отлично работает как метатул, если у вас есть правильное расширение или установите правильные флаги -x.Видеть этот
«GCC» — это общепринятый сокращенный термин для коллекции компиляторов GNU.Это одновременно и самое общее имя компилятора, и имя, используемое, когда упор делается на компиляцию программ на языке C (поскольку аббревиатура раньше обозначала «GNU C Compiler»).
Говоря о компиляции C++, компилятор обычно называют «G++».Поскольку существует только один компилятор, его также будет правильно называть «GCC», независимо от языкового контекста;однако термин «G++» более полезен, когда упор делается на компиляцию программ на C++.
Вы могли бы прочитать больше здесь.
Я тестировал 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 ++.
gcc и g ++ являются компилятором GNU. Они оба компилируют c и c ++. Разница заключается в том, что файлы * .c gcc рассматривает как программу c, а g ++ видит ее как программу c ++. Файлы * .cpp считаются программами c ++. c ++ - это расширенный набор c, а синтаксис более строгий, поэтому будьте осторожны с суффиксом.