# lilo
Теперь перезагрузите систему и попробуйте загрузиться с новым ядром. При появлении каких-либо ошибок вы всегда сможете загрузить старую версию.
Глава 21
Создаем консольное приложение
21.1. Компилятор gcc
В 8 главе вы познакомились с языком командного интерпретатора и убедились, что на нем можно писать полезные сценарии. Но если вы раньше программировали под Windows, то интерпретатора вам маловато будет — понадобятся более мощные средства разработки. Разумеется, они в ОС Linux есть.
Основным C-компилятором в Linux служит gcc (GNU С Compiler). Если вы не установили средства разработки при установке дистрибутива, самое время сделать это сейчас. Запустите менеджер пакетов (рис. 21.1) и установите следующие пакеты:
♦ gcc — сам компилятор gcc;
♦ gcc-c++ — поддержка С++;
♦ gcc-doc — документация по gcc (очень рекомендую установить);
♦ compat-gcc — пакет, содержащий средства gcc для обратной совместимости. Данный пакет вам нужен, если вы планируете писать программы для более старых систем, чем ваша;
♦ compat-gcc-c++ — то же, что и compat-gcc, только с поддержкой С+ +;
♦ compat-cpp — препроцессор cpp для обратной совместимости;
♦ binutils — набор вспомогательных утилит, о которых мы поговорим в последнем пункте этой главы;
♦ glibc-devel — содержит библиотеки для разработки C-программ;
♦ libbfd — библиотека дескриптора двоичного файла (Binary File Descriptor library);
♦ libstdc++-devel — заголовочные файлы и библиотеки для программирования на С++;
♦ make — утилита, упрощающая процесс сборки больших проектов.
Рис. 21.1. Менеджер пакетов Fedora Core — system-config-packages
21.1.1. Вызов gcc
Формат вызова компилятора такой:
gcc [опции] helloworld.с
Вы написали свою программу на С++? Нет проблем: компиляторы С и С++ являются интегрированными. Чтобы сообщить компилятору, на каком языке вы писали свою программу, нужно указать определенную опцию при вызове компилятора. Но можно поступить проще: по умолчанию компилятор считает, что файлы с расширением .с написаны на языке С, файлы с одним из расширений .C, .cc, .cXX — на языке С++, а файлы с расширением .s — на языке ассемблера.
Как правило, перед компиляцией вызывается программа cpp — препроцессор языка С. Препроцессор создаст файл с расширением .i, если ваша программа написана на языке С. и файл с расширением .ii, если ваша программа написана на С++. Если ваша программа уже прошла препроцессорную подготовку, вы можете передать компилятору gcc файл с расширением .i или .ii и gcc уже не будет вызывать препроцессор для подготовки исходного текста. Как правило, программу cpp редко кто вызывает вручную.
Если не указывать никаких опций, то компилятор создаст в текущем каталоге файл a.out, содержащий исполняемый код. Для тех, кто изучал другой язык, я на всякий случай приведу текст первой программы на С (листинг 21.1).
Листинг 21.1. Файл helloworld.c
#include <stdio.h>
main() {
printf('Hello World!
');
}
А сейчас рассмотрим основные опции компилятора. Обо всех остальных опциях вы сможете узнать по команде man gcc
.
21.1.2. Общие опции
Из общих опций наиболее интересны три: -х, -с и -о.
С помощью опции -х можно указать язык, на котором написан исходный код, например,
gcc -х с helloworld.c
В качестве языка программы вы можете указать:
♦ с, если ваша программа написана на С;
♦ objective_c, если ваша программа написана на Objective С;
♦ c-header, если ваша программа является заголовком С;
♦ C++, если вы написали программу на С++;
♦ assembler, если вы написали программу на ассемблере.
Существуют и другие варианты, но они не столь важны.
Опция -c используется, если вы хотите только откомпилировать вашу программу, но не вызвать компоновщик. В результате будет создан объектный файл с расширением .о
.
Опция -о позволяет указать имя результирующего файла. Это очень полезная опция, потому что имя a.out
мало кого устраивает:
gcc -о helloworld helloworld.c
Очень полезна опция -v, которая выводит различную информацию о стадиях компиляции. Кроме того, эта опция выводит версию компилятора.
21.1.3. Опции языка
Из всех опций языка мне пригодилась лишь опция ANSI, которая выключает все функции GNU С, несовместимые со стандартом ANSI. К таким функциям относятся asm,