Введение
Добрый день. Этот материал рассчитан на людей, будущих программистов, которые только начинают разбираться в программировании под ОС Linux. Я попробую здесь показать прямое руководство к действию на примере тех простых инструментов, которые использовал некогда сам при изучении Си в процессе знакомства с Linux. На самом деле, с теми или иными поправками, это руководство можно использовать в большинстве дистрибутивов. Руководство однозначно подходит для всех deb-based дистрибутивов.
С установкой ОС, как я полагаю, проблем у Вас уже не возникло. Этому процессу посвящены просто тысячи статей на профильных сайтах.
Итак: у Вас сейчас установлен дистрибутив ОС, как говорится, "из коробки". Перед глазами пособие для разработчика/учебник/просто_хорошая_книга по "Языку программирования Си". И никакой вменяемой, полноценной подробной информации о том, как же собственно откомпилировать и выполнить, написанный в книге, исходный код. Быстрый осмотр тематических ресурсов уже показал Вам, что, необходимо установить компилятор Си, запустить его с нужными параметрами и потом запустить компилированный бинарный код. Примерно с этого момента мы и начнём.
Установка компилятора
Я имею ввиду, что Вы скорее всего (бывший) пользователь ОС Windows и действия в чёрном/синем окошке при помощи клавиатуры оканчивались где-то на команде ping, кажутся неким таинством. Однако отмечу, что всё банально просто и текстовой интерфейс предоставляет намного более гибкие возможности (скорее всего Вы неоднократно Вы слышали это ранее). Приступим:
Я подразумеваю, что с понятием компиляции и о том что такое компилятор Вас уже познакомила правильная книга.
На этом этапе всё будет очень быстро и просто. Открываем терминал и пишем:
sudo apt install gcc
(На всякий случай: вставка в gnome-terminal ctrl+shift+v)
Сразу поясню, что текст слева от курсора - это приглашение командного интерпретатора и оно выглядит следующим образом:
ИМЯ_ПОЛЬЗОВАТЕЛЯ@ИМЯ_КОМПЬЮТЕРА:ТЕКУЩИЙ_КАТАЛОГ$
Далее я буду указывать только команды интерпретатору без приглашения.
Данная строка "говорит" интерпретатору: "от имени суперпользователя запустить менеджер пакетов для установки пакета gcc".
Система попросит Вас ввести пароль суперпользователя и приступит к установке компилятора.
Чтение списков пакетов… Готово
Построение дерева зависимостей
Чтение информации о состоянии… Готово
Предлагаемые пакеты:
gcc-multilib gcc-doc
Следующие НОВЫЕ пакеты будут установлены:
gcc
Обновлено 0 пакетов, установлено 1 новых пакетов, для удаления отмечено 0 пакетов, и 44 пакетов не обновлено.
Необходимо скачать 5 208 B архивов.
После данной операции объём занятого дискового пространства возрастёт на 51,2 kB.
Пол:1 http://ru.archive.ubuntu.com/ubuntu focal/main amd64 gcc amd64 4:9.3.0-1ubuntu2 [5 208 B]
Получено 5 208 B за 0с (34,6 kB/s)
Выбор ранее не выбранного пакета gcc.
(Чтение базы данных … на данный момент установлено 371769 файлов и каталогов.)
Подготовка к распаковке …/gcc_4%3a9.3.0-1ubuntu2_amd64.deb …
Распаковывается gcc (4:9.3.0-1ubuntu2) …
Настраивается пакет gcc (4:9.3.0-1ubuntu2) …
Обрабатываются триггеры для man-db (2.9.1-1) …
Если же он уже установлен, то менеджер пакетов apt
просто укажет на это примерно следующим образом:
Чтение списков пакетов… Готово
Построение дерева зависимостей
Чтение информации о состоянии… Готово
Уже установлен пакет gcc самой новой версии (4:9.3.0-1ubuntu2).
Установка редактора
Обычно с дистрибутивом Ubuntu поставляется весьма интересный текстовой редактор gedit
. Однако в других дистрибутивах возможно придётся установить этот редактор:
sudo apt install gedit
Создание файла с исходным кодом
Теперь пришло то самое время нашего классического "hello world"! Давайте сделаем это в стиле linux. Просто наберите в консоли:
gedit ~/hello_world.c
Более подробно Вы обязательно прочитайте в профильных ресурсах и в документации, я только отмечу, что символ "тильда" возвращает полный путь к домашнему каталогу пользователя ОС. Соответственно будет создан файл в вашем домашнем каталоге с указанным именем.
И далее наш программный код на языке Си в редакторе:
#include "stdio.h"
int main()
{
printf ("\nHello world)\n");
for (int c=0; c<10;c++)
{
for (int i =0;i<c;i++)
printf("#");
printf ("\n");
}
return 0;
}
(Стоит отметить, что в редакторе gedit есть подсветка синтаксиса для различных языков программирования. Переключить режимы подсветки можно в нижней части окна редактора.)
Не забываем сохранить изменения нажатием ctrl+s. Обратите внимание, что вопросов об имени файла не последовало, так как имя было уже указано параметром при запуске редактора из командной строки терминала.
Компиляция и запуск
Закрываем окно редактора нажатием Alt+F4 и запустим же то сокровенное ради чего все тут и собрались:
gcc ./hello_world.c
И в ответ только новое приглашение. В отличие от стиля в ОС Windows, когда консоль, жутко подробно по-умолчанию, комментирует выполняемые действия - большинство программ в ОС семейства *nix сообщают только об исключительных ситуациях, ошибках и тому подобных вещах. То есть если "в ответ тишина" - то всё прошло хорошо.
Теперь в домашнем каталоге у нас появился файл a.out - он и есть файл с исполнимым кодом.
Для запуска этого файла на исполнение - назначим ему атрибут: "исполнимый":
chmod +x a.out
и теперь запустим получившееся приложение:
./a.out
(Для запуска исполнимого файла интерпретатору требуется указать полный путь к файлу. Как в случае с "тильдой" символ "точка" возвращает полный путь к текущему каталогу. В данном конкретном случае правомерно так же запустить через ~/a.out
Это не имеет значения здесь, так как файл создан в домашнем каталоге пользователя.)
И мы получаем вывод в терминале:
Hello world)
#
##
###
####
#####
######
#######
########
#########
Для выполнения всех повторных действий: изменение кода и снова компиляция, - Вы можете не вводить все эти команды каждый раз заново, а использовать стрелки вверх и вниз, для быстрого выбора команд из истории. И, кстати, вывод списка истории всех введённых команд можно выполнить командой (на самом деле программой) history
.
Минутка автоматизации
Теперь приступим к очень интересному моменту связанному с творчеством в духе *nix. Каждый раз вводить много скучных команд неинтересно, возможно, даже вредно. Мы расширим функционал редактора gedit и доработаем его "напильником" до состояния примитивной среды разработки: запустим gedit и откроем меню параметров,
где на вкладке "Расширения" добавляем "Внешние инструменты"
И затем, из того же главного меню gedit выбираем "Управление внешними инструментами".
Как Вы уже поняли - здесь можно выполнить доработку функциональности текстового редактора. Создадим новый инструмент: "Компиляция и запуск", В качестве вывода используем нижнюю область редактора. Инструмент назначим для файлов C и C++. Назначим клавишу F5 (дело вкуса) на применение инструмента и собственно сам код инструмента в виде скрипта bash:
#!/bin/bash
gcc -o a.out $GEDIT_CURRENT_DOCUMENT_NAME
chmod +x ./a.out
./a.out
rm ./a.out
Разберёмся в том, что тут происходит:
#!/bin/bash
- указание командного интерпретатора для выполнения скрипта.
gcc -o a.out $GEDIT_CURRENT_DOCUMENT_NAME -
здесь мы запускаем компилятор, где в параметре -o указываем имя выходного файла. Пускай он будет таким же как и по-умолчанию.
$GEDIT_CURRENT_DOCUMENT_NAME
- через эту переменную gedit передаёт имя файла.
Дальше Вы уже знаете - назначение атрибута "исполнения", запуск файла и потом:
rm ./a.out
- удаление созданного исполнимого файла.
Попробуем инструмент в деле:
Теперь можно продолжать изучать пособие для разработчика/учебник/просто_хорошую_книгу по "Языку программирования Си" на практике.
Заключение
На самом деле в ОС Linux полно возможностей по доработке и использованию различного ПО. Само ПО является максимально гибким. Необязательно использовать предложенные мною средства, скорее методы, разработки.
В дальнейшем Вам обязательно понадобятся более серьёзные средства. А на первое время Вы можете дополнительно посмотреть другие редакторы, вплоть до больших и серьёзных сред разработки. Однако обязательно обратите внимание на редактор vim.
Комментарии (36)
orbion
24.03.2022 12:19+8GCC делает
chmod +x a.out
за нас, так что можно смело пропускать этот пункт. Больше актуально для бинарников, скачанных из Интернета.Не лишним было бы добавить парочку флагов для отображения предупреждений, основные для меня -
-Wall -Wextra -pedantic
, порой очень помогают искать ошибки. На Codeforces этому даже посвящена небольшая статья. Здесь можно было бы добавить про Valgrind, санитайзеры и статические анализаторы, но это уже не совсем уровень новичка.Также предложил бы новичкам попробовать и Geany (есть в репозиториях практически всех дистрибутивов) - он содержит заранее прописанные параметры компиляции и запуска для многих популярных языков, остаётся лишь нажимать хоткеи и пользоваться.
sim2q
25.03.2022 04:34+2Не лишним было бы добавить парочку флагов для отображения предупреждений
Понимаю, что за фразой : "....не лишне" могут последовать тома советов, но к обязательному -Wall хорошо бы и -Wfatal-errors что бы не мотать километры скрола в поисках что не так
rPman
24.03.2022 12:46+4вместо использования bat файла лучше использовать какую-нибудь систему сборки, например старейший make
makefile имеет очень простую структуру, а за счет разделение сборки на этапы — объектную и создание бинарника, можно очень хорошо оптимизировать процесс, не собирая не изменившиеся файлы.mayorovp
24.03.2022 14:05А если изменился заголовочный файл?
rPman
24.03.2022 14:08в makefile ты как раз и описываешь список файлов, от которых зависит какой
mayorovp
24.03.2022 14:21-1И в итоге зависимости дублируются: один раз в виде директив #include, второй раз в makefile. А где дублирование — там и баги.
lorc
24.03.2022 16:24+3Все компиляторы давно умеют генерировать .o.d файлы со списком зависимостей. Этот файл просто инклудится в Makefile и он чудесным образом начинает отслеживать изменения в заголовочных файлах.
mayorovp
24.03.2022 19:29+3О, ну наконец-то такая возможность появилась.
Осталось только чтобы был хоть какой-нибудь способ узнать о ней, кроме чтения мана от корки до корки или комментариев 5 уровня на Хабре.
lorc
24.03.2022 19:43+1Ммм... Ну мне лень ковырять историю gcc, но я уверен что этой возможности не менее 30 лет. Первый попавшийся пост об этой фиче написан аж в 2000 году: http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/
И используется эта штука в каждом первом проекте на C. Так что я вообще не понимаю как вы ее пропустили.
mayorovp
24.03.2022 23:35Элементарно: не было у меня проектов на Си. Что, к слову, является следствием в том числе пропущенной информации об этой возможности.
lorc
25.03.2022 12:16-1Если у вас не было проектов на С, то зачем так безапелляционно заявлять о том, когда какие фичи появились?
Я об этом, если что:
О, ну наконец-то такая возможность появилась.
MinimumLaw
24.03.2022 13:56+7$ sudo apt install build-essential
Окажется сильно полезнее, нежели просто gcc. Для желающих есть еще мета-пакеты crossbuild-essential-[ARCH]. И приготовиться доставлять пакеты с суффиксом -dev.
Остальное по вкусу и по потребности.
kovserg
24.03.2022 17:59Помимо apt бывают и другие пакетные менеджеры yum pkg dnf tazpkg brew…
Но первым делом надо ставить mc и vim
И про такое надо было упомянутьman dlopen man printf ctags --c-kinds=+p -R /usr/include vim -t sockaddr_in vimtutor grep something -r . gcc -o main -S -O2 -march=native -fwrapv main.c -llibs -Wl,-rpath,'$ORIGIN'
И редакторы vscode, sublime_text гораздо веселее чем gedit но без ssh и vim всё равно никуда.warlock66613
25.03.2022 02:13Но первым делом надо ставить
mcranger и vimkovserg
25.03.2022 09:08для работы с файлами mc, ncdu, fdups, rsync, find, fatrace, mount, df, tar, 7z, dd, file, mimeopen
про ranger ничего не могу сказать.
red_dragon
25.03.2022 07:26Без vim вполне себе куда. mc вообще не первым делом, и даже не вторым. Даже не могу вспомнить, когда его запускал в последний раз. VS Code, однозначно must have для программиста. Пожалуй это лучшее произведение Microsoft, что я видел в своей жизни.
kovserg
25.03.2022 09:09Еще есть вариант без телеметрии vscodium.com
red_dragon
25.03.2022 09:33Согласен. Можно сразу без телеметрии. Или отключать оную в оригинале. Но для комментариев к данной статье, это перебор. Нам здесь объясняют, как установить gcc без dev tools и gedit как редактор кода. И, главное, как скомпиллировать "Hello world", без всяких там ключей. Ну, если мы осилили установку Linux, конечно.
unsignedchar
25.03.2022 09:50В 2000 году, наверное, это могло быть актуально. А в 2022 программы на С можно прямо в браузере писать.
red_dragon
25.03.2022 10:42+1И это ещё ерунда. В 2022, школьные рефераты можно прямо на хабре писать.
savostin
24.03.2022 21:45Все же удобнее так:
#!/bin/bash rm ./a.out gcc -o a.out $GEDIT_CURRENT_DOCUMENT_NAME chmod +x ./a.out ./a.out
Вдруг захочется запустить еще раз, не компилировать же заново.
red_dragon
25.03.2022 09:39Всё же удобнее через make. "chmod +x ./a.out" в принципе не нужен, gcc сам помечает файл исполняемым.
2chevskii
25.03.2022 02:13+5Ничего не хочу плохого сказать ни про gedit, ни про vim и прочие "классические" инструменты, в которых писали ещё издревле, но вот почему бы новичкам не начинать сразу с юзер-френдли программ? Тем более, что они есть - vscode и clion, например. Все таки dx очень важен, особенно на первых порах, когда человеку ещё только предстоит адаптироваться к экосистеме языка.
13werwolf13
25.03.2022 09:21-1назвать vscode и clion юзерфрендли это сильно..
100500 функционала который новичку понадобится не скоро, жор памяти, инородный системе визуал.. ну такое себе. тогда уж qt-creator больше подойдёт.
вот когда новичёк перестанет быть новичком тогда и clion станет ему другом
а вообще начинать я бы предложил с консольки, чтобы в будущем тыкая, условно, на кнопку debug он знал что же там под капотом запускается и с какими флагами.
unsignedchar
Зачем предлагать писать код в gedit, компилировать bash скриптом, а про отладку даже не заикаться? Можно же добавить ещё 1 команду, и появится приличная IDE.
VXP
":wq"?
unsignedchar
Это сложный квест ;) Некоторые даже команды vim выучили потому что не понятно как из него выйти :D