Компиляция программы на C++ с помощью gcc
Вопрос: Как скомпилировать программу на 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++. Спасибо,
9 ответов
GCC действительно может скомпилировать код C++ просто отлично. Полученные вами ошибки - это ошибки компоновщика, а не ошибки компилятора.
Скорее всего, если вы измените строку компиляции так:
gcc info.C -lstdc++
что делает его ссылкой на стандартную библиотеку C++, тогда он будет работать просто отлично.
Однако вам следует просто упростить свою жизнь и использовать g ++.
РЕДАКТИРОВАТЬ:
Rup говорит, что лучше всего в своем комментарии к другому ответу:
[...] gcc выберет правильный внутренний компилятор на основе расширения файла (т.е. скомпилирует.c как C и.cc как C++) и по умолчанию связывает двоичные файлы только со стандартными вспомогательными библиотеками C и GCC независимо от того, языки ввода; g++ также выберет правильный бэкэнд, основанный на расширении, за исключением того, что я думаю, что вместо этого он компилирует весь исходный код C как C++ (то есть компилирует и.c, и.cc как C++) и включает libstdC++ в свой шаг ссылки независимо от языков ввода.
Если вы дадите коду расширение.c, компилятор думает, что это код на C, а не на C++. А драйвер компилятора C++ называется g ++, если вы используете драйвер gcc, у вас будут проблемы с компоновщиком, так как стандартные библиотеки C++ не будут связаны по умолчанию. Итак, вы хотите:
g++ myprog.cpp
И даже не рассматривайте возможность использования расширения.C в верхнем регистре, если только вы никогда не захотите переносить свой код и готовы быть ненавидимыми теми, с кем работаете.
По умолчанию gcc выбирает язык на основе расширения файла, но вы можете заставить gcc выбрать другой языковой бэкэнд с опцией -x, таким образом:
gcc -x c++
Дополнительные параметры подробно описаны на странице руководства gcc в разделе "Параметры, управляющие типом вывода". Смотрите, например, http://linux.die.net/man/1/gcc (поиск на странице для текста -x language
).
Эта возможность очень полезна в тех случаях, когда gcc не может угадать язык, используя расширение файла, например, если вы генерируете код и передаете его в gcc через stdin.
Разница между gcc и g++:
gcc | g++
compiles c source | compiles c++ source
используйте g++ вместо gcc для компиляции исходного кода C++.
Если я правильно помню, gcc определяет тип файла по суффиксу. Итак, сделайте это foo.cc, и он должен работать.
И, чтобы ответить на ваш другой вопрос, это разница между "gcc" и "g++". gcc - это интерфейс, который выбирает правильный компилятор.
Обновление с моей версией GCC 10.3.0 на Ubuntu. Даже если я добавлю
-lstdc++
или используйте правильное расширение,
cc1plus
должен быть установлен в системе. В противном случае появляется эта ошибка:
gcc: фатальная ошибка: невозможно выполнить «cc1plus»: execvp: нет такого файла или каталога
Один из способов получить это - установить
g++
даже если вы не собираетесь использовать его напрямую, например
sudo apt install g++
.
Теперь, если я использую расширение, я могу просто звонить напрямую, однако предупреждения и ошибки все еще появляются. Использовать
gcc
чисто, с расширением я должен называть это так:
gcc -x c++ info.c -lstdc++
Короче, если я использую расширение, как принятый ответ:
gcc info.cc -lstdc++
Или, как говорили другие, просто используйте
g++ info.c
вместо. Никаких дополнительных параметров для указания C++ не требуется, и он работает с
.c
,
.cc
а также
.cpp
расширения.
Это хорошо сработало для меня. Всего одна строка кода в cmd.
Сначала убедитесь, что вы установили компилятор gcc (для c) или g ++ (для C++).
В cmd для типа gcc:
gcc - версия
в cmd для типа g ++:
g ++ - версия
Если он установлен, продолжайте.
Теперь скомпилируйте ваш.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.