Введение

Добрый день. Этот материал рассчитан на людей, будущих программистов, которые только начинают разбираться в программировании под ОС 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
Главное меню 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)


  1. unsignedchar
    24.03.2022 11:55
    +4

    Зачем предлагать писать код в gedit, компилировать bash скриптом, а про отладку даже не заикаться? Можно же добавить ещё 1 команду, и появится приличная IDE.


    1. VXP
      24.03.2022 13:11
      +9

      ":wq"?


      1. unsignedchar
        24.03.2022 13:14
        +2

        Это сложный квест ;) Некоторые даже команды vim выучили потому что не понятно как из него выйти :D


  1. orbion
    24.03.2022 12:19
    +8

    GCC делает chmod +x a.out за нас, так что можно смело пропускать этот пункт. Больше актуально для бинарников, скачанных из Интернета.

    Не лишним было бы добавить парочку флагов для отображения предупреждений, основные для меня - -Wall -Wextra -pedantic, порой очень помогают искать ошибки. На Codeforces этому даже посвящена небольшая статья. Здесь можно было бы добавить про Valgrind, санитайзеры и статические анализаторы, но это уже не совсем уровень новичка.

    Также предложил бы новичкам попробовать и Geany (есть в репозиториях практически всех дистрибутивов) - он содержит заранее прописанные параметры компиляции и запуска для многих популярных языков, остаётся лишь нажимать хоткеи и пользоваться.


    1. sim2q
      25.03.2022 04:34
      +2

      Не лишним было бы добавить парочку флагов для отображения предупреждений

      Понимаю, что за фразой : "....не лишне" могут последовать тома советов, но к обязательному -Wall хорошо бы и -Wfatal-errors что бы не мотать километры скрола в поисках что не так


  1. rPman
    24.03.2022 12:46
    +4

    вместо использования bat файла лучше использовать какую-нибудь систему сборки, например старейший make

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


    1. mayorovp
      24.03.2022 14:05

      А если изменился заголовочный файл?


      1. rPman
        24.03.2022 14:08

        в makefile ты как раз и описываешь список файлов, от которых зависит какой


        1. mayorovp
          24.03.2022 14:21
          -1

          И в итоге зависимости дублируются: один раз в виде директив #include, второй раз в makefile. А где дублирование — там и баги.


          1. lorc
            24.03.2022 16:24
            +3

            Все компиляторы давно умеют генерировать .o.d файлы со списком зависимостей. Этот файл просто инклудится в Makefile и он чудесным образом начинает отслеживать изменения в заголовочных файлах.


            1. mayorovp
              24.03.2022 19:29
              +3

              О, ну наконец-то такая возможность появилась.


              Осталось только чтобы был хоть какой-нибудь способ узнать о ней, кроме чтения мана от корки до корки или комментариев 5 уровня на Хабре.


              1. lorc
                24.03.2022 19:43
                +1

                Ммм... Ну мне лень ковырять историю gcc, но я уверен что этой возможности не менее 30 лет. Первый попавшийся пост об этой фиче написан аж в 2000 году: http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/

                И используется эта штука в каждом первом проекте на C. Так что я вообще не понимаю как вы ее пропустили.


                1. unsignedchar
                  24.03.2022 20:54
                  +1

                  Элементарно. Use cmake, например ;)


                1. mayorovp
                  24.03.2022 23:35

                  Элементарно: не было у меня проектов на Си. Что, к слову, является следствием в том числе пропущенной информации об этой возможности.


                  1. lorc
                    25.03.2022 12:16
                    -1

                    Если у вас не было проектов на С, то зачем так безапелляционно заявлять о том, когда какие фичи появились?

                    Я об этом, если что:

                    О, ну наконец-то такая возможность появилась.


    1. dark0ghost
      24.03.2022 16:33
      +1

      Тогда скорее cmake, ибо он легче поможет настроить external depends


  1. MinimumLaw
    24.03.2022 13:56
    +7

    $ sudo apt install build-essential

    Окажется сильно полезнее, нежели просто gcc. Для желающих есть еще мета-пакеты crossbuild-essential-[ARCH]. И приготовиться доставлять пакеты с суффиксом -dev.

    Остальное по вкусу и по потребности.


  1. Limows
    24.03.2022 14:04

    А где пункт "продать душу дьяволу" ?


  1. gdt
    24.03.2022 15:25
    +1

    А если у меня кеды как быть — тянуть весь гтк или что там сейчас?


    1. Limows
      24.03.2022 15:43
      +5

      Пользователи кедов должны страдать, разумеется :)


    1. lorc
      24.03.2022 16:25

      apt install emacs-lucid

      /s


    1. 13werwolf13
      25.03.2022 09:19

      kate конечно, сильно лучше gedit хотя по сути своей то-же самое


  1. 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 всё равно никуда.


    1. warlock66613
      25.03.2022 02:13

      Но первым делом надо ставить mc ranger и vim


      1. kovserg
        25.03.2022 09:08

        для работы с файлами mc, ncdu, fdups, rsync, find, fatrace, mount, df, tar, 7z, dd, file, mimeopen
        про ranger ничего не могу сказать.


        1. unsignedchar
          25.03.2022 09:46

          К программированию на C эти вещи как то слабо относятся.


    1. red_dragon
      25.03.2022 07:26

      Без vim вполне себе куда. mc вообще не первым делом, и даже не вторым. Даже не могу вспомнить, когда его запускал в последний раз. VS Code, однозначно must have для программиста. Пожалуй это лучшее произведение Microsoft, что я видел в своей жизни.


      1. kovserg
        25.03.2022 09:09

        Еще есть вариант без телеметрии vscodium.com


        1. red_dragon
          25.03.2022 09:33

          Согласен. Можно сразу без телеметрии. Или отключать оную в оригинале. Но для комментариев к данной статье, это перебор. Нам здесь объясняют, как установить gcc без dev tools и gedit как редактор кода. И, главное, как скомпиллировать "Hello world", без всяких там ключей. Ну, если мы осилили установку Linux, конечно.


          1. unsignedchar
            25.03.2022 09:50

            В 2000 году, наверное, это могло быть актуально. А в 2022 программы на С можно прямо в браузере писать.


            1. red_dragon
              25.03.2022 10:42
              +1

              И это ещё ерунда. В 2022, школьные рефераты можно прямо на хабре писать.


  1. 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
    

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


    1. red_dragon
      25.03.2022 09:39

      Всё же удобнее через make. "chmod +x ./a.out" в принципе не нужен, gcc сам помечает файл исполняемым.


  1. 2chevskii
    25.03.2022 02:13
    +5

    Ничего не хочу плохого сказать ни про gedit, ни про vim и прочие "классические" инструменты, в которых писали ещё издревле, но вот почему бы новичкам не начинать сразу с юзер-френдли программ? Тем более, что они есть - vscode и clion, например. Все таки dx очень важен, особенно на первых порах, когда человеку ещё только предстоит адаптироваться к экосистеме языка.


    1. 13werwolf13
      25.03.2022 09:21
      -1

      назвать vscode и clion юзерфрендли это сильно..

      100500 функционала который новичку понадобится не скоро, жор памяти, инородный системе визуал.. ну такое себе. тогда уж qt-creator больше подойдёт.

      вот когда новичёк перестанет быть новичком тогда и clion станет ему другом

      а вообще начинать я бы предложил с консольки, чтобы в будущем тыкая, условно, на кнопку debug он знал что же там под капотом запускается и с какими флагами.


  1. red_dragon
    25.03.2022 07:46
    +2

    Статья вызывает невольный внутренний возглас: "А на хабр ли я попал!".