Портирование проекта Windows -> Linux

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Портирование проекта Windows -> Linux

Сообщение Сквозняк » 06.12.2020 17:13:31

Снег Север писал(а):Говнокода со счетчиками бесконечных циклов точно не пишу. :mrgreen:

Ты вообще нихрена полезного не пишешь.

Снег Север писал(а):Основные рабочие проекты у меня на делфи.

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

Снег Север писал(а):Конечно, передача данных идет не через консоль и не через батники. Я не люблю секса в гамаке.


Даже создание каталога идёт через неё, этого не замечаешь пока винда не перекодирует путь неправильно.
Сквозняк
энтузиаст
 
Сообщения: 1110
Зарегистрирован: 29.06.2006 22:08:32

Re: Портирование проекта Windows -> Linux

Сообщение Снег Север » 06.12.2020 18:20:52

Сквозняк писал(а):Даже создание каталога идёт через неё, этого не замечаешь пока винда не перекодирует путь неправильно.

Ладно, продолжай бредить, мне это не интересно.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2995
Зарегистрирован: 27.11.2007 16:14:47

Re: Портирование проекта Windows -> Linux

Сообщение Сквозняк » 06.12.2020 18:26:26

Снег Север писал(а):
Сквозняк писал(а):Даже создание каталога идёт через неё, этого не замечаешь пока винда не перекодирует путь неправильно.

Ладно, продолжай бредить, мне это не интересно.

Слив засчитан, господин теоретик с выборочной слепотой.
Сквозняк
энтузиаст
 
Сообщения: 1110
Зарегистрирован: 29.06.2006 22:08:32

Re: Портирование проекта Windows -> Linux

Сообщение Снег Север » 06.12.2020 18:52:13

Сквозняк писал(а):Слив засчитан, господин теоретик с выборочной слепотой.

Митрофанушка ты наш, если ты не в курсе, что создает каталоги функция Windows API CreateDirectoryW, а не консоль, то о чём с тобой вообще говорить.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2995
Зарегистрирован: 27.11.2007 16:14:47

Re: Портирование проекта Windows -> Linux

Сообщение Сквозняк » 06.12.2020 20:22:04

Снег Север писал(а):
Сквозняк писал(а):Слив засчитан, господин теоретик с выборочной слепотой.

Митрофанушка ты наш, если ты не в курсе, что создает каталоги функция Windows API CreateDirectoryW, а не консоль, то о чём с тобой вообще говорить.

Тебя даже в тындексе забанили, не смог за годы выяснить как народ проги с либами в каталоге запускает, теперь про винапи жгёшь напалмом. Ты, так понимаю, изучил слитый в сеть код винды и точно знаешь что внутри системы команды обрабатываются по разному? Тестирование выявило что одинаково, но ты продолжай верить в хороший план виндовса.
Сквозняк
энтузиаст
 
Сообщения: 1110
Зарегистрирован: 29.06.2006 22:08:32

Re: Портирование проекта Windows -> Linux

Сообщение Снег Север » 06.12.2020 20:46:09

Сквозняк, продолжай жечь напалмом, только не ходи рядом с птицефабриками, а то все куры сдохнут от смеха... :mrgreen:
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2995
Зарегистрирован: 27.11.2007 16:14:47

Re: Портирование проекта Windows -> Linux

Сообщение Сквозняк » 06.12.2020 22:35:10

Маздайщик уже не знает как отмазать свою маздайку. У тебя нет аргументов, ты слился и пытаешься выехать на лохотроне. Но здесь вам не тут, не прокатит.
Сквозняк
энтузиаст
 
Сообщения: 1110
Зарегистрирован: 29.06.2006 22:08:32

Re: Портирование проекта Windows -> Linux

Сообщение wwswowsogon » 07.03.2023 13:26:15

Всем доброго времени суток!

Наконец дошли руки сделать то, о чём говорил в начале этой ветки.

Столкнулся с некоторыми проблемами с Indy, но там дело, видимо, в некорреткной установке пакета/файлов. Однако, есть более странная проблема.
Проект содержит несколько простеньких .dll, вида ldata.dll. ldataa.dll. ldatar.dll и т. д. Я их перекомпилировал, получил на выходе вместо, например, ldata.dll, как в Windows, libldata.so. Как я понимаю, для linux это стандартное наименование. Ну и поменял на это наименование вызовы бибилиотек.

При сборке получаю следующее:

Код: Выделить всё

/usr/bin/ld.bfd: cannot find -lldatat.dll
/usr/bin/ld.bfd: cannot find -lldataa.dll
/usr/bin/ld.bfd: cannot find -lldatamd.dll
/usr/bin/ld.bfd: cannot find -lldatapv.dll
astra.lpr(109,1) Error: Error while linking



Где-то в проекте есть некие ссылки на .dll, причем в начале имени одна буква 'l' лишняя.

DoubleCommander показывает, что единственный файл, содержащий упоминание .dll, это link.res. Внутри него есть вот такой кусок:

Код: Выделить всё

INPUT(
-lldata
-lldatav
-lldatat
-lldataa
-lldatamd
-lldatapv
-lldatapu
-lldatar
-lldatai
-lldata.dll
-lldatav.dll
-lldatat.dll
-lldataa.dll
-lldatamd.dll
-lldatapv.dll
-lldatapu.dll
-lldatar.dll
-lldatai.dll
-ldl
-lpthread
-lgdk-x11-2.0
-lX11
-lgdk_pixbuf-2.0
-lgtk-x11-2.0
-lgobject-2.0
-lglib-2.0
-lgthread-2.0
-lgmodule-2.0
-lpango-1.0
-lcairo
-latk-1.0
)



Вопрос: откуда в этом файле берётся информация о .dll?
Да ещё и в таком виде. :)

link.res удалял, директорию lib чистил, всё тщетно. :(

На всякий случай забросил .so-шки в usr/lib, но легче, конечно, не стало.
wwswowsogon
постоялец
 
Сообщения: 152
Зарегистрирован: 23.12.2008 20:41:37

Re: Портирование проекта Windows -> Linux

Сообщение delphius » 07.03.2023 14:52:06

wwswowsogon писал(а):При сборке получаю следующее:

ld это компоновщик, и это не лишняя буква, а директива компоновщика -l и далее имя библиотеки - команда на линкование библиотеки, bfd это механизм компоновщика, который распознает конкретный тип объекта и его внутренности, чтобы правильно склеить в общую систему собираемого исполняемого файла.

wwswowsogon писал(а):откуда в этом файле берётся информация о .dll

По тексту программы прямых директив на линковку библиотек $LINKLIB нигде нет?
И сделано ли так :?:
{$IFDEF <Platform>}{$LINKLIB <platform specific lib>}{$ENDIF}

При этом, линковка, это уборка внутрь исполняемого файла всей библиотеки целиком, в windows она выполняется путем компиляции не в динамически загружаемую библиотеку .dll, а в статически линкуемую .lib. По аналогии в Linux можно компилировать в динамически загружаемую библиотеку .so или в статически линкуемую библиотеку .a.

Так что сначала нужно вообще разобраться, что и зачем линкуется и какой тип библиотек задействован фактически, динамические (отдельные) или статические (тоже самое, но убранное внутрь исполняемого файла). Из ошибок линковщика выглядит, как будто имеет место статическая линковка. Почему тогда при этом пытаются прилинковать dll, не понятно.

Вот тут есть описание, что если компоновщик не может распознать тип файла, то он воспринимает его как скрипт. link.res, как раз похож скрипт линковки в качестве дополнительного из секции INPUT
Последний раз редактировалось delphius 07.03.2023 22:36:55, всего редактировалось 6 раз(а).
delphius
постоялец
 
Сообщения: 122
Зарегистрирован: 18.03.2020 13:40:11

Re: Портирование проекта Windows -> Linux

Сообщение Alex2013 » 07.03.2023 14:53:39

Думаю что это не lldata.dll, а -l ldata.dll То есть -l опция для компилятора/линковщика
Зы
(Как вариант попробуй полученный *.so переименовать в *.dll вдруг заработает ? А вообще насколько я понию ( но "это не точно", возможно с чем-то путаю ) в линуксе писать расширение библиотеки при подключении в явном виде не обязательно )
Alex2013
долгожитель
 
Сообщения: 2937
Зарегистрирован: 03.04.2013 11:59:44

Re: Портирование проекта Windows -> Linux

Сообщение Seenkao » 07.03.2023 23:19:56

wwswowsogon, тебе надо найти в своём проекте где происходит загрузка твоих библиотек и произвести подобное действие:
Код: Выделить всё
const
  {$IfDef WINDOWS}
  libldatat = 'ldatat.dll';
  libldataa = 'ldataa.dll';
  libldatamd = 'ldatamd.dll';
  libldatapv = 'ldatapv.dll';
  {$EndIf}
  {$IfDef LINUX}
  libldatat = 'ldatat.so';
  libldataa = 'ldataa.so';
  libldatamd = 'ldatamd.so';
  libldatapv = 'ldatapv.so';
  {$EndIf}

либо для Linux прописать полные пути при необходимости.
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12

Re: Портирование проекта Windows -> Linux

Сообщение wwswowsogon » 07.03.2023 23:38:14

Спасибо. Я должен сказать, я ввёл вас в заблуждение. Всё же оказалось, что в проекте есть модуль, где используется вызов этих же динамических библиотек. Я о нём напрочь забыл, и, конечно же, не исправил имена вызываемых файлов. Не знаю, почему сразу не нашёл, несколько раз проверял. Вот компоновщик и ругался. Жаль, что он не ссылается на модуль, в котором упоминается файл, когда говорит о том, что файл не найден.
Пока разбирался с проблемой, сделал два тестовых проекта с dll/so. Всё прошло успешно, два момента:

1 Почему-то Lazarus под Windows, когда создаёшь бибилиотеку, создаёт .lpr, а под linux - .pas для главного модуля...
2 Всё же для корректной работы требуется поместить .so в usr/lib. Если просто оставить в папке с программой, то она либо не запускается вовсе, либо вылетает при вызове функции из .so.

Проект в итоге собрался. И опять две маленькие неприятности - почему-то при закрытии главного окна вылетает 'Директория '' не найдена.'. Пробовал убирать весь код при закрытии главного окна - эффект тот же, увы. Сдаётся мне, что этот эффект вызывается строкой

Код: Выделить всё

Application.Terminate;



и под Windows не наблюдается.

Кроме того, осталась вышеупомянутая проблема с Indy. Indy ставил 10.6.2. Стандартным образом, в папку lazarus/components, далее прописал пути в fpc.cfg:

Код: Выделить всё

-Fu/usr/lib/lazarus/1.8.2/components/indylaz/Core
-Fu/usr/lib/lazarus/1.8.2/components/indylaz/SuperCore
-Fu/usr/lib/lazarus/1.8.2/components/indylaz/Security
-Fu/usr/lib/lazarus/1.8.2/components/indylaz/System
-Fu/usr/lib/lazarus/1.8.2/components/indylaz/FCL
-Fu/usr/lib/lazarus/1.8.2/components/indylaz/Protocols
-Fu/usr/lib/lazarus/1.8.2/components/indylaz



При установке пару раз он ругнулся на .inc-фалы в директивах, я это закомментировал и всё встало. По Windows делал аналогично. И всё бы хорошо, но теперь при сборке проекта говорит вот что:

Код: Выделить всё

IdHTTP.pas(343,16) Fatal: Cannot find idURI used by IdHTTP.



При этом, как видно, ссылается не на модуль проекта, а на idHTTP.pas внутри одного из файлов пакета... Никакими манипуляциями с файлами и путями мне это решить не удалось. Если есть какие идеи, буду признателен.
wwswowsogon
постоялец
 
Сообщения: 152
Зарегистрирован: 23.12.2008 20:41:37

Re: Портирование проекта Windows -> Linux

Сообщение delphius » 08.03.2023 00:03:11

wwswowsogon писал(а):При этом, как видно, ссылается не на модуль проекта, а на idHTTP.pas внутри одного из файлов пакета... Никакими манипуляциями с файлами и путями мне это решить не удалось. Если есть какие идеи, буду признателен.

Эм, вроде просто не может подтянуть idURI.pas :|
Вот последняя Indy 10.6.2, которая у меня нормально собиралась без всяких комментирований :roll:
delphius
постоялец
 
Сообщения: 122
Зарегистрирован: 18.03.2020 13:40:11

Re: Портирование проекта Windows -> Linux

Сообщение Seenkao » 08.03.2023 00:27:58

wwswowsogon писал(а):2 Всё же для корректной работы требуется поместить .so в usr/lib. Если просто оставить в папке с программой, то она либо не запускается вовсе, либо вылетает при вызове функции из .so.

не обязательно. Если библиотеки идут вместе с программой, то вы должны точно указать путь до этой библиотеки. Если путь до библиотеки определяется не правильно, то соответственно вы получите ошибку.
Seenkao
энтузиаст
 
Сообщения: 502
Зарегистрирован: 01.04.2020 03:37:12

Re: Портирование проекта Windows -> Linux

Сообщение wwswowsogon » 08.03.2023 11:17:46

Seenkao писал(а):
wwswowsogon писал(а):2 Всё же для корректной работы требуется поместить .so в usr/lib. Если просто оставить в папке с программой, то она либо не запускается вовсе, либо вылетает при вызове функции из .so.

не обязательно. Если библиотеки идут вместе с программой, то вы должны точно указать путь до этой библиотеки. Если путь до библиотеки определяется не правильно, то соответственно вы получите ошибку.


Т. е. указать абсоблютный путь прямо в коде? типа

Код: Выделить всё

external 'home/wws/astra/libdata1.so'



?

Тогда пользователь лишается некоторой свободы в расположении программы. Хотя можно, конечно, настройку расположения библиотек сделать...

Добавлено спустя 7 минут 50 секунд:
delphius писал(а):Эм, вроде просто не может подтянуть idURI.pas :|


Логично :) Но файл этот на месте, что характерно. idURI.pas - в папке Protocols, .o и .ppu для него же - в lib/i386-linux. Даже перенос файла в корневой каталог проекта не помогает. И сдается мне, что файл этот не один такой.

Добавлено спустя 15 минут 27 секунд:
delphius писал(а):
wwswowsogon писал(а):Вот последняя Indy 10.6.2, которая у меня нормально собиралась без всяких комментирований :roll:


Спасибо, скачал. Но при установке/сборке он просит пакеты indysystemlaz и idycorelaz. Сейчас попробую чуть иначе.

Добавлено спустя 7 минут 15 секунд:
Скачал с GitHub заново Indy. На этот раз комментировать ничего не пришлось. ОДнако проблема осталась:

Код: Выделить всё
IdHTTP.pas(343,16) Fatal: Cannot find idURI used by IdHTTP.
wwswowsogon
постоялец
 
Сообщения: 152
Зарегистрирован: 23.12.2008 20:41:37

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 12

Рейтинг@Mail.ru