Чим відрізняється g ++ від gcc? Який із них слід використовувати для загального розвитку с ++?
Чим відрізняється g ++ від gcc? Який із них слід використовувати для загального розвитку с ++?
Відповіді:
gcc
і g++
є драйверами компіляторів колекції GNU Compiler (яка колись була просто компілятором GNU C ).
Навіть незважаючи на те, що вони автоматично визначають, які саме пакети ( cc1
cc1plus
...) викликати залежно від типу файлу, якщо їх не перекрито -x language
, вони мають деякі відмінності.
Мабуть, найважливіша відмінність їх за замовчуванням полягає в тому, з якими бібліотеками вони автоматично посилаються.
Згідно онлайн документації GCC в варіанти посилань і як г ++ викликається , g++
еквівалентно gcc -xc++ -lstdc++ -shared-libgcc
(1 - й є опція компілятора, то другий два є опції компоновщика). Це можна перевірити, застосувавши обидві -v
параметри (він відображає команди запущеної ланцюжка інструментів, що виконуються).
argv[0]
яку виклик слід використовувати. Це досить поширене серед основних утиліт UNIX.
GCC: Колекція компіляторів GNU
gcc
: Компілятор
g++
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
gcc
, передавши -lstdc++
параметр.
gcc -lstdc++
все одно не ви отримаєте такої ж поведінки, як g++
. Ми вкладаємо всю цю специфічну для мови поведінку у власний драйвер чомусь, саме для цього і потрібно. :-)
-lstdc++
, оскільки не буде бракути залежностей від математики, RTTI та інформації про винятки. Від того, чи посилання на тестовий випадок чи помилки буде залежати від операційної системи та те, які функції C ++ використовуються тестовим випадком, і знову ж таки, тому всі ці знання вбудовуються в драйвер g ++, а не залишаються користувачеві, щоб розібратися. .
gcc -lstdc++
на інших ОС, особливо коли ціль - це вбудована платформа. На щастя, саме тому ми постачаємо g ++ в першу чергу.
-dumpspec
(наприклад) крос-компілятор, орієнтований на вбудовану систему, ви побачите відмінності. Існує більше, ніж просто відмінності між лінкерами ... що, знову ж таки, - це те, про що ви говорили (препроцесорні макроси, включають шляхи, кілька бібліотек виконання). Ми, здається, розмовляємо один з одним, але, як колишній керівник GCC, я запевняю вас, що я знайомий з тим, що таке фронтанд, а що ні.
Для c ++ слід використовувати g ++.
Це той самий компілятор (наприклад, колекція компілятора GNU). GCC або G ++ просто виберіть інший передній з різними параметрами за замовчуванням.
Коротше кажучи: якщо ви використовуєте g ++, frontend скаже лінкеру, що ви можете зв’язатись зі стандартними бібліотеками C ++. Fcc frontend цього не зробить (також він може зв’язатися з ними, якщо ви передасте правильні параметри командного рядка).
У чому різниця між g++
і gcc
?
gcc
перетворилася з єдиної мови "Компілятор GNU C" на багатомовну "Колекцію компіляторів GNU". Термін "компілятор GNU C" все ще іноді використовується в контексті програмування на С.
g++
Є компілятор С ++ для GNU Compiler Collection. Як 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++
натомість.
Одна помітна відмінність полягає в тому, що якщо ви передасте .c
файл в gcc, він складеться як C.
Поведінка g ++ за замовчуванням полягає в тому, щоб .c
файли трактували як C ++ (якщо -x c
не вказано).
Хоча команди gcc та g ++ роблять дуже подібні речі, g ++ призначений для команди, до якої слід запросити компіляцію програми C ++; він призначений автоматично робити правильну справу.
За лаштунками вони дійсно та сама програма. Як я розумію, обидва вирішують, чи компілювати програму як C або як C ++ на основі розширення імені файлу. Обидва здатні зв’язуватися зі стандартною бібліотекою C ++, але за замовчуванням це робить лише g ++. Отже, якщо у вас є програма, написана на C ++, яка не потребує посилання на стандартну бібліотеку, gcc буде робити все правильно; але тоді, так би г ++. Тож насправді немає причин не використовувати 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 compiler" таким чином:
$ 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
ps Тестові файли
$ 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, collection2.exe, as.exe, ld.exe
gcc чудово працює як metatool, якщо у вас правильне розширення або встановлено правильні прапорці -std -x. Дивіться це
"GCC" є загальним скороченим терміном для колекції GNU Compiler. Це і найзагальніша назва компілятора, і назва, що використовується, коли акцент робиться на компіляції програм C (як абревіатура раніше позначалася як "GNU C Compiler").
Коли йдеться про компіляцію C ++, звичайно називати компілятор "G ++". Оскільки є лише один компілятор, його також точно називати "GCC", незалежно від мовного контексту; однак термін "G ++" є більш корисним, коли акцент робиться на складанні програм C ++.
Більше ви можете прочитати тут .
Я тестував gcc та g ++ в системі Linux. Використовуючи MAKEFILE, я можу визначити компілятор, який використовується "GNU make". Я перевірив функцію локалізації так званої "динамічної пам'яті" "плюс плюс":
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 трактує це як програму змінного струму, а g ++ сприймає це як програму ac ++. * .cpp файли вважаються програмами c ++. c ++ - це супер набір c, а синтаксис - більш суворий, тому будьте уважні до суфіксу.
g++
також буде інтерпретуватись .cc
як розширення назви файлів, призначених лише для C ++.