Что такое gcc в linux
Компилятор GCC - это инструмент, который фактически является сборкой компиляторов для программ, написанных на различных языках программирования. Создан он был давно и активно используется разработчиками по всему миру.
Изначально идея GCC заключалась в создании единого пакета программного обеспечения под одной лицензией, которая не позволяла присвоить кому-либо эксклюзивные права на владение данным ПО. Сейчас же данный компилятор используется в качестве стандартного решения для операционных систем семейства Unix и позволяет компилировать программы, написанные на C++, Objective-C, Java, Фортран, Ada и Go.
Если вы впервые сталкиваетесь с этим инструментом, то установка компилятора GCC и его настройка может вызвать определенные трудности. И чтобы они не возникли, далее мы рассмотрим эти процессы подробнее.
Установка компилятора GCC
Чтобы установка компилятора GCC на Ubuntu или любую другую Unix-систему прошла успешно, выполните простую последовательность действий:
- Убедитесь, что ваша система поддерживается нужной вам версией компилятора.
- Скачайте необходимую версию компилятора с официального репозитория.
- Распакуйте и установите выбранную версию компилятора GCC для вашей операционной системы.
- Выполните установку дополнительных компонентов компилятора.
- Настройте GCC в соответствии с вашими требованиями и под вашу операционную систему.
После этого можно считать, что компилятор GCC на Linux установлен. Как уже упоминалось выше, последний этап (настройка) может вызвать сложности, поэтому давайте рассмотрим его подробнее.
GCC-компиляция на Linux: параметры настройки
Конечно, программисту совершенно необязательно знать все доступные опции компилятора GCC, ведь их довольно-таки много. Тем не менее, наиболее часто используемый список под рукой никогда не помешает, ведь данный инструмент позволяет управлять процессом компиляции практически на любом этапе.
В целом параметры компиляции GCC условно можно разделить на две группы. Первая - это так называемые общие настройки, к которым можно отнести:
- @file, где file - нужное имя файла. Выполняет считывание опций из выбранного файла.
- -x language, где language - нужный язык программирования. Принудительно устанавливает выбранный язык программирования.
- -o file - вывод результатов работы.
- -c - прервать работу после компиляции.
- -E - прервать работу после препроцессинга.
- -S - прервать работу после компиляции, но в результате будет выведен код на Ассемблере.
- -v - напечатать команды, которые выполняет компилятор, а также указать его версию.
- --help - вывести основную справку компилятора.
Ко второй группе опций компиляции можно отнести настройки оптимизации, такие как:
- -fno-defer-pop - убрать аргументы из стека функции сразу после выполнения самой функции.
- -fforward-propagate - по возможности упрощать пары инструкций.
- -fauto-inc-dec - если инструкции инкремента и деинкремента отсутствуют, то использовать машинные инструкции.
- -fbranch-count-reg- не использовать инструкции, которые одновременно используют инкремент и деинкремент. Вместо этого - генерировать последовательность инструкций, которые будут выполнять необходимые действия.
- -fcombine-stack-adjustments - оптимизация операций с текстом.
- -fcompare-elim - по возможности избегать инструкций, которые обращаются к флагам процессора.
Теперь вы имеете представление о том, для чего используется GCC-компиляция на Linux и других Unix-системах, а также какие у нее существуют параметры настройки. Для более быстрой компиляции, мы рекомендует заказать выделенный сервер с мощными ресурсами. Остались вопросы? Вы можете задать их специалисту техподдержки RigWEB и получить ответ в течение всего 30 минут.
Создавайте оригинальные программные решения для своих сайтов и пользуйтесь профессиональным хостингом для их размещения в интернете!
Несмотря на то, что на момент написания этой статьи уже появилась версия GCC 3.3.2, речь однако пойдет о версии 2.96. Именно эта версия установлена на моем стареньком Red Hat 7.1 и меня совершенно не втыкает выкачивать около 30 МБ (если не ошибаюсь, именно столько весит архив GCC 3.3.2), т. к. 2.96 меня пока что полностью устраивает. Я просмотрел список изменений и дополнений, прошедших с версии 2.96 и не заметил ни чего существенного, чтобы могло бы повлиять на ход этой статьи. Но в качестве домашнего задания, я оставляю тебе проверить все сказанное здесь для других версий компилятора и сообщить о результатах мне.
Подопытная крыса
Создадим простейшую тестовую программку на С++ и сохраним ее под именем hello.cpp:
Выполним сначала компиляцию с помощью g++:
g++ -o hello hello.cpp
Все проходит без ошибок, в текущей директории образуется выполняемый файл hello. Теперь попробуем произвести компиляцию этой же программы с помощью gcc:
gcc -o hello hello.cpp
Компиляция не проходит, на экран вываливаются ошибки вроде тех, что показаны на скриншоте (см. рис. 1).
Рис.1. gcc отказывается компилить CPP-программу
Между тем gcc отлично справляется с любой Си-прогой. Так, значит, gcc не понимает программ на C++, а только Си-программы? Значит g++ и gcc два разных компилятора? Зачем же я тогда завел весь этот разговор? Подожди, подожди, давай обратимся к man.
Если ты не умеешь читать
Если ты так ничего и не понял
Рис.2. Вот они настоящие компиляторы!
Но почему gcc отказался компилировать программу на C++? Дело в том, что gcc по умолчанию подключает к программе стандартную библиотеку языка C: libc, а g++ стандартную библиотеку языка C++: lstdc++. Таким образом, перед компиляцией программы на языке С++ достаточно принудительно указать gcc библиотеку lstdc++ и он откомпилирует программу не хуже g++. Т. е. для того чтобы gcc скомпилил нашу программу hello.cpp достаточно указать в командной строке следующее: gcc -o hello hello.cpp -lstdc++.
Сравнение работы gcc и g++
Чтобы сравнить выходные данные gcc и g++, я сохранил результаты вывода в текстовые файлы:
gcc и g++ по косточкам
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.96/specs
gcc version 2.96 20000731 (Red Hat Linux 7.1 2.96-81)
Эти строки говорят о том, что происходит чтение файла specs, на основании которого будет строиться дальнейшая компиляция, а также показывается номер версии компилятора gcc. Еще раз отмечаю: gcc и g++ выводят совершенно идентичную информацию!
/usr/lib/gcc-lib/i386-redhat-linux/2.96/cpp0 -lang-c++ -D__GNUG__=2 -D__EXCEPTIONS -v -D__GNUC__=2 -D__GNUC_MINOR__=96 -D__GNUC_PATCHLEVEL__=0 -D__ELF__ -Dunix -Dlinux -D__ELF__ -D__unix__ -D__linux__ -D__unix -D__linux -Asystem(posix) -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -D__tune_i386__ hello.cpp /tmp/cczEKZcb.ii
GNU CPP version 2.96 20000731 (Red Hat Linux 7.1 2.96-81) (cpplib) (i386 Linux/ELF)
ignoring nonexistent directory "/usr/local/include"
ignoring nonexistent directory "/usr/i386-redhat-linux/include"
End of search list.
Здесь мы видим, что препроцессор ищет необходимые include-файлы, указанные в двойных кавычках - в текущей директории, а заключенные в угловые скобки - по указанным трем путям.
/usr/lib/gcc-lib/i386-redhat-linux/2.96/cc1plus /tmp/cczEKZcb.ii -quiet -dumpbase hello.cpp -version -o /tmp/ccw4l1Ud.s
GNU C++ version 2.96 20000731 (Red Hat Linux 7.1 2.96-81) (i386-redhat-linux) compiled by GNU C version 2.96 20000731 (Red Hat Linux 7.1 2.96-81).
Теперь в работу вступает компилятор С++: cc1plus, который на основании файла /tmp/cczEKZcb.ii, полученного на этапе препроцессирования, создает исходник на ассемблере /tmp/ccw4l1Ud.s.
as -V -Qy -o /tmp/cc5T4w7y.o /tmp/ccw4l1Ud.s
GNU assembler version 2.10.91 (i386-redhat-linux) using BFD version 2.10.91.0.2
Далее наступает этап ассемблирования, для чего вызывается стандартный ассемблер as, который создает объектный файл /tmp/cc5T4w7y.o.
/usr/lib/gcc-lib/i386-redhat-linux/2.96/collect2 -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o hello /usr/lib/gcc-lib/i386-redhat-linux/2.96/../../../crt1.o /usr/lib/gcc-lib/i386-redhat-linux/2.96/../../../crti.o /usr/lib/gcc-lib/i386-redhat-linux/2.96/crtbegin.o -L/usr/lib/gcc-lib/i386-redhat-linux/2.96 -L/usr/lib/gcc-lib/i386-redhat-linux/2.96/../../.. /tmp/cc5T4w7y.o -lstdc++ -lgcc -lc -lgcc /usr/lib/gcc-lib/i386-redhat-linux/2.96/crtend.o /usr/lib/gcc-lib/i386-redhat-linux/2.96/../../../crtn.o
Ну и какие выводы?
История GCC
Особенность G++
1.1 Установка
В чем разница между gcc и g ++?
Миф 1: gcc может компилировать только код c, а g ++ может компилировать только код c ++. Оба варианта возможны, но, пожалуйста, обратите внимание:
- Суффикс: .c, gcc рассматривает его как программу на C, а g ++ как программу на C ++;
- Суффикс - .cpp, оба будут рассматриваться как программы на C ++, правила грамматики C ++ более строгие.
- На этапе компиляции g ++ вызовет gcc. Для кода c ++ эти два эквивалента, но поскольку команда gcc не может автоматически связываться с библиотекой, используемой программой C ++, для завершения ссылки обычно используется g ++. Для объединения просто скомпилируйте / скомпонуйте все С g ++ это создает иллюзию, что программы на cpp могут использовать только g ++.
- Фактически этот макрос указывает только на то, что компилятор будет интерпретировать код в синтаксисе C или C ++.
- Как упоминалось выше, если используется суффикс .c и используется компилятор gcc, макрос не определен, в противном случае он уже определен.
- Строго говоря, это предложение не является неправильным, но оно вводит в заблуждение концепцию, следует сказать: компиляция может использовать gcc / g ++, а ссылка может использовать g++ или gcc -lstdc++ 。
- Команда gcc не может автоматически связываться с библиотеками, используемыми программами C ++, поэтому для завершения ссылки обычно используется g ++. Но на этапе компиляции g ++ автоматически вызовет gcc, оба эквивалента
Рабочий процесс 1.2 gcc
- Предварительная обработка исходной программы на языке C для генерации .i файл.
- Расширение заголовочного файла
- Замена макроса
- define NUM 10
- int a = NUM
- Комментарий удален
- xxx.c -> xxx.i
- gcc -E xxx.c -o xxx.i
- Предварительно обработанный файл .i компилируется на ассемблере и генерируется .s файл.
- xxx.i -> xxx.s (получить файл сборки)
- gcc -S xxx.i -o xxx.s
- Сборка файлов на ассемблере для создания объектных файлов .o файл.
- xxx.s -> xxx.o (двоичный файл)
- gcc -c xxx.s -o xxx.o
- Различные модули .o Файлы связаны для создания исполняемого файла программы.
- xxx.o -> исполняемая программа (двоичная)
- gcc xxx.o -o xxx
1,3 gcc общие параметры параметров
Параметр -D Сценарий использования: используется при отладке программы, открывает вывод журнала через макрос, указанный в -D
По умолчанию седьмая строка кода не выводится. Если вы хотите вывести это предложение, вы можете использовать -D
Параметр - на оптимизаторе есть 4 уровня
n Диапазон значений: 0-3
O0 -> не оптимизировано, O1 -> уровень по умолчанию, O3 -> самый высокий уровень
Простейший пример:Параметр -std, указать спецификацию компилятора
c самым ранним стандартом: c89
c99 начал поддерживать текущие привычки письмаБольшинство программ в Linux написаны на C или С++, и если вы хотите собирать их из исходников, то вам обязательно понадобиться компилятор, также он понадобиться, если захотите начать писать свои программы на одном из этих языков.
Существует два основных компилятора в Linux - это GCC и Clang, они похожи по своим возможностям, но так сложилось, что первый считается стандартом для Ubuntu. GCC расшифровывается как GNU Compiler Collection. В этой статье мы рассмотрим, как выполняется установка GCC в Ubuntu, а также рассмотрим базовые приемы работы с этим набором программ в терминале.
Набор компиляторов GCC
Все программы представляют собой набор машинных команд, которые выполняются процессором. Эти команды - последовательность бит. Но писать программы наборами бит очень неудобно, поэтому были придуманы языки программирования высокого уровня. Код на языке программирования хорошо читаем и понятен для человека, а когда из него нужно сделать программу, компилятор ubuntu преобразует все в машинные команды.
В базовую поставку компилятора входят такие программы:
- libc6-dev - заголовочные файлы стандартной библиотеки Си;
- libstdc++6-dev - заголовочные файлы стандартной библиотеки С++;
- gcc - компилятор языка программирования Си;
- g++ - компилятор языка программирования C++;
- make - утилита для организации сборки нескольких файлов;
- dpkg-dev - инструменты сборки пакетов deb.
Все эти пакеты являются зависимостями пакета build-essential, поэтому для установки всего необходимого достаточно установить этот пакет.
Установка GCC в Ubuntu
Если вас устраивает текущая версия GCC, которая есть в официальных репозиториях дистрибутива, то вам достаточно установить пакет build-essential. Для этого выполните команду:
sudo apt -y install build-essential
После завершения установки все необходимое для компиляции программ будет установлено. И вы сможете использовать компилятор. Рассмотрим версии и расположение файлов компилятора:
whereis gcc make
Если необходима более новая версия компилятора, например, на данный момент последняя версия - 11, то можно использовать PPA разработчиков с тестовыми сборками. Для добавления PPA в систему выполните команды:
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test && sudo apt update
Далее установите сам компилятор:
sudo apt -y install gcc-snapshot && sudo apt -y install gcc-11g++-11
Это не заменит ваш текущий компилятор на новый. В системе просто появятся 2 версии компиляторов gcc-11 и g++11, которые вы можете использовать для своих программ. Это лучший вариант на данный момент, но если вы хотите все же сделать gcc-9 компилятором по умолчанию, выполните:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 60 --slave /usr/bin/g++ g++ /usr/bin/g++-9
Готово, теперь вы можете проверить версию gcc-6:
Установка GCC в Ubuntu завершена, и можно переходить к сборке программ. Для удаления компилятора достаточно удалить пакет build-essential при помощи команды:
sudo apt purge -y build-essential && sudo apt-y autoremove
Использование GCC в Ubuntu
Рассмотрим пример компиляции минимальной программы hello.c для освоения работы с gcc. Вот код программы, откройте любой текстовый редактор и сохраните его в файле с названием hello.c:
Теперь запустим сборку программы:
Когда сборка программы будет завершена, на выходе появится файл с названием a.out. a.out –это имя исполняемого файла, которое по умолчанию, сгенерировано при помощи gcc. Далее можно запустить данный файл:
Готово, компилятор прекрасно работает в системе, и теперь можно писать свои программы или собирать чужие.
Выводы
В этой статье мы рассмотрели, как установить gcc в Ubuntu 20.04, это один из самых популярных компиляторов для этой операционной системы. И устанавливается он очень просто, если у вас остались вопросы, спрашивайте в комментариях!
На завершение видео с демонстрацией самого процесса:
Читайте также: