Чим відрізняється g ++ від gcc?


875

Чим відрізняється g ++ від gcc? Який із них слід використовувати для загального розвитку с ++?


g ++ => компілятор c ++ gcc => c компілятор
Nagappa

Відповіді:


727

gccі g++є драйверами компіляторів колекції GNU Compiler (яка колись була просто компілятором GNU C ).

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

Мабуть, найважливіша відмінність їх за замовчуванням полягає в тому, з якими бібліотеками вони автоматично посилаються.

Згідно онлайн документації GCC в варіанти посилань і як г ++ викликається , g++еквівалентно gcc -xc++ -lstdc++ -shared-libgcc(1 - й є опція компілятора, то другий два є опції компоновщика). Це можна перевірити, застосувавши обидві -vпараметри (він відображає команди запущеної ланцюжка інструментів, що виконуються).


13
З цієї відповіді я роблю висновок, що фактично команда g ++ - це лише gcc з купою прапорів. Чому тоді в linux є дві різні бінарні файли (приблизно однакового розміру) для gcc та g ++ ?. Чи не маємо ми мати лише одне двійкове та одне символьне посилання (чи щось у цьому напрямку)?
UchihaItachi

9
@Uchihaltachi ці файли є посиланнями, і коли вони завантажуються, вони перевіряють, argv[0]яку виклик слід використовувати. Це досить поширене серед основних утиліт UNIX.
Схильність

438

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

  • Посилаються на всі різні мови, які підтримує компілятор GNU.

gcc: Компілятор
g++GNU C: Компілятор GNU C ++

Основні відмінності:

  1. gccбуде компілювати: *.c\*.cppфайли як C і C ++ відповідно.
  2. g++буде компілювати: *.c\*.cppфайли, але всі вони будуть розглядатися як файли C ++.
  3. Крім того, якщо ви використовуєте g++для посилання об’єктних файлів, він автоматично посилається в бібліотеки std C ++ ( gccне робить цього).
  4. gcc компіляція файлів C має менше заздалегідь заданих макросів.
  5. 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

37
Ви можете зв'язати бібліотеку std C ++ gcc, передавши -lstdc++параметр.
Denilson Sá Maia

16
Існує більше відмінностей між "gcc" і "g ++", ніж лише у стандартних бібліотеках, тому gcc -lstdc++все одно не ви отримаєте такої ж поведінки, як g++. Ми вкладаємо всю цю специфічну для мови поведінку у власний драйвер чомусь, саме для цього і потрібно. :-)
Ti Strga

8
У моєму коментарі не йдеться про просто посилання ... в цьому справа. Навіть просто обмеживши дискусію посиланням (на що не було вашої відповіді), користувач все одно не зможе використовувати всю стандартну бібліотеку C ++, лише вказавши -lstdc++, оскільки не буде бракути залежностей від математики, RTTI та інформації про винятки. Від того, чи посилання на тестовий випадок чи помилки буде залежати від операційної системи та те, які функції C ++ використовуються тестовим випадком, і знову ж таки, тому всі ці знання вбудовуються в драйвер g ++, а не залишаються користувачеві, щоб розібратися. .
Ti Strga

10
Повірте, у нас дуже багато цієї дискусії, як правило, коли користувач Linux намагається перенести свій неповний Makefile на іншу платформу. :-) Етап посилання g ++ робить набагато більше, ніж gcc -lstdc++на інших ОС, особливо коли ціль - це вбудована платформа. На щастя, саме тому ми постачаємо g ++ в першу чергу.
Ті Стрга

10
Спеціальні рядки побудовані так, щоб бути специфічними для компілятора, які, в свою чергу, є специфічними для операційної системи та цілі. Тож якщо ви запустите -dumpspec(наприклад) крос-компілятор, орієнтований на вбудовану систему, ви побачите відмінності. Існує більше, ніж просто відмінності між лінкерами ... що, знову ж таки, - це те, про що ви говорили (препроцесорні макроси, включають шляхи, кілька бібліотек виконання). Ми, здається, розмовляємо один з одним, але, як колишній керівник GCC, я запевняю вас, що я знайомий з тим, що таке фронтанд, а що ні.
Ti Strga

82

Для c ++ слід використовувати g ++.

Це той самий компілятор (наприклад, колекція компілятора GNU). GCC або G ++ просто виберіть інший передній з різними параметрами за замовчуванням.

Коротше кажучи: якщо ви використовуєте g ++, frontend скаже лінкеру, що ви можете зв’язатись зі стандартними бібліотеками C ++. Fcc frontend цього не зробить (також він може зв’язатися з ними, якщо ви передасте правильні параметри командного рядка).


3
+1 Також на моїй сторінці GCC GNU / Linux gcc написано: "Коли ви компілюєте програми C ++, ви повинні використовувати GCC як g ++".
Еліптичний вигляд

35

У чому різниця між 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++натомість.


21

Одна помітна відмінність полягає в тому, що якщо ви передасте .cфайл в gcc, він складеться як C.

Поведінка g ++ за замовчуванням полягає в тому, щоб .cфайли трактували як C ++ (якщо -x cне вказано).


19
(Пізно, але для нащадків). Як вказували інші відповіді, це аж ніяк не "єдина помітна різниця", якщо тільки у читача немає перекошеного визначення помітності.
підкреслюйте_d

16

Хоча команди gcc та g ++ роблять дуже подібні речі, g ++ призначений для команди, до якої слід запросити компіляцію програми C ++; він призначений автоматично робити правильну справу.

За лаштунками вони дійсно та сама програма. Як я розумію, обидва вирішують, чи компілювати програму як C або як C ++ на основі розширення імені файлу. Обидва здатні зв’язуватися зі стандартною бібліотекою C ++, але за замовчуванням це робить лише g ++. Отже, якщо у вас є програма, написана на C ++, яка не потребує посилання на стандартну бібліотеку, gcc буде робити все правильно; але тоді, так би г ++. Тож насправді немає причин не використовувати g ++ для загальної розробки C ++.


12

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

  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" таким чином:

    $ 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 

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

Висновки:

  1. Якщо поглянути на дерево процесів, то здається, що gcc і g ++ є допоміжним інструментом для інших інструментів, які в моєму середовищі: допоміжними файлами cc1plus.exe, cc1.exe, collection2.exe, as.exe, ld.exe

  2. gcc чудово працює як metatool, якщо у вас правильне розширення або встановлено правильні прапорці -std -x. Дивіться це


9

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

Коли йдеться про компіляцію C ++, звичайно називати компілятор "G ++". Оскільки є лише один компілятор, його також точно називати "GCC", незалежно від мовного контексту; однак термін "G ++" є більш корисним, коли акцент робиться на складанні програм C ++.

Більше ви можете прочитати тут .


0

Я тестував 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 ++ є кращим варіантом.


Вам потрібно виконати дві роботи: 1. вибрати мову 2. вибрати деяку бібліотеку suhch як libstdc ++
PersianGulf

-1

gcc і g ++ - компілятор GNU. Вони обидва компілюють c і c ++. Різниця полягає у файлах * .c gcc трактує це як програму змінного струму, а g ++ сприймає це як програму ac ++. * .cpp файли вважаються програмами c ++. c ++ - це супер набір c, а синтаксис - більш суворий, тому будьте уважні до суфіксу.


1
C ++ - це інша мова, а не суворий набір C, тому компіляція з неправильною цільовою мовою може призвести до несподіваних результатів. Також зауважте, що g++також буде інтерпретуватись .ccяк розширення назви файлів, призначених лише для C ++.
підкреслити_13
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.