Как написать приложение для linux

Все действия в операционной системе выполняются с помощью программ, поэтому многим новичкам интересно не только использовать чужие программы, а писать свои. Многие хотят внести свой вклад в кодовую базу OpenSource.

Это обзорная статья про программирование под Linux. Мы рассмотрим какие языки используются чаще всего, рассмотрим основные понятия, а также возможности, разберем как написать простейшую программу на одном из самых популярных языков программирования, как ее вручную собрать и запустить.

1. На чем пишут программы?

Исторически сложилось так, что ядро Unix было написано на языке Си. Даже более того, этот язык был создан для написания ядра Unix. Поскольку ядро Linux было основано на ядре Minix (версии Unix), то оно тоже было написано на Си. Поэтому можно сказать, что основной язык программирования для Linux это Си и С++. Такая тенденция сохранялась на протяжении долгого времени.

А вообще, писать программы для Linux можно почти на любом языке начиная от Java и Python и заканчивая С# и даже Pascal. Для всех языков есть компиляторы и интерпретаторы. Писать программы на С++ сложно, а Си многими уже считается устаревшим, поэтому множество программистов используют другие языки для написания программ. Например, множество системных инструментов написаны на Python или Perl. Большинство программ от команды Linux Mint, установщик Ubuntu и некоторые скрипты apt написаны на Python. Множество скриптов, в том числе простые скрипты оптимизации написаны на Perl. Иногда для скриптов используется Ruby. Это скрипты OpenShift или, например, фреймворк Metasploit. Некоторые разработчики кроссплатформенных программ используют Java. Но основные компоненты системы написаны все же на Си.

Мы не будем рассматривать основы Си в этой статье. Си — сложный язык и вам понадобится прочитать как минимум одну книгу и много практиковаться чтобы его освоить. Мы рассмотрим как писать программы на Си в Linux, как их собирать и запускать.

Зачем учить Си:

2. Библиотеки

Естественно, что если вам необходимо вывести строку или изображение на экран, то вы не будете напрямую обращаться к видеокарте. Вы просто вызовете несколько функций, которые уже реализованы в системе и передадите им данные, которые нужно вывести на экран. Такие функции размещаются в библиотеках. Фактически, библиотеки — это наборы функций, которые используются другими программами. В них находится такой же код, как и в других программах, разница лишь в том, там необязательно присутствие функции инициализации.

Библиотеки делятся на два типа:

  • Статические — они связываются с программой на этапе компиляции, они связываются и после этого все функции библиотеки доступны в программе как родные. Такие библиотеки имеют расширение .a;
  • Динамические — такие библиотеки встречаются намного чаще, они загружены в оперативную память, и связываются с программной динамически. Когда программе нужна какая-либо библиотека, она просто вызывает ее по известному адресу в оперативной памяти. Это позволяет экономить память. Расширение этих библиотек — .so, которое походит от Shared Object.

Таким образом, для любой программы на Си нужно подключать библиотеки, и все программы используют какие-либо библиотеки. Также важно заметить, на каком языке бы вы не надумали писать, в конечном итоге все будет сведено к системным библиотекам Си. Например, вы пишите программу на Python, используете стандартные возможности этого языка, а сам интерпретатор уже является программой на Си/С++, которая использует системные библиотеки для доступа к основным возможностям. Поэтому важно понимать как работают программы на Си. Конечно, есть языки, вроде Go, которые сразу переводятся на ассемблер, но там используются принципы те же, что и здесь. К тому же  системное программирование linux, в основном, это Си или С++.

3. Процесс сборки программы

Перед тем как мы перейдем к практике и создадим свою первую программу, нужно разобрать как происходит процесс сборки, из каких этапов он состоит.

Каждая серьезная программа состоит из множества файлов, это файлы исходников с расширением .c и заголовочные файлы с расширением .h. Такие заголовочные файлы содержат функции, которые импортируются в программу из библиотек или других файлов .с. Перед тем. как компилятор сможет собрать программу и подготовить ее к работе, ему нужно проверить действительно ли все функции реализованы, доступны ли все статические библиотеки и собрать ее в один файл. Поэтому, первым делом выполняется препроцессор, который собирает исходный файл, выполняются такие инструкции, как include для включения кода заголовочных файлов.

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

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

А теперь, давайте рассмотрим весь єтот процесс на практике с использованием компилятора GCC.

4. Как собрать программу

Для сборки программ в Linux используется два типа компиляторов, это Gcc и Clang. Пока что GCC более распространен, поэтому рассматривать мы будем именно его. Обычно, программа уже установлена в вашей системе, если же нет, вы можете выполнить для установки в Ubuntu:

sudo apt install gcc

Перед тем как мы перейдем к написанию и сборке программы, давайте рассмотрим синтаксис и опции компилятора:

$ gcc опции исходный_файл_1.с -o готовый_файл

С помощью опций мы говорим утилите что нужно сделать, какие библиотеки использовать, затем просто указываем исходные файлы программы. Давайте рассмотрим опции, которые будем сегодня использовать:

  • -o — записать результат в файл для вывода;
  • -c — создать объектный файл;
  • -x — указать тип файла;
  • -l — загрузить статическую библиотеку.

Собственно, это все самое основное, что нам понадобится. Теперь создадим нашу первую программу. Она будет выводить строку текста на экран и чтобы было интереснее, считать квадратный корень из числа 9. Вот исходный код:

include <stdio.h>
#include <math.h>

int main(){
printf(«losst.pron»);
printf(«Корень: %fn», sqrt(9));
return 0;
}

Я специально добавил функцию корня чтобы показать как работать с библиотеками. Сначала нужно собрать объектный файл. Перейдите в папку с исходниками и выполните:

gcc -c program.c -o program.o

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

gcc -lm program.o -o program

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

./program

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

ldd ./program

Это две библиотеки загрузчика, стандартная libc и libm, которую мы подключили.

5. Автоматизация сборки

Когда мы рассматриваем программирование под Linux невозможно не отметить систему автоматизации сборки программ. Дело в том, что когда исходных файлов программы много, вы не будете вручную вводить команды для их компиляции. Можно записать их один раз, а затем использовать везде. Для этого существует утилита make и файлы Makefile. Этот файл состоит из целей и имеет такой синтаксис:

цель: зависимости
<Tab> команда

В качестве зависимости цели может быть файл или другая цель, основная цель — all, а команда выполняет необходимые действия по сборке. Например, для нашей программы Makefile может выглядеть вот так:

all: program

program: program.o
gcc -lm program.o -o program

program.o: program.c
gcc -c program.c -o program.o

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

make

Программа снова готова и вы можете ее запустить.

Выводы

Создание программ Linux очень интересно и увлекательно. Вы сами убедитесь в этом, когда немного освоитесь в этом деле. Сложно охватить все в такой небольшой статье, но мы рассмотрели самые основы и они должны дать вам базу. В этой статье мы рассмотрели основы программирования в linux, если у вас остались вопросы, спрашивайте в комментариях!

Возможно, вам также будут интересны 5 онлайн сервисов для изучения программирования.

Курс программирования на Си под Linux:

Creative Commons License

Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

Полезности |

создано:
9/18/2022
|
опубликовано:
9/18/2022
|
обновлено:
2/20/2023
|
просмотров:
4968

Довольно часто возникает вопрос «как можно писать приложения для Linux используя .NET». Кажется, пришло время ответить на этот вопрос. Тем более, выход MAUI лишь добавил непонятностей в эту тему.

Пишем на C# приложение с GUI для Linux

Довольно часто возникает вопрос «как можно писать приложения для Linux используя .NET». Кажется, пришло время ответить на этот вопрос. Тем более, выход в MAUI лишь добавил непонятностей в эту тему.

Сколько вариантов?

Вариантов, на самом деле, не один, и даже не два, а немного больше. Я насчитал четыре: Avalonia, Uno, MAUI, Blazor. Причем, некоторые из перечисленных вариантов представляют собой «полноценные» приложения, которые очень похожи на Windows-приложения, то есть графическим интерфейсом (GUI). Другие — это Single Page Application (SPA), то есть работают как frontend + backend. Где frontend это и есть SPA на базе Blazor (Blazor WebAssembly или Blazor Server). А роли backend может выступать, например, Web API, опять же написанный на C#.NET.

Не могу не отменить, что в роли frontend может выступать любой SPA-фреймворк, такие как React, Vue.js, AngularJS, BackBoneJS, Aurelia, EmberJS, Svelte и т.д. и т.п. Просто если мы говорим о возможности писать на C#, то я не беру JavaScript-фреймворки во внимание.

А теперь, давайте про каждый немного подробнее.

Avalonia

Это самый интересный, на мой взгляд, вариант, потому что он очень похож на WPF. Вот как описан этот фреймворк на сайте производителя

Avalonia — это кроссплатформенный фреймворк пользовательского интерфейса для dotnet, обеспечивающий гибкую систему стилизации и поддерживающий широкий спектр операционных систем, таких как Windows, Linux, macOS. Авалония зрелая и готова к производству. У нас также есть поддержка бета-версии для iOS, Android и на ранних стадиях поддержка браузера через WASM.

Avalonia поддерживается Visual Studio через плагин, а также можно использовать Rider.

Uno

Еще один вариант, писать под Linux, используя C# — это платформа Uno. Вот про нее говорится на сайте разработчика.

https://platform.uno/ — Платформа пользовательского интерфейса с открытым исходным кодом для создания приложений с одной кодовой базой для Windows, iOS, Android, WebAssembly, macOS и Linux

Зрелый, готовый к применению фреймворк и даже, наверное, платформа.

MAUI

Изначально предполагалось, что MAUI даст возможность писать код на .NET, а значит и на C# и для платформы linux. MAUI станет следующей вехой в развитии Xamarin.Forms, которые после выхода MAUI должны были перейти в режим «поддержки и исправления ошибок». То есть MAUI была призвана заменить Xamarin.Forms.

Но, когда вышла финальная версия MAUI, оказалось, что поддержки Linux просто нет. Более того, насколько я понял, поддержка платформы Linux не планируется. Печально…

Но мир не без добрых людей. Существует .NET Multi-platform App UI (.NET MAUI), которая создана и поддерживается сообществом разработчиков и доступна в виде Open-source. Вот что про нее написано в github.com:

NET Multi-platform App UI (.NET MAUI) — это кроссплатформенная платформа для создания собственных мобильных и классических приложений на C# и XAML. Используя .NET MAUI, вы можете разрабатывать приложения, которые могут работать на Android, iOS, iPadOS, macOS и Windows из одной общей кодовой базы.

Blazor

Это, как я уже говорил ранее, не совсем GUI. Это уже другой тип разработки основанный на Web-разработке. То есть когда есть frontend и backend

Заключение

В качестве заключения хочется ответить, что возможность писать для Linux на .NET платформе не ограничивается перечисленными мной вариантами. Существуют и другие менее распространенные способы, например, GtkSharp, Qml.Net, mono, ImGui.NET и даже ElectronJs (хотя это уже снова не .NET, а JavaScript).

Писать под Linux на NET можно! Выбирать вам!

����������


����� 2. ������ ����

2.1. Hello World
2.2. �������������� ����������������
2.3. �������������� ������
2.4. ������ ���

2.1. Hello World

����� ����� ������ ���������������, �������� ��� ���� ���� ��������� ���������
«Hello World». ��� ������ ��� ���������, �� ������. �������� ����
������� ��������� �������� � �������� � ��� ��������� �����:


/* hello.c */
#include <stdio.h>

int main (void)
{
	printf ("Hello Worldn");
}

� ������ ���� ���� hello.c. �� ������ ������� ��� ������, ��������
������� .c. ���������� ����� hello.c — ��� �������� ���
��������� (‘program source’, ‘source code’ ��� ������ ‘source’).
� hello.c — ��� �������� ���� ��������� (‘source file’). Hello World —
����� ��������� ���������, �������� ��� ������� ���������� � ����� �����. �
«���������» ����������, ��� �������, �������� ��� ���������� �� ����������
������. � ������� ���������� �������� ������ ����� ���� ������ �����.

��� �������� ��� ������� �� ����� ���������������� C. ����� ����������������
���� ��������� ��� ����, ����� ����������� ��� ��������� ����������, ���
������. �� ��� ����, ��������� �� �������� �� ������ ����� ����������������. �
���������� ���� ���� ����, ������� �������� �������� ����� ���
����������� ����� (‘executable code’). �������� Hello World � ��������
���� �����, �� ��������� ��������� �� ��� �� �������. ����������� ���
�� ������ ������� �� ����� ����, �� � ����� ��������� ��� ��������. ���������,
������� ����� �������� �� ���� ���� �� ����� ���������������� ����� ��������
����� ��� � �������� ����. ����� ����������� ������ � ���. ����� ����� ��
���������, ��� �������� ���������� (‘compiler’), ������� ��������� �������� ���
��������� � ����������� ���. ������� �������� ��������� ���� ��������� �
����������� ��� �������� �����������.

����� ��������������� ��� Hello World ���������� ������� � ��������� ������
��������� ����������:


$ gcc -o hello hello.c
$

���� �������� ��� ������� ��� �������������� ������, �� ����������
�������� ���� ������ ��� �����-���� ���������. �������� — ���� ����������� �
��������. ������ ������� ls �� ��� �� ���������� ����� ���� � ������
hello. ���� ���� �������� ����������� ��� ���������. ����� ����� ��������
������������ ������� (‘executable files’) ��� ����������� (‘binary
files’).

�� ��������� ����������, ��� ����� -o ����������� gcc ��������� �� ��, �����
������ ���� ��� ��������� �����. ��� �� ����� �������, �������� ������
����� ���� �� ������ ��������. ���� �� ������� ����� -o, �� ���������, � �����
������, ����� ��������� ��� a.out.

�������� ������ ��������� ���������� ��������. ��� ����� �������� � ���������
������ ��������� �������:


$ ./hello
Hello World
$

����� �� �������� � ��������� ������ ���� � ���������, ��, � ����������
�������� ��������, ��� ���� ��������� ���������. �������� «��������» ��������
���� ������������ �������, � ���� ������� ������ ��������� �������� ������
��������� �� ���������� ����������. �����, ���� ��������� �� ���� �������� �
������� ������, �� �������� ���� �� ���� ��������� � ���, ��� ���������
�����������. ������� ����� ���������, �������� ������ ����������� �� ���� �����
�������. �� ������ ��� ��� ������� ./hello � ��������� ����������. �
����� ������ ��������� ����������� ����� ������, � ����� ����������� ���������
������ «��������» ����������� �����.

�� ����������� ��������� ������, ����� ��������� �������� ���
�������������� ������. ��������� ��������� ��������� ��������� �����
�������, ����� ��� �� �������� ������� ����� C. ��� ����� ���������� ������
����� � ������� � ����� ������ ������� printf():


printf ("Hello Worldn")

������, ���� ���������� ��������������� ���������, �� ���������� ����������,
������ ��� �� ��, ��� �� ������� ������������:


$ gcc -o hello hello.c
hello.c: In function 'main':
hello.c:7: error: syntax error before '}' token
$

� ������ ������ ���������, ��� � ����� hello.c (� ��� �� ������������) � ����
������� main() ���-�� ���������. ������ ������ ��������, ��� ������ ���������:
������� ������ ����� hello.c ������� ������ (error). ����� ���� �����������:
�������������� ������ ����� ������������� �������� �������.

�������� � ���� hello.c �� � ���������� ���������, ��� ������������ �� �� �
�������, � � ������ ������. ���� � ���, ��� ���������� ��������� ������ ������
� ������� ������, �� ������� ‘before’ (��), ��� �������� «����������� �����».

�����������, ���� �� �� �������� ������, �� � ����� ��������� �� ����� ���� �
����. ���� �� ������ ������ �������� hello, ����������� ��� �� �������
����������, �� ������, ��� ���������� ������������ ����� �� ���� ��������
����������. ������ ������ ���������� ����� ���� «�����������» ���-�� ��������,
������������ ������� ��� ����������� ������������� ���������. ����� ������
‘error’ ������� ‘warning’ (��������������), � �������� ���-���� ���������� ��
���� (���� � ������ ����� ��� ����� ������). �� ������� ������������
��������������, �� ����������� ��� �������, ����� �� �� 100% ������, ���
�������.

�������� ���������������� ����������� � ���, ��� ����� �������� ���� ������ (���
�� ��������������, ��� � ����� ������, � ���������) �� ���� �������� �����
����������������. � ����� ������ ���������� ������ ��������, ������� ������ ��
��, ��� �� ������. � ����� ������ ��������� ���������� ����������.
������� — ��� ������� ���� ��� ��������� ����� ���������� ������� ���������. ��
��������� ������ ���, ��� ������ �� ������.

2.2. �������������� ����������������

��� � ��� �������, ���� �������� ��� �������-������ ��������� ���������
�������� � ����� �����, �� ����� ��� ������ ������ ����������. � ���� �� ����
��������� ������������� ���������� ����� (�������� ��� ��������� � ����� C++),
�� ����� ����������� ����� ������, ����� ����������������� ���� ���.

���� ����� ���������� �������� ��� �� ���������� ������ (����������, ��
������-������ ��������), � ������������� ������ ����� ���� ��������. ��� ��
������ �������, ��� ����� ���� ������.

������� ������� ����������, ��� �� ��������� ����� ���������� ��������. �������
���� ��� �������� �� ����� ������������ � �������, ��� � �������� ���� �� �����
������������ � ��������. ����� ���������� ��������� ��������� ���. ���
����������� ��� � ���������� «������������», ��-�� ������� ��������� ��� ��� ��
�������� � ����������. ����� � ������ �������� ���������� ������: �� �� ������
��� ������ � ��� ����� � ��� ���� � �������. � ����� ��������� ��� ������� ��
�����, �� �� ��� ����� ����, ������ ��� �������� ������ �������� �� ������� �
����������.

�������� � ���������� ����. ��� ����� «����������» (����� ������� ����� ��� —
������� ��������) ��������� ���������� ���� «����������������» � �������
���������� ����. ����� ����� ������ ����������� (���������) —
���������, ������� ���������� ��������� ���, ���������� �� «������ ����»,
������� ��� ������ � ������� ����������� ��������. ���� ������� ����������
����������� ��� ���������.

����, ����� ��������������� �������������� ���������, ���� ������� ������
��������� ��� �� ������� ��������� ����� � �����������. ������ ����� ��� �����
������������ ����� ��������� ������. ������ ��������� ������
������������ � ��������� ��������� ����. ����� ��������� ������ ����
������������ � ���� ��������.

� Linux � �������� ���������� ������������ ��������� ld, ����������
��������� ��������� �����. � ������� gcc �������������� �������� ����������� �
������� �������, �������� ��� �� «������» ��������.

��������� ������, ������������ ������� ������, �������� �������������� Hello
World. �������� ������ ���� � ������ main.c:


/* main.c */

int main (void)
{
	print_hello ();
}

������ �������� ��� ���� ���� hello.c �� ��������� ����������:


/* hello.c */
#include <stdio.h>

void print_hello (void)
{
	printf ("Hello Worldn");
}

����� ������� main() �������� ������� print_hello(), ����������� � ������
�����. ������� print_hello() ������� �� ����� �������� �����������. ������
����� �������� ��� ��������� �����. ����� -c ����������� gcc ���������� ���
���������� �� �������� ����� ����������. ���� �� ��������� ����� -o, �� � �����
���������� ����� ���������� .c ����� �������� �� .o (������� ��������� �����
����� ���������� .o):


$ gcc -c main.c
$ gcc -c hello.c
$ ls
hello.c  hello.o  main.c  main.o
$

����, �� �������� ��� ��������� �����. ������ �� ���� ���������� � ����
��������:


$ gcc -o hello main.o hello.o
$ ls
hello*  hello.c  hello.o  main.c  main.o
$ ./hello
Hello World
$

���������� «������», ��� ������ �������� ������ (� ����������� .c) ���
���������� ��������� ����� (� ����������� .o) � ������������ �������� ��������:
������ ��������� � ������� �������.

������� ����������, ��� �� ���-���� ���������. � ���� ��� ������� �������
nm. � ��� ����������, ��� ��������� ����� �������� �������
��������
. ������� nm ��� ��� ��������� ���������� ��� ������� � ��������
����. ��, ��� �������� ��������������� �� ���������� �����, ��� � �����������
����� ��������� ��� (�������, ����������) ����� �� ����� �������: ����� ������
�������� ��� ������ �� ��������� ���� ����, ��� ��������� ��� �� ������������ �
����� ������ ��-�� ��������� ������� (�������). � ��������� ������ ������ ����:
��� ������ � ������� �������� ����� ��������� ������� (��������� �����������
�������, ��������). � �������� �������� ���������� �������� ���� � ��������
�������, ��� ��������� ���������� ��������� ������ ������������ � ���� ��������.
���� ������� nm ��� ����� hello.o, �� ������ ��������� �������:


$ nm hello.o         
	 U printf
00000000 T print_hello
$

� ��������� �������� ����� � ����� U,T �� ����� �������� ��� ��������
���������. ������ �� ������ �������� ��, ��� � ��������� ����� �����������
���������� �� �������������� ������. ���� ���������� ���� � � ����� main.o:


$ nm main.o
00000000 T main
         U print_hello
$

������� �������� ��������� ������ �������� ����� ��� print_hello. � ��������
�������� ������������� � ������������� � ������ ����� ������, ���������������
������ �� �������. ��� � ���� ������.

2.3. �������������� ������

� ���������� ������� ��� �������� ��������� �� ���� �������� ������ ���
�������� ������� ��� �������. ���� �� ��������� �������� ����������, �� ������
��� ���� ���� �� ������� ���� � �� �� ��� �������. �������� �� ����� ����:
�������� �������� ��������. �� ������� ��������, ����� � ���� ������ ����� ����
����������. ��-������, ������ ��� �������� ����� ������������� ��� �����
�������, ���� ���� �� ��������� ������ ���� �� ���. � ����� ������ ��� ��
�������. �� ���� ���� ���� � �������� ������! ��-������, �������� «��������»
�������� � ���������� ��������. ��������� ��� �� ���������� ����� �����������.
�, �������, �������� ������� �� ������� ���������������� (������� ����������
������ � �. �.), � ������� ������ (� �������������������� ������������) �����
���������������.

����� �� ����������� �������� ����. ��� ������� make, ������� ��������
�� ������ ������������ ����������. �������� ������������ � ����� � ������
Makefile � ���������� � ����������� (������� �������) �������. �������� �������
make ������ � ������������������, � ������ Makefile ������������ ����������� (�
�� ������ �� Unix-��������). ����� �� ����, ��� ����� ��������� ���������,
������������ Makefile’�. ����� ����� ������ — ����� ������ GNU Autotools. �����
������� ������������ make — ��� «����������������» ������ ������������: �
�������� ������� make ����������� ������ ���������� �����.

��, ��� ��������� ������� make, ���������� ������� �������, � ����
������� make ��������� � ������� ���������.

����� Makefile ������� �� ���� ���������: �����������,
����������������������� ������ (��� ������ ������). �
���� ������� ������ ������� ���� �� ���� ���������: ����,
������������������.

�������� make ���������� ������������ �����������, ������������ � ������ #
(�������). � ���, ��� ����� ����������� � ����� ��� �����, ��������� �� ����.

���������������� ��������� ��������� ��� ����������� ����� ������, � �����
����������� ��� ��� � ����� ����� ��������, ��� ������ �������������� ������
������. ������� Makefile ����� � ���������������� ����� C.

������ ����������: 1) ��� ����� ������� (����); 2) ��� ��� ����� �����
(�����������); 3) ��� ��� ������� (�������). � �������� ���� ��������� ���
��� ��������������. ����������� — ��� ������ ������ � �����, �����������
��������. ������� — ��� ������� ������������ ��������.

������ ���������� ������. ��������� ��������� �������� ������ ���
�������������� � ���������� ������� ��������������� ������� Hello World.
�������� ���� � ������ Makefile:


# Makefile for Hello World project

hello: main.o hello.o
	gcc -o hello main.o hello.o

main.o: main.c
	gcc -c main.c

hello.o: hello.c
	gcc -c hello.c

clean:
	rm -f *.o hello

�������� ��������, ��� � ������ ������ ����� ������� gcc, � ����� � ������
����� ������� rm ����� ���������. ��� �� ��� ����������, ��� ������
�������� ���������. ������ Makefile �������, ����� ������ �������
���������� � ���������. ������ ���������� ��� �� �������.

Makefile ����� ���������� ��� � ��������� ��� � �� �������� �����. ��
������������� ���-���� �������� � ���������, ����� �� �� �������������
� ������� ������� �������, � ����� «� ������ ������».

������ ������ — �����������. ����� ����� ������ ���, ��� ������. �����������
���������� � ������� # (�������) � ������������� �������� ����� ������. �����
�� ������� ������� ������ ������: 1) ������ ��� ���������� ���������
������ main.o � hello.o; 2) ������ ��� ���������� main.c; 3) ������ ���
���������� hello.c; 4) ������ ��� ������� �������.

������ ������ ����� ���� hello. ���� ���������� �� ������ ������������
����������. ������ ������������ ���������� �� ������ �������� ����� ������.
� ������ ������� ���������� �� ����� ������ � ������� ���������. � �����
������ ������ ������ �������� �� ������ �������. � ������ ������������
������������� ����� ������ ����, ����������� ��� ���������� �������. � ������
������, ����� ������������ ��������, ����� ����� ��� ��������� �����, �������
��� ����������� � ������ ������������. ���������� ��������� ����� �����������,
������� ��������� ������� ������� ������ ��� �� ���������. ����, ����� ��������
main.o, ����� ��������������� main.c. ����� ������� ���� main.c ���������� �
������ ������������ (�� ��� ������������). ����������� �������� � hello.o. �����
main.c � hello.c ���������� ���������� (�� �� ���� �������), ������� �������
������ ��� �� �������� �� ���������.

������ ���� ������ ������� ������ clean � ������ ������� ������������. ���
������ ������� ������ �� ���� ������������� ��������� ������. � ����� ������
��������� ����� main.o, hello.o � hello. ������� ������� ������ ����� �
���������� �������: 1) ��� ������� �������� ������� �� ����� �������; 2) ���
���������� ������� (����� � ������ ����������� ����� ����� ��� ����� ����������
��� Makefile; 3) � ����� ������ �������, ����� ��������� ������ ����������
(��������, ��� ��������� ������� ������ ������).

������ �������� ��������� ��������. ������ ������� ������� make ���������:

make [�����] [����...]

����� make ��� ���� �� �����. ���� ������� make ��� �������� �����, �� �����
��������� ������ ���������� ������ (�� ����� �������������) � ������
����������. ��� ��� � ���������:


$ make
gcc -c main.c
gcc -c hello.c
gcc -o hello main.o hello.o
$ ls
hello*  hello.c  hello.o  main.c  main.o  Makefile
$ ./hello
Hello World
$

� �������� ������ ������� make ����� ��� ����������� �������. ������ ������,
��� ��������.

������ ������� ������� ������������� ��� ������. ������� ���� ������ � ����
hello.c:


/* hello.c */
#include <stdio.h>

void print_hello (void)
{
	printf ("Hello Worldn");
	printf ("Goodbye Worldn");
}

������ �������� ������:


$ make
gcc -c hello.c
gcc -o hello main.o hello.o
$ ./hello
Hello World
Goodbye World
$

������� make «���������», ��� ��� ������� ������ hello.c, �� ���� �������������
����� ������ ���. ���� main.o ������� ��� ���������. ������ ������� �������
������, ������� ���� ���������:


$ make clean
rm -f *.o hello
$ ls
hello.c  main.c  Makefile
$

� ������ ������ �� ������� ���� ��������������� � ��������� ������. ��� ���
������� ������ clean �������� ������ ������ ������������, �� ����������� ������
���� �������. �� ��������� «�������» ������ ������ ���, ����� ���������� ������
�������� ������ ��� ����� ���������� ��� Makefile.

2.4. ������ ���

����� ��������� ����� ���� ����������� — ������� �������, � �������
��������� ���������, �������� ������ (Makefile) � ������ �����, ����������� �
�������. ����������� �������������� ���� ������� ��������������� Hello World
���������� ������� �� ������ main.c, hello.c �, ����������, Makefile. �����
������ ����������� ����������� ������� main.o, hello.o � hello. ��������
����������, ��� ���������� ����������� ��������� ���� � ����������� �� ������
�������� ������������ � �������, �� � ������������� ����������� ���������
������ ������.

������ ��� (������-���������-������) — ��� ���������� ���������
������������� ��������� ���� � �����������, � ������ ������� ��� ���������
����� �������� �� �������, �����������������.

����, ������ ������������� ������. � ����� ������ ��� ����� ���� �������,
���������, ������������, ���������, ���������� ���������� � ����. � ����� C++
��� ���� ����� ������ ��� �������� �������. ����� �������� (������) �����
��������������� ���������������� ��������, �� ���� ������� ������� �� ������
������������ �����������, ������� ��������� ���������, ���������������
���������� � �. �. � C++, ��� �������, ������ ���������� ����� ��� ��� ������ �
���������� ��� �����.

����� ������, ��� ������ ��� ���������� ��������, ������ �������� ������ ����
�������������� �������. ������� ������ — ��� �������������� Hello World. �����
������� print_hello() (������) ���������� �������� ����������� ���������� �����
C (������), ������� ������� printf(). ������ � ���������� ������� print_hello()
���� ���������� ��������, ������������ ���� ������ ������� main(). � ����� C++
�������� ����� ������ ������� ����������� �����, ������� ���������
��������� ��������� �������� ������ �������. ����� ������� ������ ���
���������� ��������, ������������ ������ ������ ������������ ������.

������ � �������� ������ «��������» ���� �����, ����� ��������������
����������. ��������� (��������) — ��� �������� ����� ������, ��������
������� ��������������� ������ � ������. � ����� ������ (�������������� Hello
World) ����������� (����������) �������� ����� ��� � ������� �������� ����
��������� ������. ����� ������ �������������� ����� �������� � ����������
������������. ������ (������� main()) �� ����� ������, ����� ����� �������
print_hello() �, ������ �������� �� ��� ���������� � ��� ������������. �����
������, ������ �� ����� �� ����� ������ ����. � ����� ������ ��������
������� print_hello() ����������.

������ ��� ����������� ����������� ������������ ���������� (���������),
������� ���������� ���� ����� � ������������ �����. � ����� C ��� �����
� ����������� .h; � ����� C++ ��� ����� � ���������� .h, .hpp ��� ���
����������. ��������� «���������» �������� �������� ������������ �����
������������
� ���������� ����� ����� ������. ������� ������ �����, ���
���������� — ��� ������ ��������� �������������� ������ ������� ���������
������
, � ������������ ���� — ��� ���������. �������� ������� �����
������������ � ������������� ������� � ���, ��� ���������� — ��� ���������
(����� �����������) ���, � ������������ ���� — ��� �������� ���. ������� �
��������� ������������ ���� ���������� #include �� ����������� �������� �
�������� (���� �� ���������� ��� ������� ��������� ����) �� ��� ���������: ����
������ ������, ��� ������� ���������� ��� ����������, �� ��� � ����� ����������
��� ����������, ����� ���������� ������� �����, �� �� ���� ���������������
«���������� �����».

�������� � Hello World. � ����� ����, ��� �� ���� ������, �� �����, ��������,
������� ������� print_hello() � ����������, � ���������� ���� �� ����������
��������, ������ ��� �� ������ ��������� ���� ��� ������ ������,
���������������� �������������� ������� � �������. ����� ���� ��� �� ��������
������������ ���� � ������� ��� � ���� main.c, ���������� ����� «���������
������» ������ ���, ����� �� ����� �������� ������� ������� print_hello() �� ��
��������. ����� ������� ��������� (����� ����������, � ������ ������ — �
������������ �����) — ��� ��������� ������ ������� �������. ���������
������������� ����� ���������� #include — ��� ������ ��� �������.

��� ���� ������� ���� ���� � ����������� ���������� ����� C. ��� � ��� �������,
���������� — ��� ����� ��������� ������, ������� �������������� � ��������� ��
������ ��������. ��� ��� ����������� ���������� ����� C — ��� ����� ���������
����� C, �� ��� ������������ ������������� �� ����� �������� ���������, �� ���
��� ���������� gcc ��� �������� ��������� � ������� �����������, �� �� �����
������ �� ��������. ������� � ��������� ������������ ���� stdio.h, ��
������������� ����������� ������������ ��������� ������������ �����-������ ��
�������� ������� (����������� ���������� ����� C).

������ ��������� ��������� ������ ��� �� �������� ��� ������ ������� Hello
World. �������� ���� hello.h:


/* hello.h */
void print_hello (void);

������ ������� ���� ���� � main.c:


/* main.c */
#include "hello.h"

int main (void)
{
	print_hello ();
}

��� ��� � ������ ��� �������� ����� ����, ���� ������� ������ ����������:


$ make clean
rm -f *.o hello
$ make
gcc -c main.c
gcc -c hello.c
gcc -o hello main.o hello.o
$ ./hello
Hello World
Goodbye World
$

� ���� ������ �� ����������. �� �� ����� ���� ��������� ����� ����� ����������,
����� ������� �, ����� �������, ����� ����������.



Copyright © 2003-2006, 2007 Nikolay N. Ivanov
Distributed under the GNU Free Documentaton License

Понравилась статья? Поделить с друзьями:
  • Как написать приложение для ios на python
  • Как написать приложение для android на unity
  • Как написать приложение для android на delphi
  • Как написать приложение для android для чайников
  • Как написать прикрыть рогожей