Компиляция программы на C ++ с помощью gcc

88

Вопрос: Как скомпилировать программу на C ++ с помощью компилятора gcc?

info.c:

#include<iostream>
using std::cout;
using std::endl;
int main()
{
   #ifdef __cplusplus
   cout << "C++ compiler in use and version is " << __cplusplus << endl;
   #endif
   cout <<"Version is " << __STDC_VERSION__ << endl;
   cout << "Hi" << __FILE__ << __LINE__ << endl;
}

и когда я пытаюсь скомпилировать info.c

$ gcc info.C

Undefined                       first referenced
 symbol                             in file
cout                                /var/tmp/ccPxLN2a.o
endl(ostream &)                     /var/tmp/ccPxLN2a.o
ostream::operator<<(ostream &(*)(ostream &))/var/tmp/ccPxLN2a.o
ostream::operator<<(int)            /var/tmp/ccPxLN2a.o
ostream::operator<<(long)           /var/tmp/ccPxLN2a.o
ostream::operator<<(char const *)   /var/tmp/ccPxLN2a.o
ld: fatal: Symbol referencing errors. No output written to a.out
collect2: ld returned 1 exit status

Разве компилятор gcc не способен компилировать программы на C ++? В связи с этим, в чем разница между gcc и g ++. Благодаря,

xyz
источник
Возможный дубликат В чем разница между g ++ и gcc?
underscore_d

Ответы:

138

gcc действительно может отлично компилировать код C ++. Полученные вами ошибки являются ошибками компоновщика , а не компилятора.

Скорее всего, если вы измените строку компиляции на следующую:

gcc info.C -lstdc++

что позволяет связать его со стандартной библиотекой C ++, тогда он будет работать нормально.

Однако вам стоит просто упростить себе жизнь и использовать g ++.


РЕДАКТИРОВАТЬ:

Руп лучше всего говорит об этом в своем комментарии к другому ответу:

[...] gcc выберет правильный серверный компилятор на основе расширения файла (то есть будет компилировать .c как C и .cc как C ++) и связывает двоичные файлы только со стандартными вспомогательными библиотеками C и GCC по умолчанию независимо от языки ввода; g ++ также выберет правильную серверную часть на основе расширения, за исключением того, что я думаю, что вместо этого он компилирует весь исходный код C как C ++ (т.е. он компилирует и .c, и .cc как C ++) и включает libstdc ++ на этапе связывания независимо от языков ввода.

Эван Теран
источник
42

Если вы дадите коду расширение .c, компилятор будет думать, что это код C, а не C ++. А драйвер компилятора C ++ называется g ++, если вы используете драйвер gcc, у вас будут проблемы с компоновщиком, так как стандартные библиотеки C ++ не будут связаны по умолчанию. Итак, вы хотите:

g++ myprog.cpp

И даже не думайте об использовании расширения .C в верхнем регистре, если вы никогда не хотите переносить свой код и готовы к ненависти со стороны тех, с кем вы работаете.


источник
@Neil: насколько я могу судить, gcc действительно считает .C(заглавное) расширение расширением С ++. Следующее работает нормально: gcc test.C -lstdc++ -o testили g++ test.C -o test.
Эван Теран
3
@ Эван Да, конечно. Это не означает, что вы должны когда-либо использовать его, поскольку это вызовет ужасные проблемы с переносимостью, как и все имена файлов с учетом регистра. Расширение для файлов C ++ всегда должно быть .cpp. Это не вызывает проблем и гарантированно работает во всех распространенных операционных системах.
27

использовать g++вместо gcc.

Александр С.
источник
2
Вы можете объяснить почему?
noraj
12

По умолчанию gcc выбирает язык на основе расширения файла, но вы можете заставить gcc выбрать другой язык серверной части с параметром -x, таким образом:

gcc -x c++

Дополнительные параметры подробно описаны на странице руководства gcc в разделе «Параметры, управляющие типом вывода». См., Например, http://linux.die.net/man/1/gcc (поиск по странице по тексту -x language).

Эта возможность очень полезна в случаях, когда gcc не может угадать язык, используя расширение файла, например, если вы генерируете код и передаете его gcc через stdin.

блеяние
источник
11

Разница между gcc и g ++:

     gcc            |        g++
compiles c source   |   compiles c++ source

используйте g ++ вместо gcc для компиляции исходного кода на C ++.

Правин С
источник
16
Это немного сложнее, как и в других ответах здесь. gcc выберет правильный серверный компилятор на основе расширения файла (т.е. будет компилировать .c как C и .cc как C ++) и по умолчанию связывает двоичные файлы только со стандартными вспомогательными библиотеками C и GCC независимо от языков ввода; g ++ также выберет правильную серверную часть на основе расширения, за исключением того, что я думаю, что вместо этого он компилирует весь исходный код C как C ++ (т.е. он компилирует и .c, и .cc как C ++) и включает libstdc ++ на этапе связывания независимо от языков ввода.
Rup
1
@Rup: правильно, это в основном то, что я сказал в своем ответе.
Эван Теран
1

Если я правильно помню, gcc определяет тип файла по суффиксу. Итак, сделайте его foo.cc, и он должен работать.

И, чтобы ответить на ваш другой вопрос, это разница между "gcc" и "g ++". gcc - это интерфейс, который выбирает правильный компилятор.

Бореалид
источник
1

У меня это сработало. Всего одна строка кода в cmd.

Сначала убедитесь, что вы установили компилятор gcc (для c) или g ++ (для c ++).

В cmd для типа gcc:

gcc --version

в cmd для типа g ++:

g ++ --version

Если он установлен, продолжайте.

Теперь скомпилируйте ваш .c или .cpp с помощью cmd

для синтаксиса .c :

gcc -o exe_filename yourfilename.c

Пример:

gcc -o myfile myfile.c

Здесь exe_filename (myfile в примере) - это имя вашего .exe файла, который вы хотите создать после компиляции (Примечание: я не помещал здесь никаких расширений). И yourfilename.c (myfile.c в примере) - это ваш исходный файл с расширением .c.

Теперь перейдите в папку, содержащую ваш файл .c, здесь вы найдете файл с расширением .exe. Просто откройте его. Ура..

Для синтаксиса .cpp :

g ++ -o exe_filename yourfilename.cpp

После этого процесс такой же, как и для .c.

Раджкумар Бансал
источник
2
Возник вопрос: «Как скомпилировать программу на C ++ с помощью компилятора gcc?» а не «Как скомпилировать программу на C с помощью компилятора gcc? или Как скомпилировать программу на C ++ с помощью компилятора g ++?»
DevX
Хорошо поймал! @DevX
Rajkumar Bansal