Board.KolibriOS.org http://board.kolibrios.org/ |
|
C + KolibriOS.lib http://board.kolibrios.org/viewtopic.php?f=33&t=3669 |
Page 1 of 1 |
Author: | 0CodErr [ Wed Feb 14, 2018 11:54 pm ] |
Post subject: | C + KolibriOS.lib |
Здесь есть один нюанс: пришлось объявить фиктивный union в некоторых структурах. В частности Code: struct TSize{А так она объявлена изначально Code: TSize = Packed Record А дело всё в том, что в отличие от си-шных компиляторов, компилятор Delphi ведёт себя более рационально: если возвращаемое значение умещается в регистре, то оно и возвращается в регистре, причём, даже если это структура. Си-шные же компиляторы структуры в регистре не возвращают. Было проверено в компиляторах Borland C++, Open Watcom, GCC, MSVC. В стандарте я ничего не нашёл по этому поводу. В KolibriOS.lib не так много функций, возвращающих значения в структурах, вот они: Code: Function GetKey: TKeyboardInput; StdCall; External 'KolibriOS';Из них только эти возвращают структуры, не помещающиеся в регистре: Code: Function GetScreenWorkingArea: TRect; StdCall; External 'KolibriOS';для них способ с union работать не будет. Сначала пример для Borland C++ Необходимые инструменты Code: BCC32 — компилятор Borland C++Собирается он вот так(make.bat): Code: Set NAME=test%KolibriOS% — директория, в которой находится KolibriOS.lib, которую можно взять из темы Delphi7 examples viewtopic.php?f=33&t=3469 LScript — линкер-скрипт для GNU-линкера LD В результате получаем окно с выведенным в него текстом: Attachment: C+KolibriOS.lib.png [ 4.17 KiB | Viewed 2836 times ] Attachment:
|
Author: | Leency [ Thu Feb 15, 2018 11:42 am ] |
Post subject: | Re: C + KolibriOS.lib |
У тебя еще есть доступ к kolibri-n.org? Буду благодарен если зальешь. |
Author: | 0CodErr [ Fri Feb 16, 2018 6:16 pm ] |
Post subject: | Re: C + KolibriOS.lib |
Leency, добавить пример можно. Насчёт описания к нему — не знаю, может нужно что-то уточнить. Хорошо бы кто-то ещё попробовал. (Например, ты пробовал BigSample viewtopic.php?f=2&t=3587 , и у тебя он собрался и работал.) Другие компиляторы декорируют stdcall функции. Например, Open Watcom по умолчанию декорирует stdcall функции, добавляя перед именем функции знак подчёркивания и суффикс "@size" после имени _FunctionName@size. Существует флаг компилятора Code: zz remove "@size" from __stdcall function namesно вот флага, убирающего подчёркивание я не нашёл. Можно решить вопрос добавлением такой прагмы в исходный код Code: #pragma aux __stdcall "*" В GCC наоборот, есть -fno-leading-underscore(убирает подчёркивание), но флаг убирающий "@size" -kill-at работают только для dll. C dlltool аналогично. С MSVC похоже тоже есть такая проблема. Не хотелось бы изобретать велосипед, нужно всего лишь -kill-at и -fno-leading-underscore но чтобы работало для объектных файлов MSCOFF, а не только для dll. Я, конечно, поискал немного в сети. Некоторые советуют сделать dll и вызывать функции оттуда, некоторые советуют сделать def-файл(это дополнительная работа, функций может быть 100500). Но немало тех, кому нужно было прилинковать именно объектник, а dll и def-файл по каким-то причинам не подходят. Ну в общем, я ещё немного поищу, если не найду, то придётся сделать для этого мини тулзу. В принципе прогуляться по таблице символов — это не проблема, именно это и происходит в утилите CoffDump viewtopic.php?f=9&t=3577 Думаю, что это могло бы пригодиться даже не только здесь для KolibriOS. Вот так я собирал с помощью Open Watcom Code: Set NAME=testключ -s для компилятора WCC386 означает "remove stack overflow checks". LScript в данном случае немного другой, так как компилятор WCC386 создаёт секции с другими названиями(CONST, CONST2) и функция Main имеет в конце знак подчёркивания Main_ Attachment:
|
Author: | Leency [ Fri Feb 16, 2018 6:38 pm ] |
Post subject: | Re: C + KolibriOS.lib |
BigSample я когда-то пробовал и он у меня собирался. |
Author: | 0CodErr [ Mon Feb 26, 2018 7:05 pm ] | ||
Post subject: | Re: C + KolibriOS.lib | ||
Чтобы собрать пример на Си с помощью GCC/MSVC была создана крохотная утилита KillAt viewtopic.php?f=2&t=3673 Если использовать ключ -fno-leading-underscore для GCC, то в линкер-скрипте LScript вместо "_Main" следует использовать "Main". Потом вызвать KillAt без ключей, вот так: Code: GCC -fno-leading-underscore -c %NAME%.c -o %NAME%.objИли можно запустить утилиту KillAt с ключом -L Code: GCC -c %NAME%.c -o %NAME%.objдля MSVC должно быть аналогично.
|
Page 1 of 1 | All times are UTC+03:00 |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |