Разработка библиотек в среде Lazarus

Автор jorra, 23.04.14, 22:11:27

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

jorra

[Перепост сюда моей записи http://jorra-jorra.livejournal.com/46547.html]

[использовались версии продуктов: КОМПАС LT v12, Lazarus - 1.0.4]

Очень обрадовало, что к КОМПАСу прилагается SDK в т.ч. и под любимую Delphi. Но уже давно её не использую просто по причине платности, ведь появился реальный конкурент - Lazarus. Во-первых, freeware, во-вторых, - по возможностям же практически идентичен (а кое-в чём заметно превосходит) Delphi. Хотя, равно, и корявый немного.
Т.к тема бесплатности софта для разработки актуальна, то думаю, мой опыт по адаптации SDK КОМПАСа для Delphi под Lazarus кому-нибудь пригодится. Хотя бы даже чтоб не гулговать десятки статей и постов на каждую ошибку компилятора, как это делал я.

Пишу списком, всё что на данный момент обнаружил.

1) Для начала стоит добавить в папку с примером из набора SDK (или с вашим проектом) файлы из папки Include (все файлы *.pas). Чтобы при преобразовании проекта у Lazarus'а не возникало лишних вопросов. Или же добавить эту папку в настройках Lazarus'а.

2) Первым делом необходимо преобразовать проект Delphi в проект Lazarus. Это делается соответствующей командой в меню Сервис. На этом этапе следует иметь в виду, что у контролов Lazarus'а (LCL) отсутствуют некоторые дельфячьи свойства, поэтому их придётся удалить, или же в дальнейшем дописать аналоги самостоятельно. Но таких, к счастью, очень немного.

3) В некоторых файлах из папки Include SDK (например, LIBdb.pas) почему-то имеется синтаксическая ошибка - после объявления функции в конце пропущена точка с запятой. Косяк разработчиков, не Lazarus'а. Придётся исправлять самостоятельно.

4) Почти во всех модулях из папки Include имеются ссылки (в секции Uses) на модули OleCtrls и StdVCL, которые отсутствуют в Lazarus'е. Первый можно заменить на Ole2 (судя по составу; по крайней мере, кушает успешно), а вторую ссылку можно вобще удалить.

5) Ресурсы. Примеры из SDK имеют объявления вида
{$R 'Cube2.res' 'Cube2.rc'}
и Lazarus ругается на отсутствующий файл *.res. Лечится удалением неправильного объявления с *.res (т.е. получается {$R 'Cube2.rc'}).

6) Ещё ресурсы. Для примеров из SDK выдаётся сообщение вида
gaykaLT.lpr(35,1) Error: Error while compiling resources. Compile with -vd for more details. Check for duplicates.
Оказалось, что в примерах из SDK то ли не правильная структура файла *.rc, то ли всётаки не их вина... В общем, сработала следующая методика. 1) Файл *.rc из примера переименовываем в *.dat. 2) Создаём текстовый файл XXX.rc (где XXX - название проекта, или же как он указан у вас в ссылке $R), с единственной строкой вида
MYDATA RCDATA "XXX.dat"
, где XXX - см. выше, имя файла *.dat.
После этого линковщик успешно линкует ресурсы. Вроде бы - по крайней мере, не ругается.

7) Если проект успешно скомпиллирован, начинает линковаться, но выдаёт ошибку вида
gaykaLT.lpr(35,1) Error: Undefined symbol: WSRegisterMainMenu
(далее идёт штук 40-50 ненайденных символов с префиксом WS*, и ссылаются все ошибки на конец главного файла проекта) - как пишут в Сети (и реально помогло), надо подставить ссылку в разделе Uses на модуль Interfaces. Эта ссылка, видимо, требуется только в главном файле проекта, *.lpr. Также опыт показал, что ссылки на некоторые интерфейсные модули (например, на InterfaceBase даже не в главном файле проекта, а в "главном" модуле) также устраняет данную ошибку.

8) В случае примеров из папки SDK, даже если пример успешно скомпилируется, – скорее всего, и название библиотеки в меню, и выдаваемые ею сообщения (может и названия контролов и т.п. – не тестил) будут выглядеть, как вариант "кракозябр":
РС,Рѕ С...СѓР№РЅСЏ
В этом случае следует добавить строчку
{$codepage UTF8}
в самое начало, видимо, каждого модуля, где имеются выводимые на экран тем или иным образом строчки в кириллице.

9) [Случай только для бесплатной версии КОМПАСа – LT, хотя всем программистам стоит иметь в виду] После успешной сборки и компиляции загрузка в библиотеку выдаёт ошибку 126:
<имя файла.dll>: error 126
и затем нечто вроде "Ошибка подключения библиотеки XXX", где XXX - имя файла *.dll. В этом случае необходимо добавить в проект глобальную директиву компилятора
-d__LIGHT_VERSION__
(эта строка добавляется в Параметры проекта => Параметры компилятора => Другое). Обратите внимание, что пишется без пробела (это важно!). Как вариант, можно добавлять как обычный $DEFINE, но тогда в каждый соответствующий модуль отдельно.

10) Application.Hanlde...
Допишу потом!

Пока всё. По мере освоения SDK постараюсь описать другие грабли, костыли и косяки.
Надеюсь, кому-нибудь поможет, но уж и вы - отпишите о своих достижениях.
Также, конечно же, пишите свои варианты исправления косяков и устранения разницы между Delphi и Lazarus.
+ Благодарностей: 2

Valid

Всё работает! Большое спасибо за проделанную работу!

Alexander982


Пробовал скомпилировать примеры библиотеки из Компас V13 х86 с помощью lazarus-2.0.12-fpc-3.2.0-win64 и lazarus-2.0.12-fpc-3.2.0-cross-i386-win32-win64 (для компиляции под win32 для процессора i386) на Windows 7 x64. В целом всё успешно, но были следующие проблемы:
1) конвертация как описано в п.2 в посте выше не сработала - fatal error и в логах никакого объяснения причин. Пришлось создавать проект с нуля - тип проекта "Библиотека". В инспекторе проекта в "Требуемые пакеты" добавляем пакет "LCLBase". Содержимое файла *.lpr заменяем на содержимое файла *.dpr из проекта Delphi. Меняем директиву {$E rtw}  на {$EXTENSION 'rtw'}.  Копируем файл модуля pascal (например для step1 файл 'step11.pas') в новый проект и добавляем его в инспекторе проекта (возможно понадобится конвертировать файл в кодировку utf-8). В настройках проекта - "Параметры компилятора" - "Пути" необходимо указать путь к папке SDK/Include и SDK/lib. Поскольку у меня Компас 32-х битный еще в "Параметры компилятора" - "Настройка и целевая платформа" поставил Операционная система - win32, Целевое семейство процессора - i386.
2) хак из п.6 в посте выше про ошибку "Error: Error while compiling resources. Compile with -vd for more details. Check for duplicates.", срабатывает но в итоге компас не видит ресурсы. Похоже что ошибки связаны с различием в синтаксисе rc-файла в Delphi и Lazarus(который похоже использует инструменты binutils линукса). Чтобы устранить ошибки необходимо править файлы. В секциях RCDATA после каждого идентификатора надо ставить запятую. Для примера в файле "step2.rc" имеется:
// Определение состава панели
BAR_2 RCDATA
{
  1 // Пересечь прямые
  2 // Пересечь кривые
 3 // Пересечь отрезок и дугу
 4 // Касательная из точки
 5 // Касательная под углом

 END_OF_RESOURCE_TABLE
}


Нужно проставить запятые

// Определение состава панели
BAR_2 RCDATA
{
  1, // Пересечь прямые
  2, // Пересечь кривые
 3, // Пересечь отрезок и дугу
 4, // Касательная из точки
 5, // Касательная под углом

 END_OF_RESOURCE_TABLE
}

Таким образом исправить во всех секциях RCDATA. После этих исправлений линковщик успешно линкует ресурсы.

3) Директива {$codepage UTF8}, как описано в п.8 в посте выше, почти не помогает. Необходимо также заменить вызовы функций таких как ksMessage, на их варианты для юникода (например ksMessageW). После таких замен директива {$codepage UTF8} дает эффект только для выводимых с помощью ksMessageW окон сообщений. Имя библиотеки, выводимое с помощю функции LIBRARYNAME, имеет проблемы с кодировкой. Все строки из rc-файла также остаются нечитаемые. Замена строк в  rc-файле на L"\x0421\x043f\x0440\x0430\x0432\x043a\x0430" как рекомендуется на https://docs.microsoft.com/en-us/windows/win32/menurc/stringtable-resource ничего не дает. Пришлось пока заменить всё на латиницу.

Если кто смог решить проблему с кодировкой отпишитесь пожалуйста.

graphdark

Сейчас Rad Studio comuniti edition есть. А компас не работает под линухом, только костыльно и крайне криво. Может что и изменилось. но 17 версию под вайном еле запустил. Так что смысла в лазарусе я шибко много не вижу для этих целей.
+ Благодарностей: 1

Alexander982

Цитата: graphdark от 05.04.21, 11:27:33Сейчас Rad Studio comuniti edition есть. А компас не работает под линухом, только костыльно и крайне криво. Может что и изменилось. но 17 версию под вайном еле запустил. Так что смысла в лазарусе я шибко много не вижу для этих целей.
Я использую сборку лазарус для Windows. Так же есть и для других платформ. На линуксе пришлось бы ещё возится с кроскомпиляцией.

Проблема кодировки со строками из rc-файла у меня была т.к. я зачем-то преобразовал файл в UTF-8. Как только вернул обратно в CP1251 всё стало отображаться на русском. Остается проблема со строками в исходном коде, но там можно использовать функции API которые работают с юникодом (например ksMessageW и т.п.).

graphdark

Цитата: Alexander982 от 05.04.21, 20:17:32Я использую сборку лазарус для Windows. Так же есть и для других платформ. На линуксе пришлось бы ещё возится с кроскомпиляцией.

Проблема кодировки со строками из rc-файла у меня была т.к. я зачем-то преобразовал файл в UTF-8. Как только вернул обратно в CP1251 всё стало отображаться на русском. Остается проблема со строками в исходном коде, но там можно использовать функции API которые работают с юникодом (например ksMessageW и т.п.).
О том и речь. Что бесплатный rad studio делает это все из коробки и гораздо быстрее. А даже если скомпилировать библиотеку в линухе, толку 0. Канпас под линух не работает. А жаль.

Alexander982

Вроде и не писал что пытаюсь скомпилировать библиотеку с линукса :) Лазарус установлен у меня на Windows 7 х64.

Единственная проблема, на текущий момент с Лазарус это то, что исходники проекта у него в кодировке UTF-8, а компас (по крайне мере v13, который у меня) похоже требует строки в кодировке CP1251. Поэтому нужно немного больше усилий что бы отображать русский текст. А так в целом всё работает без изменений если еще в файле проекта прописать {$MODE DELPHI}.