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

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

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

Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

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

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

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

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

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


Даже создание каталога идёт через неё, этого не замечаешь пока винда не перекодирует путь неправильно.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3071
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

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

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

Сообщение Сквозняк »

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

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

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

Сообщение Снег Север »

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

Митрофанушка ты наш, если ты не в курсе, что создает каталоги функция Windows API CreateDirectoryW, а не консоль, то о чём с тобой вообще говорить.
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

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

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

Тебя даже в тындексе забанили, не смог за годы выяснить как народ проги с либами в каталоге запускает, теперь про винапи жгёшь напалмом. Ты, так понимаю, изучил слитый в сеть код винды и точно знаешь что внутри системы команды обрабатываются по разному? Тестирование выявило что одинаково, но ты продолжай верить в хороший план виндовса.
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3071
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Сквозняк, продолжай жечь напалмом, только не ходи рядом с птицефабриками, а то все куры сдохнут от смеха... :mrgreen:
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

Маздайщик уже не знает как отмазать свою маздайку. У тебя нет аргументов, ты слился и пытаешься выехать на лохотроне. Но здесь вам не тут, не прокатит.
wwswowsogon
постоялец
Сообщения: 157
Зарегистрирован: 23.12.2008 19:41:37

Сообщение wwswowsogon »

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

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

Столкнулся с некоторыми проблемами с 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, но легче, конечно, не стало.
delphius
постоялец
Сообщения: 131
Зарегистрирован: 18.03.2020 12:40:11

Сообщение delphius »

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 21:36:55, всего редактировалось 6 раз.
Alex2013
долгожитель
Сообщения: 3230
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Думаю что это не lldata.dll, а -l ldata.dll То есть -l опция для компилятора/линковщика
Зы
(Как вариант попробуй полученный *.so переименовать в *.dll вдруг заработает ? А вообще насколько я понию ( но "это не точно", возможно с чем-то путаю ) в линуксе писать расширение библиотеки при подключении в явном виде не обязательно )
Seenkao
энтузиаст
Сообщения: 578
Зарегистрирован: 01.04.2020 02:37:12
Контактная информация:

Сообщение Seenkao »

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 прописать полные пути при необходимости.
wwswowsogon
постоялец
Сообщения: 157
Зарегистрирован: 23.12.2008 19:41:37

Сообщение wwswowsogon »

Спасибо. Я должен сказать, я ввёл вас в заблуждение. Всё же оказалось, что в проекте есть модуль, где используется вызов этих же динамических библиотек. Я о нём напрочь забыл, и, конечно же, не исправил имена вызываемых файлов. Не знаю, почему сразу не нашёл, несколько раз проверял. Вот компоновщик и ругался. Жаль, что он не ссылается на модуль, в котором упоминается файл, когда говорит о том, что файл не найден.
Пока разбирался с проблемой, сделал два тестовых проекта с 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 внутри одного из файлов пакета... Никакими манипуляциями с файлами и путями мне это решить не удалось. Если есть какие идеи, буду признателен.
delphius
постоялец
Сообщения: 131
Зарегистрирован: 18.03.2020 12:40:11

Сообщение delphius »

wwswowsogon писал(а):При этом, как видно, ссылается не на модуль проекта, а на idHTTP.pas внутри одного из файлов пакета... Никакими манипуляциями с файлами и путями мне это решить не удалось. Если есть какие идеи, буду признателен.
Эм, вроде просто не может подтянуть idURI.pas :|
Вот последняя Indy 10.6.2, которая у меня нормально собиралась без всяких комментирований :roll:
Seenkao
энтузиаст
Сообщения: 578
Зарегистрирован: 01.04.2020 02:37:12
Контактная информация:

Сообщение Seenkao »

wwswowsogon писал(а):2 Всё же для корректной работы требуется поместить .so в usr/lib. Если просто оставить в папке с программой, то она либо не запускается вовсе, либо вылетает при вызове функции из .so.
не обязательно. Если библиотеки идут вместе с программой, то вы должны точно указать путь до этой библиотеки. Если путь до библиотеки определяется не правильно, то соответственно вы получите ошибку.
wwswowsogon
постоялец
Сообщения: 157
Зарегистрирован: 23.12.2008 19:41:37

Сообщение wwswowsogon »

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.
Ответить