What is gcc compiler in linux

What is gcc compiler in linux

GNU Compiler Collection (обычно используется сокращение GCC) — набор компиляторов для различных свободным программным обеспечением , распространяется GNU GPL и Mac OS X .

Изначально названный GNU C Compiler, он поддерживал только язык Objective-C ,

Обзор [ ]

Начало GCC было положено Шаблон:Lang-en ) и Р. Столлмэном, [1] и выпущен в 1987 [2] как компилятор для проекта GNU, который сам по себе являлся свободным программным обеспечением. Разработка GCC курируется [3]

В настоящее время GCC поддерживается группой программистов со всего мира. GCC является лидером по количеству процессоров и операционных систем, которые он поддерживает.

Будучи официальным компилятором системы GNU, включая варианты системы, построенные на ядре Linux ( Mac OS X , NeXTSTEP и Языки [ ]

Front end для CHILL был добавлен ранее, но из-за недостаточной поддержки был исключен из набора. До релиза версии 4.0 front-end’ом для Fortran был G77, который поддерживал лишь D , Modula-2 , Modula-3, Архитектуры [ ]

Список поддерживаемых GCC (для версии 4.1) процессоров включает в себя:

  • IA-32 ( IA-64 в том числе и « SPARC
  • A29K , ARC , FR-30 , MCORE , Stormy16 , Z8000 , поддерживаются версиями GCC, поддержкой которых занимаются сторонние организации (не FSF).

Структура [ ]

Внешний интерфейс GCC является стандартом для компиляторов на платформе Unix. Пользователь вызывает управляющую программу, которая называется gcc. Она интерпретирует аргументы командной строки, определяет и запускает для каждого входного файла свои компиляторы нужного языка, запускает, если необходимо, ассемблер и языке ассемблера. Все компиляторы имеют общую внутреннюю структуру: front end, который производит абстрактное синтаксическое дерево , и back end, который конвертирует дерево в Register Transfer Language (RTL), выполняет различные оптимизации, затем порождает программу на языке ассемблера, используя архитектурно-зависимое сопоставление с образцом . GCC почти полностью написан на Отладка программ, скомпилированных с помощью GCC [ ]

  1. ↑↑ Tower, Leonard (1987) «GNU C compiler beta test release,» comp.lang.misc USENET newsgroup; see also http://gcc.gnu.org/releases.html#timeline
  2. ↑ Stallman, Richard M. (2001) «Contributors to GCC,» in Using and Porting the GNU Compiler Collection (GCC) for gcc version 2.95 (Cambridge, Mass.: Free Software Foundation)
  • Домашняя страница GCC
  • Руководство по GCC версии 4.1
  • Руководство по GCC версии 4.0
  • Руководство по GCC версии 3.4.6
  • Building and Testing gcc/glibc cross toolchains
  • GCC Wiki
  • GCC Forum — hosted by Nabble archiving all gcc mailing lists into a searchable forum.
  • From Source to Binary: The Inner Workings of GCC Overview and explanation of gcc’s internal structure in Red Hat Magazine
  • GCC for MVS 3.8, MVS/XA, OS/390 (z/OS)
  • Dev-C++ — интегрированная среда, включающая в себя компилятор MinGW

Источник

Unix как IDE: Компиляция

Под Unix существует множество компиляторов и интерпретаторов, но здесь мы будем обсуждать лишь gcc как средство компиляции C-кода, и коротко коснемся использования perl в качестве примера интерпретатора.

GCC

GCC — это набор компиляторов, обладающий очень почтенным возрастом и распространяемый под лицензией GPL. Он известен как инструмент работы с программами на C и C++. Свободная лицензия и повсеместная распространенность на Unix-подобных системах стали залогом его неизменной популярности, хотя есть и более современные альтернативы, использующие инфраструктуру LLVM, такие как Clang.

Основной исполняемый файл gcc лучше представлять не как компилятор в привычном понимании, а слой абстракции над множеством отдельных инструментов программирования, выполняющих парсинг кода, компиляцию, линковку и другие действия. Это значит, что с его помощью можно не просто получить работающий бинарник из кода на C, но детально исследовать все шаги этого сложного процесса, и при необходимости подстроить его под свои нужды.

Здесь я не буду обсуждать использование make-файлов, хотя они наверняка понадобятся для любого проекта сложнее, чем в один файл. Make-файлов я коснусь в следующей статье о средствах автоматизации сборки.

Компиляция и сборка объектного кода

Объектный код компилируется вот такой командой:

$ gcc -c example.c -o example.o 

Если код верен, будет создан нелинкованный двоичный объектный файл под именем example.o в текущей папке, или выведены сообщения о проблемах. Заглянуть внутрь полученного файла и увидеть его содержимое на языке ассемблера можно так:

Как вариант, можно попросить gcc сразу показать итоговый ассемблерный код при помощи параметра -S:

$ gcc -c -S example.c -o example.s 

Вывод ассемблерного кода может быть полезно совместить с выводом самого исходника, чего можно добиться, набрав:

$ gcc -c -g -Wa,-a,-ad example.c > example.lst 

Препроцессор

Препроцессор C (cpp) обычно используется для подключения заголовочных файлов и определения макросов. Это стандартная часть процесса компиляции gcc, но можно просмотреть генерируемый им код, вызвав cpp напрямую:

Исходный код будет выведен в конечном виде, готовым к компиляции, с замененными макросами и подстановкой включаемых внешних файлов.

Связывание объектов

Один или несколько объектных файлов могут быть связаны в соответствующий исполняемый файл:

В этом примере gcc просто вызывает ld, линковщик GNU. Команда создаст исполняемый файл по имени example .

Компиляция, сборка и связывание

Все вышеперечисленное может быть выполнено в один шаг при помощи команды:

Этот способ проще, но компиляция объектов по отдельности дает некоторый выигрыш в производительности: не нужно компилировать не изменявшийся код, но об этом мы поговорим в следующей статье.

Включение внешних файлов и связывание

Файлы C и заголовочные файлы могу быть явно включены в компиляцию при помощи параметра -l:

$ gcc -I/usr/include/somelib.h example.c -o example 

Аналогично, если код нужно динамически связать с уже скомпилированной системной библиотекой, доступной в одной из системных папок ( /lib или /usr/lib ), например, ncurses, этого можно добиться использованием ключа -l:

$ gcc -lncurses example.c -o example 

Если в процессе компиляции внешних связей много, имеет смысл внести их в переменные окружения:

$ export CFLAGS=-I/usr/include/somelib.h $ export CLIBS=-lncurses $ gcc $CFLAGS $CLIBS example.c -o example 

Кстати, Makefile затем и создан, чтобы избавить нас от беспокойства о таких мелочах.

План компиляции

Чтобы посмотреть подробности внутренней кухни gcc, можно добавить ключ -v, и план компиляции будет выведен в стандартный поток вывода ошибок:

$ gcc -v -c example.c -o example.o 

Если нет нужды генерировать объектные или исполняемые файлы, то для аккуратности можно использовать -###:

$ gcc -### -c example.c -o example.o 

Очень полезно посмотреть, какие действия gcc предпринимает без нашего ведома, кроме того, так мы можем выявить нежелательные шаги при компиляции.

Расширенный вывод сообщений об ошибках

Существует возможность добавить ключи -Wall и/или -pedantic, чтобы gcc предупреждал нас о случаях, которые не обязательно являются ошибками, но могут ими быть:

$ gcc -Wall -pedantic -c example.c -o example.o 

Удобно включать такие опции в Makefile или в определении makeprg для Vim, так как они отлично сочетаются с окном quickfix, и помогают писать читабельный, совместимый и безошибочный код.

Профилирование процесса компиляции

Вы можете включить опцию -time, чтобы gcc отображал в тексте вывода время выполения каждого из шагов:

$ gcc -time -c example.c -o example.o 

Оптимизация

Gcc имеет ключи оптимизации, указав которые можно попросить его создавать более эффективный объектный код и связанные бинарники за счет увеличения времени компиляции. Я считаю -O2 золотой серединой для выпускаемого кода:

Подобно любой команде Bash, все это можно вызывать прямо из Vim:

Интерпретаторы

Подход к интерпретируемому коду в Unix-системах иной. В своих примерах я буду использовать Perl, но те же принципы применимы для кода, например, на Python или Ruby.

Inline-код

Можно строку Perl-кода прямо на исполнение интерпретатору любым из перечисленных ниже способов Первый, наверное, самый простой и общеупотребительный способ работы с Perl; второй использует синтаксис heredoc, а третий — это классический конвейер Unix.

$ perl -e 'print "Hello world.\n";' $ perl  

Конечно, в будничной жизни мы храним код в файле, который можно вызвать прямо вот так:

Можно проверить синтаксис кода без его выполнения с помощью ключа -c:

Порой хочется использовать скрипт подобно любому исполняемому бинарнику, не беспокоясь о том, что он из себя представляет. Для этого в скрипт добавляют первой строкой так называемый "shebang", указывающий путь к интерпретатору, которому следует передать на исполнение данный файл.

#!/usr/bin/env perl print "Hello, world.\n"; 

Скрипту после этого можно ставить атрибут исполняемого файла вызовом chmod. Также хорошим тоном считается переименовать файл, убрав расширения, поскольку он теперь считается почти настоящим исполняемым файлом:

Затем файл можно вызывать напрямую, без указания интерпретатора:

Вся эта кухня так здорово работает, что многие стандартные утилиты Linux-систем, такие как adduser, в действительности являются скриптами на Perl или Python.

В следующей публикации я расскажу о методах работы с make для сборки проектов, сравнимых с привычными IDE.

Продолжение следует.

Источник

GCC, the GNU Compiler Collection

We strive to provide regular, high quality releases, which we want to work well on a variety of native and cross targets (including GNU/Linux), and encourage everyone to contribute changes or help testing GCC. Our sources are readily and freely available via Git and weekly snapshots.

Major decisions about GCC are made by the steering committee, guided by the mission statement.

News

GCC 10.5 released [2023-07-07] GCC Code of Conduct adopted [2023-06-16] GCC 11.4 released [2023-05-29] GCC 12.3 released [2023-05-08] GCC 13.1 released [2023-04-26] GCC BPF in Compiler Explorer [2022-12-23] Support for a nightly build of the bpf-unknown-none-gcc compiler has been contributed to Compiler Explorer (aka godbolt.org) by Marc Poulhiès Modula-2 front end added [2022-12-14] The Modula-2 programming language front end has been added to GCC. This front end was contributed by Gaius Mulley. GNU Tools Cauldron 2022 [2022-09-02] Prague, Czech Republic and online, September 16-18 2022 GCC 12.2 released [2022-08-19] GCC 10.4 released [2022-06-28] GCC 9.5 released [2022-05-27] GCC 12.1 released [2022-05-06] GCC 11.3 released [2022-04-21]

Supported Releases

Get our announcements

For questions related to the use of GCC, please consult these web pages and the GCC manuals. If that fails, the gcc-help@gcc.gnu.org mailing list might help. Comments on these web pages and the development of GCC are welcome on our developer list at gcc@gcc.gnu.org. All of our lists have public archives.

Copyright (C) Free Software Foundation, Inc. Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.

These pages are maintained by the GCC team. Last modified 2023-07-07.

Источник

Читайте также:  Run linux and windows on mac os x
Оцените статью
Adblock
detector