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

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

g ++ => компилятор C++ gcc => компилятор c

Nagappa 20.05.2020 19:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
950
1
495 791
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Ответ принят как подходящий

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? Разве нам не следует иметь только один двоичный файл и одну символическую ссылку (или что-то в этом роде)?

UchihaItachi 17.07.2019 17:32

@Uchihaltachi эти файлы являются жесткими ссылками, и при загрузке они проверяют argv[0], чтобы увидеть, какой вызов следует использовать. Это довольно распространено среди основных утилит UNIX.

user836218 12.11.2019 21:55

Где в документации написано, что g++ is equivalent to gcc -xc++ -lstdc++ -shared-libgcc? Он говорит только о том, что обрабатывает .c, .h и .i как C++ и автоматически связывает libstdC++. Если отправленная команда была правильной, файл .txt с допустимым кодом C++ компилируется, но вместо этого возвращает ошибку неподдерживаемого формата файла.

s d 14.09.2020 06:37

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

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

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

+1 Также моя страница руководства GNU / Linux gcc говорит: «Когда вы компилируете программы на C++, вы должны вместо этого вызывать GCC как g ++».

Elliptical view 23.10.2018 03:54

Одно заметное отличие состоит в том, что если вы передадите файл .c в gcc, он будет компилироваться как C.

По умолчанию g ++ обрабатывает файлы .c как C++ (если не указан -x c).

(Поздно, но для потомков). Как указывали другие ответы, это ни в коем случае не «единственное заметное различие», если у читателя нет искаженного определения значимости.

underscore_d 14.09.2015 00:54

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

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

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

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

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

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

  1. gcc скомпилирует: файлы *.c\*.cpp как C и C++ соответственно.
  2. g++ скомпилирует: файлы *.c\*.cpp, но все они будут обрабатываться как файлы C++.
  3. Также, если вы используете g++ для связывания объектных файлов, он автоматически подключается к стандартным библиотекам 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

Вы можете связать библиотеку std C++ в gcc, передав параметр -lstdc++.

Denilson Sá Maia 23.08.2010 04:13

Между 'gcc' и 'g ++' больше различий, чем только стандартными библиотеками, поэтому gcc -lstdc++ все равно не даст вам того же поведения, что и g++. Мы помещаем все это зависящее от языка поведение в отдельный драйвер по какой-то причине, для этого он существует. :-)

Ti Strga 29.01.2013 01:03

Мой комментарий не говорит о простом связывании ... в этом суть. Даже просто ограничив обсуждение связью (чего не было в вашем ответе), пользователь по-прежнему не сможет использовать всю стандартную библиотеку C++, указав только -lstdc++, поскольку будут отсутствовать зависимости от математики, RTTI и информации об исключениях. Будет ли данный тестовый пример связывать или нет, будет зависеть от операционной системы и от того, какие функции C++ используются в тестовом примере, и опять же, именно поэтому все эти знания встроены в драйвер g ++, а не оставляются на усмотрение пользователя для выяснения. .

Ti Strga 29.01.2013 19:38

Поверьте мне, мы часто обсуждаем это, обычно когда пользователь Linux пытается переместить свой неполный Makefile на другую платформу. :-) Этап связывания g ++ делает намного больше, чем gcc -lstdc++ в других операционных системах, особенно когда целью является встроенная платформа. К счастью, именно поэтому мы в первую очередь отправляем g ++.

Ti Strga 29.01.2013 19:40

Строки спецификации построены так, чтобы быть специфичными для компилятора, которые, в свою очередь, специфичны для операционной системы и цели. Поэтому, если вы запустите -dumpspec (например) на кросс-компиляторе, ориентированном на встроенную систему, вы увидите различия. Есть больше, чем просто отличия компоновщика ... что опять же, о чем был ваш ответ (макросы препроцессора, пути включения, несколько библиотек времени выполнения). Кажется, мы разговариваем друг с другом, но, как бывший сопровождающий GCC, уверяю вас, я знаком с интерфейсами, а что нет.

Ti Strga 29.01.2013 21:02

Итак, когда в данном приложении используется сочетание кода C и C++, мне кажется, что для компиляции код C должен идти в gcc, а C++ в g ++. Но когда дело доходит до связывания (будь то dll или исполняемый файл приложения), рекомендуется использовать g ++. Я правильно понял?

venkrao 25.12.2014 09:38

Также gcc может просто не работать с некоторыми файлами cpp, в то время как g ++ работает с ними без каких-либо проблем .. Даже после использования флага -x для gcc, чтобы указать ему, что это режим cpp, который я хочу. Я только что наткнулся на это и был очень удивлен. Опять же, это происходит из-за постоянного использования внешних интерфейсов для компиляции. XD

rbaleksandar 28.07.2015 01:48

«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++.

underscore_d 14.09.2015 00:51

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

  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.exe, collect2.exe, as.exe, ld.exe

  2. 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 as gcc

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

... use of gcc does 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, or machine-gcc when cross-compiling, or machine-gcc-version to run a specific version of GCC. When you compile C++ programs, you should invoke GCC as g++ 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++.

PersianGulf 18.03.2017 18:57

Другие вопросы по теме