Компіляція програми C ++ за допомогою gcc


84

Питання: Як скомпілювати програму 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 ++. Дякую,


Відповіді:


136

gcc насправді може просто скомпілювати код на C ++. Отримані помилки - це помилки компонувальника , а не помилки компілятора.

Шанси на те, що якщо ви зміните рядок компіляції таким:

gcc info.C -lstdc++

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

Однак вам слід просто полегшити своє життя та використовувати g ++.


РЕДАГУВАТИ:

Руп говорить це найкраще у своєму коментарі до іншої відповіді:

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


41

Якщо ви надаєте коду розширення .c, компілятор вважає, що це код C, а не C ++. А драйвер компілятора C ++ називається g ++, якщо ви використовуєте драйвер gcc, у вас виникнуть проблеми з компонуванням, оскільки стандартні бібліотеки C ++ за замовчуванням не будуть пов'язані. Отже, ви хочете:

g++ myprog.cpp

І навіть не розглядайте можливість використання розширення .C у верхньому регістрі, якщо ви ніколи не хочете переносити свій код і готові ненавидіти тих, з ким ви працюєте.


@Neil: з того, що я можу сказати, gcc вважає розширення .C(capital) розширенням c ++. Наступне працює чудово: gcc test.C -lstdc++ -o testабо g++ test.C -o test.
Еван Теран

3
@Evan Так, звичайно, так. Це не означає, що вам слід коли-небудь використовувати його, оскільки це спричинить страшні проблеми з портативністю, як і всі назви файлів, чутливих до регістру. Розширення для файлів C ++ завжди має бути .cpp. Це не викликає проблем, і гарантовано працюватиме у всіх типових операційних системах.


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 - це інтерфейс, який вибирає правильний компілятор.


1

У мене це добре працювало. Лише один рядок у cmd.

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

У cmd для типу gcc:

gcc --версія

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

g ++ --версія

Якщо він встановлений, продовжуйте.

Тепер скомпілюйте .c або .cpp за допомогою cmd

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

gcc -o exe_файлфайл yourfilename.c

Приклад:

gcc -o myfile myfile.c

Тут exe_filename (в прикладі myfile) - це ім'я вашого файлу .exe, який ви хочете створити після компіляції (Примітка: я не додав сюди жодного розширення). А yourfilename.c (наприклад, myfile.c) - це ваш вихідний файл із розширенням .c.

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

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

g ++ -o exe_файлфайл yourfilename.cpp

Після цього процес такий самий, як і для .c.


2
Питання було "Як скомпілювати програму C ++ за допомогою компілятора gcc?" не "Як скомпілювати програму С на компіляторі gcc? або Як скомпілювати програму С ++ на компіляторі g ++?"
DevX

Хороший улов! @DevX
Раджкумар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.