Пишем на языке С/C++ в Linux под KolibriOS

Вступление


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


Данная статья — инструкция по настройке toolchain'а для Linux.


Начнем


Для этого нужно скачать:



Создадим папку /home/USER/autobuild (где USER — имя пользователя). Далее создадим ссылку:


sudo ln -s /home/USER/autobuild /home/autobuild

Перейдем в /home/autobuild. Создадим дерево каталогов /home/autobuild/tools/win32. Скачаем вышеупомянутый toolchain и распакуем в /home/autobuild/tools/win32. Далее скачаем SDK с FTP и распакуем поверх /home/autobuild/tools/win32/lib и /home/autobuild/tools/win32/mingw32/lib (в двух местах — потому что в makefile'ах используется и тот и тот путь). Далее самое интересное.


Скачивание SVN


Выделите одну папку. Я буду называть здесь ее как /home/USER/KOS_SVN. Выполните в терминале:


cd /home/USER/KOS_SVN
svn co svn://kolibrios.org

Нужно подождать пока выкачается весь SVN.


Подготовка к компиляции


Чтобы была возможность использовать инструменты, надо прописать путь к папке с инструментами в переменную окружения "PATH" в файле "/etc/environment".


sudo nano /etc/environment

И добавить в конце файла:


:/home/autobuild/tools/win32/bin

Еще нужно скачать библиотеку libisl:


wget http://board.kolibrios.org/download/file.php?id=8301libisl.so.10.2.2.7z && 7z x file.php?id=8301libisl.so.10.2.2.7z

sudo mv libisl.so.10.2.2 /usr/lib/x86_64-linux-gnu && sudo ln -s /usr/lib/x86_64-linux-gnu/libisl.so.10.2.2 /usr/lib/x86_64-linux-gnu/libisl.so.10

sudo chmod go-w /usr/lib/x86_64-linux-gnu/libisl.so.10 && sudo chmod go-w /usr/lib/x86_64-linux-gnu/libisl.so.10.2.2

Еще одна известная проблема:
/home/autobuild/tools/win32/bin/../libexec/gcc/mingw32/5.4.0/cc1: error while loading shared libraries: libmpfr.so.4: cannot open shared object file: No such file or directory


Исправляется ссылкой:


sudo ln -s /usr/lib/x86_64-linux-gnu/libmpfr.so.6 /usr/lib/x86_64-linux-gnu/libmpfr.so.4

Компиляция


Примеры программ лежат в /home/USER/KOS_SVN/contrib/sdk/samples. Возьмем к примеру Cairo. Зайдем в папку и скажем make. Если все удачно, в папке появится бинарник cairo, который запускается в KolibriOS.


Еще один пример


hello.c:


#include <kos32sys.h>

char* title = "Window";

void _draw_window(){
    BeginDraw();
    DrawWindow(100,100,400,200,title,0x80ffffff,0x13);
    EndDraw();
}

int main()
{
    _draw_window();
    for (;;)
    {
       switch(get_os_event())
       {
          case 1:
             _draw_window();
             continue;
          case 2:
             // key pressed, read it and ignore
             get_key();
             continue;
          case 3:
             // button pressed; we have only one button, close
             if(get_os_button() == 1) return 0;
             continue;
       }
    }
}

Для него пойдет такой Makefile (замените пробелы на tab'ы):


CC = kos32-gcc
LD = kos32-ld 

SDK_DIR:= /home/USER/KOS_SVN/contrib/sdk

LDFLAGS = -static -S -nostdlib -T $(SDK_DIR)/sources/newlib/app.lds --image-base 0

CFLAGS = -c -fno-ident -O2 -fomit-frame-pointer -fno-ident -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32

INCLUDES= -I $(SDK_DIR)/sources/newlib/libc/include
LIBPATH:= -L $(SDK_DIR)/lib -L /home/autobuild/tools/win32/mingw32/lib

SOURCES = hello.c   \
      $(NULL)

OBJECTS =  $(patsubst %.c, %.o, $(SOURCES))

default: hello.kex

hello.kex: $(OBJECTS) Makefile
    $(LD) $(LDFLAGS) $(LIBPATH) --subsystem native -o hello.kex $(OBJECTS) -lgcc -lc.dll
    objcopy hello.kex -O binary

%.o : %.c Makefile $(SOURCES)
    $(CC) $(CFLAGS) $(INCLUDES) -o $@ $<

Кульминация: C++


Пример с C++ есть в /contrib/sdk/samples/cpp_hello. Там консольный пример с cout'ами и с console.obj. Там же есть и makefile.


Полезные темы


http://board.kolibrios.org/viewtopic.php?t=3535
http://board.kolibrios.org/viewtopic.php?f=33&t=1218
http://board.kolibrios.org/viewtopic.php?t=3418
http://board.kolibrios.org/viewtopic.php?t=3075


Библиотеки


В KolibriOS есть множество библиотек, но начинающим трудно их использовать. Статья: https://habr.com/ru/post/528048/


Если возникли какие-либо проблемы, пишите в комментариях.

Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 7

    0

    Ну-у-у, написать и скомпилировать это хорошо.


    Но запускать и тестить приложение по мере работы очень муторно. Я пока так и не придумал хороший метод тестирования.

      0
      Аналогично. Я использовал следующий способ: если нет в рабочем каталоге образа KolibriOS — скачиваем с помощью wget, удаляем из образа всё лишнее, добавляем в образ свежескомпилированное приложение, запускаем qemu (https://github.com/Albom/e80/blob/master/makefile). Но запуск приложения при этом — вручную (можно исправить), доступные средства отладки — только для относительно простых программ. Как вариант — развитие дистрибутива KolibriOS-DE (https://github.com/turbocat2001/KolibriOS-DE). По моему мнению, у этого дистрибутива есть потенциал, но я бы сделал бы немного по-другому.
        +1

        В QEMU можно использовать общие папки:


        qemu-system-i386 -m 256 -boot d -cdrom /home/USER/kolibri.iso -usb -usbdevice tablet -hda fat:rw:SOME_FOLDER

        Насчет C++ сейчас будет
        Кстати, что не так с KolibriDE?

          0

          Через общие папки неудобно. Потому что файлы не обновляются в реальном времени. В конце концов я так и работал, когда программировал для KollibriOS, но надо рестартировать виртуалку каждый раз, когда меняешь файл в папке.

          0

          Так же есть эмулятор kex для linux от tsdima. Собирается из исходников на github, и устанавливается как там в readme. Только программы с newlib пока не получалось у меня завести

            0

            А kex, разве поддерживается?


            Когда пробовал его несколько лет назад, то почти ничего не работало, потому что ядро внутри было очень старое. Были какие-то ограничения, которые не позволили запускать на него.


            Может быть стоит посмотреть опять...

              0

              У меня запускались все программы (на FASM, TinyC, C--), кроме программ на newlibc. Иногда глюки с отображением бывают, но редко. Поэтому программы на newlib я проверяю в qemu с общими папками.

      Only users with full accounts can post comments. Log in, please.