OberonCore https://forum.oberoncore.ru/ |
|
CPCC - сборка исполняемого файла https://forum.oberoncore.ru/viewtopic.php?f=34&t=5697 |
Страница 1 из 2 |
Автор: | kekc_leader [ Воскресенье, 08 Май, 2016 02:25 ] | ||
Заголовок сообщения: | CPCC - сборка исполняемого файла | ||
Я решил опробовать CPCC (консольный компилятор Компонентного Паскаля для Линукса, подсистема Блэкбокса). https://sourceforge.net/projects/cp-dev/ Тут я расписываю всё очень подробно в надежде на то, что кому-то в будущем эта писанина поможет разобраться, как пользоваться CPCC. Документация, увы, практически отсутствует. Долго пытался понять, почему не компилируется проект с тремя файлами, один из которых - внешний модуль. Оказалось, что достаточно этот внешний модуль просто включить в список IMPORT (в другом модуле, где это нужно), а я ещё дописывал его в список LinkedMods в prj-файле: Код: LinkedMods=Kernel$+ Math ... Init Out GraphSdl GraphLib GraphTest# (GraphSdl у меня - это внешний модуль.)Чтобы скомпилировать этот компонент из трёх файлов, мне потребовалось три PRJ-файла. Иначе оно ругается: "Error #152: symbol file of imported module not found". Порядок сборки такой: Код: ./cpcc GraphSdl.prj # Тут оно ругается в конце, но без этой строчки никак. Прилагаю к сообщению все 6 файлов (3 cp и 3 prj). Вообще, всё это ненормально. Может, доделаем компилятор-то? Такой компилятор, но доведённый до ума, оказал бы незаменимую помощь при продвижении Оберона в массы../cpcc GraphLib.prj # Создаётся лишний файл - libgraphlib.so, но без этого тоже никак. ./cpcc GraphTest.prj В итоге, я смог без каких либо дополнительных проблем из линуксовской консоли собрать динамическую библиотеку (SO-файл), экспортирующую процедуру Do модуля GraphTest (кстати, она так и называется - "Do", а не, например, "GraphTest_Do", как было бы в VOC или OO2C, но это, пожалуй, хорошо). Список экспортируемых SO-файлом процедур можно получить командой: Код: nm -d libgraphtest.so Затем я создал файл "prog.c": Код: extern void Do(); и скомпилировал его командой:int main() { Do(); return 0; } Код: gcc -o prog -lgraphtest -L. prog.c (-lgraphtest добавляет файл libgraphtest.so, а -L. указывает, что этот файл следует искать также и в текущем каталоге.)Появился исполняемый файл prog, который замечательно работает, но только запускать его надо вот так: Код: env LD_LIBRARY_PATH=. ./prog или вот так:Код: export LD_LIBRARY_PATH=. иначе он ругается:./prog Код: ./prog: error while loading shared libraries: libgraphtest.so: cannot open shared object file: No such file or directory что очень тупо Дальше я сделал следующее: в модуль GraphTest (Graph/Mod/Test.cp) добавил секцию BEGIN: Код: MODULE GraphTest; а из файла "prog.c" убрал всё лишнее, оставив только:... BEGIN Do END GraphTest. Код: int main() { return 0; } Это работает, то есть после точно такой же сборки исполняемого файла через GCC программа работает также. Получается, что SO-файл сам запускает процедуру Do внутри себя. Внимание вопрос. Как сделать так, чтобы SO-файл можно было запускать непосредственно? Или как сделать так, чтобы получался не SO, а ".a"-файл, то есть статическая библиотека? Или ещё один вариант вопроса: как дописать ElfLinker или LinLinker или что-то ещё и где его взять? Вроде бы, линуксовский SO-файл (имеющий формат ELF) не очень отличается от исполняемого бинарника формата ELF. Пока искал в интернете информацию по этому поводу, с удивлением обнаружил, что некоторые SO-файлы можно даже запускать из консоли после chmod +x и тогда запускается процедура с определённым названием, что-то вроде __ldd_main...
|
Автор: | Иван Денисов [ Воскресенье, 08 Май, 2016 05:02 ] | ||
Заголовок сообщения: | Re: CPCC - сборка исполняемого файла | ||
LinLinker есть в Freenix сборке Блэкбокса. http://oberoncore.ru/projects/bb-freenix Вот прикладываю мой пример кросскомпиляции. Я хотел его "причесать" перед тем как выкладывать, но раз тема актуальна, то выкладываю как есть. Смотрите файл ObxIcosphere, там в конце файла все команды для компиляции. В системе должны стоять пакеты libsdl2-dev libsdl2-ttf-dev либо в 64-битной системе libsdl2-dev:i386 libsdl2-ttf-dev:i386
|
Автор: | prospero78 [ Воскресенье, 08 Май, 2016 09:49 ] |
Заголовок сообщения: | Re: CPCC - сборка исполняемого файла |
Для запуска как исполняемого файла я бы написал на Си заглушку-вызов *.so, а сам *.so не компилировать ,а оставить в виде объектного файла с предопределённой процедурой входа (обязательной). Вот только непонятно, как эту самую объектную сброку сохранить, т. к. компилятор КП однопроходный. Можно, конечно, Mono использовать, но это уже несколько не то. |
Автор: | kekc_leader [ Воскресенье, 08 Май, 2016 12:03 ] |
Заголовок сообщения: | Re: CPCC - сборка исполняемого файла |
Иван Денисов писал(а): LinLinker есть в Freenix сборке Блэкбокса. Сейчас посмотрю. А почему это "кросскомпиляция"? Разве компиляция происходит не на самом Линуксе?prospero78 писал(а): Для запуска как исполняемого файла я бы написал на Си заглушку-вызов *.so... Так ведь читайте дальше, я так и сделал. Но это только временное "решение". Кстати, SO-файл вроде как нельзя скомпилировать (когда он уже скомпилирован), то есть нельзя его переделать в статическую библиотеку, нельзя переделать в исполняемый файл, во всяком случае GCC этого не умеет, а в интернете советуют дизассемблировать SO-файл и потом пересобрать.Я немного не понял, зачем нам мог бы понадобиться Mono и как мешает однопроходность компилятора в данном случае? |
Автор: | Иван Денисов [ Воскресенье, 08 Май, 2016 12:14 ] |
Заголовок сообщения: | Re: CPCC - сборка исполняемого файла |
kekc_leader писал(а): Иван Денисов писал(а): LinLinker есть в Freenix сборке Блэкбокса. Сейчас посмотрю. А почему это "кросскомпиляция"? Разве компиляция происходит не на самом Линуксе?На винде он тоже будет работать, я пробовал. Только надо закомментировать Libc. Получится кросскомпиляция. Ну а сейчас я использую LinLinker на Linux версии, да. |
Автор: | kekc_leader [ Воскресенье, 08 Май, 2016 13:34 ] |
Заголовок сообщения: | Re: CPCC - сборка исполняемого файла |
Иван Денисов писал(а): Вот прикладываю мой пример кросскомпиляции. Блин, классная программа! Файл icosphere запустился без проблем (у меня Дебиан, i686), попробовал ради интереса запустить Icosphere.exe через Wine, появилось пустое окошко программы и вылетел Trap #038 (связанный с OpenFont). Вопрос: А почему каталог Obx находится в каталоге Sdl2/Mod? |
Автор: | prospero78 [ Воскресенье, 08 Май, 2016 15:58 ] |
Заголовок сообщения: | Re: CPCC - сборка исполняемого файла |
Mono полезен тем, что под ним, теоретически, должен взлететь Garden Point. На сколько я понимаю, компиляция идёт средствами Mono/Net, а не встроенным компилятором, как в КП. А однопроходность КП/ББ мешает тем, что сразу даёт кодовые файлы, и символьные, как "вещь в себе". Уже ни к чему не подцепить. |
Автор: | kekc_leader [ Воскресенье, 08 Май, 2016 17:14 ] |
Заголовок сообщения: | Re: CPCC - сборка исполняемого файла |
prospero78 писал(а): А однопроходность КП/ББ мешает тем, что сразу даёт кодовые файлы, и символьные, как "вещь в себе". Уже ни к чему не подцепить. В книге «Построение компиляторов» Вирт пишет, что для перенацеливания компилятора достаточно поменять модуль OSG. В Блэкбоксе он называется DevCPV486 и подлючен он вот так:Код: IMPORT ... DevCPV := DevCPV486; То есть перенацеливание по замыслу происходит простой заменой DevCPV486 на другой модуль. |
Автор: | kekc_leader [ Воскресенье, 08 Май, 2016 19:22 ] |
Заголовок сообщения: | Re: CPCC - сборка исполняемого файла |
Код: ^Q DevCompiler.CompileThis GraphSdl ^Q DevCompiler.CompileThis GraphLib ^Q DevCompiler.CompileThis GraphTest ^Q GraphTest.Do <--- это работает ^Q LinLinker.Link graphtest := Kernel$+ Math Files Strings Log Dialog LinLog Services GraphLib Fonts Ports StringsUtf GraphTest Из последней строчки я убрал GraphSdl из списка, потому что LinLinker говорил, что не может найти кодовый файл Graph/Code/Sdl.ocf (видимо, потому что это внешний модуль и кодовый файл при его компиляции не создаётся). Не уверен, что мне нужны все эти модули, но я их не убирал. Исполняемый файл graphtest создаётся. но при его запуске выдаёт на стандартный вывод следующее: Код: invalid import list Но модуль GraphTest использует GraphLib, и в список я его добавил. Что я делаю не так?Incorrect module: GraphLib Ещё два сторонних вопроса: 1) Можно сам LinLinker скомпилировать в отдельный исполняемый файл и запускать из консоли? Или как-то его использовать через CPCC? 2) Как с клавиатуры поставить этот символ в конце списка? В начале я знаю - CTRL+Q, а в конце маленький треугольничек как ставить? |
Автор: | Иван Денисов [ Воскресенье, 08 Май, 2016 20:30 ] |
Заголовок сообщения: | Re: CPCC - сборка исполняемого файла |
Забыли Out прилинковать, но вы его лучше замените на Log. Так как у Out "плохие" зависимости от каркаса. Его лучше вообще не использовать при работе с Блэкбоксом. Для дреугольничка нету комбинации клавиш и пункта меню. Я его копирую, но вместо него можно смело ставить другой коммандер. Еще плохо, что мы в этой ветке обсуждаем эти вещи. Получается оффтопик, нас забанят |
Автор: | Иван Денисов [ Воскресенье, 08 Май, 2016 20:36 ] |
Заголовок сообщения: | Re: CPCC - сборка исполняемого файла |
kekc_leader писал(а): 1) Можно сам LinLinker скомпилировать в отдельный исполняемый файл и запускать из консоли? Или как-то его использовать через CPCC? Вот тут есть как собрать консольный интерпретатор для Винды, который работает в том числе как компилятор. https://www.youtube.com/watch?v=3zFBDRwUxdE В линуксе проще Код: git clone http://gitlab.molpit.org/blackbox/freenix.git bbcb
cd bbcb/BlackBox ./switch-target `uname -s` Interp ./build echo "DevCompiler.CompileThis LinLinker LinLog" | ./blackboxc echo "LinLinker.Link graphtest := Kernel$+ Math Files Strings Log Dialog LinLog Services GraphLib Fonts Ports GraphTest" | ./blackboxc |
Автор: | Александр Ильин [ Воскресенье, 08 Май, 2016 20:40 ] |
Заголовок сообщения: | Re: CPCC - сборка исполняемого файла |
Иван Денисов писал(а): Для дреугольничка нету комбинации клавиш и пункта меню. А раньше (v1.5) был пункт меню в Tools:"Insert EndCommander" "*Q" "DevCommanders.DepositEnd; StdCmds.PasteView" "StdCmds.PasteViewGuard" |
Автор: | kekc_leader [ Воскресенье, 08 Май, 2016 23:17 ] |
Заголовок сообщения: | Re: CPCC - сборка исполняемого файла |
Иван Денисов писал(а): Забыли Out прилинковать Спасибо, прилинкую. Странно, что сообщение об ошибке такое. Или так и задумано? Она жалуется, что не хватает какого-то модуля, но не говорит какого, а говорит, где его не хватает ("в каком модуле")?Иван Денисов писал(а): Еще плохо, что мы в этой ветке обсуждаем эти вещи. Получается оффтопик, нас забанят Хаха, действительно могут забанить . Для такого незначительного вопроса постыдился открывать отдельную тему.Немного запутано получается. Freenix, выходит, тоже работает через консоль. Есть какая-то разница между ним и CPCC в функциональном плане? CPCC - это просто более старый проект или он в чём-то лучше? Код: echo "DevCompiler.CompileThis LinLinker LinLog" | ./blackboxc Чем исполняемый файл blackboxc отличается от исполняемого файла blackbox? Оба запускаются вроде бы одинаково. Ещё есть файлы ./run-BlackBox и ./run-Blackbox-2 . Вижу, что в run-Blackbox прописываются пути. Почему при консольной компиляции эти пути не нужны? Я извиняюсь, если в документации уже есть ответы на эти вопросы, но я не нашёл. Ещё есть сторонний вопрос про Блэкбокс в целом что ли. Кажется, я такое уже видел на этом форуме, но найти не получилось, поэтому не хочу открывать новую тему. Как в Блэкбоксе (в т. ч. на Линуксе) сделать, чтобы при загрузке Блэкбокса открывались какие-то определённые документы? Или как сделать, чтобы он восстанавливал закрытые окна при следующей загрузке? |
Автор: | Борис Рюмшин [ Понедельник, 09 Май, 2016 00:47 ] |
Заголовок сообщения: | Re: CPCC - сборка исполняемого файла |
kekc_leader писал(а): Ещё есть сторонний вопрос про Блэкбокс в целом что ли. Кажется, я такое уже видел на этом форуме, но найти не получилось, поэтому не хочу открывать новую тему. Как в Блэкбоксе (в т. ч. на Линуксе) сделать, чтобы при загрузке Блэкбокса открывались какие-то определённые документы? Или как сделать, чтобы он восстанавливал закрытые окна при следующей загрузке? http://oberoncore.ru/bbcc/subs/i21sys/start Конкретно i21sysDesktop оттуда можно посмотреть. Но есть и другие способы, если нужно всегда что-то конкретное открывать. Сейчас народ подскажет. |
Автор: | Иван Денисов [ Вторник, 10 Май, 2016 04:37 ] |
Заголовок сообщения: | Re: CPCC - сборка исполняемого файла |
kekc_leader писал(а): Чем исполняемый файл blackboxc отличается от исполняемого файла blackbox? Оба запускаются вроде бы одинаково. Ещё есть файлы ./run-BlackBox и ./run-Blackbox-2 . Вижу, что в run-Blackbox прописываются пути. Почему при консольной компиляции эти пути не нужны? Я извиняюсь, если в документации уже есть ответы на эти вопросы, но я не нашёл. Отвечаю в другой теме: viewtopic.php?f=134&t=5700#p96557
|
Автор: | kekc_leader [ Понедельник, 16 Май, 2016 02:44 ] | ||
Заголовок сообщения: | Re: CPCC - сборка исполняемого файла | ||
Спасибо за ответы. У меня почти получилось сделать то, что я хотел. odc-файлы компилируются и собираются в исполняемый файл (на Линуксе). В отличие от Freenix'а, CPCC компилирует cp-файлы, а не odc. Это исходные коды программ на Компонентном Паскале, но в сыром текстовом формате. Мне как раз это и нужно, а в Freenix'е этого нет. Я порылся немного в файлах (Dev/Mod/Compile.odc в Freenix и src/CompilerLib/CDev/Mod/Compiler.odc в CPCC. ) и обнаружил, что они очень похожи. В отличие от Freenix'а, в модуле CDevCompiler (это в CPCC) есть процедура CompileFile: Код: PROCEDURE CompileFile* (IN path: TString; OUT IOres: INTEGER): BOOLEAN; Она открывает заданный файл, подключает к нему считыватель (reader) и передаёт его процедуре Compile, которая почти аналогична процедуре Module в Freenix (см. сравнение на приложенном снимке). Видно, что делают они по сути одно и то же, но при этом сильно различаются по мелочам.1) Есть ли какой-то более-менее простой способ заставить Freenix компилировать модули из простых текстовых файлов? 2) Можно ли по-простому переконвертировать TXT-файл в ODC-файл? Мне приходит на ум либо использовать какой-то модуль, но выглядит это довольно запутанно (я не знаю, как потом этот файл сохранить и не будет ли этот модуль требовать какой-нибудь там подсистемы Views, которой нет в Freenix'е, и она мне и не нужна), либо сцеплять TXT-файл с двумя бинарными заглушками: одна в начале, другая в конце, чтобы получить простой ODC-файл. (Поменять переносы строк - не проблема.) А может быть, можно как-то иначе?
|
Автор: | Иван Денисов [ Понедельник, 16 Май, 2016 05:14 ] |
Заголовок сообщения: | Re: CPCC - сборка исполняемого файла |
kekc_leader писал(а): 1) Есть ли какой-то более-менее простой способ заставить Freenix компилировать модули из простых текстовых файлов?? Да, конечно! Есть ведь ConsCompiler Код: echo ConsCompiler.Compile('Lin/Mod', 'Dl.txt') | blackboxc Как скомпилировать множество файлов разом смотрите пример: http://gitlab.molpit.org/blackbox/freen ... terp/build Недавно еще я поправил описание первого примера, тут как раз объясняется про ConsCompiler http://gitlab.molpit.org/blackbox/freen ... es/console |
Автор: | kekc_leader [ Понедельник, 16 Май, 2016 11:13 ] |
Заголовок сообщения: | Re: CPCC - сборка исполняемого файла |
Здорово! Буду проверять. |
Автор: | kekc_leader [ Понедельник, 16 Май, 2016 21:23 ] | ||
Заголовок сообщения: | Re: CPCC - сборка исполняемого файла | ||
Скомпилировать получилось. Свою тестовую программку на SDL я скомпилировал почти без проблем, только пришлось позаниматься перебором вариантов списка модулей для «LinLinker.Link». В итоге получилось так: Код: echo "ConsCompiler.Compile('Graph/Mod', 'Sdl.cp')" | ./blackboxc echo "ConsCompiler.Compile('Graph/Mod', 'Lib.cp')" | ./blackboxc echo "ConsCompiler.Compile('Graph/Mod', 'Test.cp')" | ./blackboxc echo "LinLinker.Link grtest := Kernel$+ Math Files Strings Log GraphLib GraphTest" | ./blackboxc Получившаяся программа запускается и работает как надо и корректно завершается, только вот код выхода выдаёт 1, а не 0. С чем это может быть связано? Ещё одна проблема - если в программе использовать модуль Log, то на консоль ничего не выводится. Код: Log.String('Hello?'); Log.Ln В примере я вижу, что там подключается ещё и ConsLog, но когда я его подключаю, компиляция перестаёт компоноваться, даже если добавить ConsLog в список используемых модулей. Ошибка при запуске неправильно скомпонованной программы: Код: invalid import list Incorrect module: ConsLog Какие ещё модули надо подключить, чтобы снова заработала компоновка? И в общем случае, как можно узнать какие модули нужно подключать? Прикладываю к сообщению весь каталог с Freenix'ом, вместе с компонентом Graph. В архиве также находится скомпонованый файл grtest. Для перекомпиляции и перекомпоновки можно запустить баш-скрипт COMPILE_GRAPHTEST. На 46-й строке файла «Graph/Mod/Test.cp» стоит попытка вывода текста на консоль.
|
Автор: | Иван Денисов [ Понедельник, 16 Май, 2016 21:56 ] |
Заголовок сообщения: | Re: CPCC - сборка исполняемого файла |
ConsLog имеет достаточно много зависимостей, их легко увидеть в секции импорта модуля. Для простых приложений используйте LinLog. В том варианте, который у вас сейчас, он требует явной инициализации через вызов LinLog.Open в вашем модуле. Либо добавьте ему Open, как показано ниже, тогда достаточно будет его слинковать, он сам себя инициализирует. Код: PROCEDURE Open*; BEGIN Log.SetHook(hook); Dialog.SetShowHook(showHook) END Open; BEGIN NEW(showHook); NEW(hook); Open END LinLog. Автоматические построители зависимостей - вещь коварная, так как часто поведение приложения зависит именно от того, какие модули слинкованы. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |