Linux FIBL ошибка линковки

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

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

Re: Linux FIBL ошибка линковки

Сообщение mig-31 » 19.11.2018 18:38:47

Че вы мучаетесь. Исправьте на libfbclient и все. Как это сделано в SQLdb
Код: Выделить всё
{$IFDEF Unix}
  {$DEFINE extdecl:=cdecl}
  const
    gdslib = 'libgds.'+sharedsuffix; // Needs completion ?
    libfc  = 'libfbclient.'+sharedsuffix;
    libem  = 'libfbembed.'+sharedsuffix;
    v2  = {$ifndef darwin}'.2'{$else}''{$endif};
    v21 = {$ifndef darwin}'.2.1'{$else}''{$endif};
    v25 = {$ifndef darwin}'.2.5'{$else}''{$endif};
    v251 = {$ifndef darwin}'.2.5.1'{$else}''{$endif};
    fbclib2      = libfc+v2;
    fbembedlib2  = libem+v2;
    fbclib21     = libfc+v21;
    fbembedlib21 = libem+v21;
    fbclib25     = libfc+v25;
    fbembedlib25 = libem+v25;
    fbclib251    = libfc+v251;
    fbembedlib251 = libem+v25;
    // Set default here
    fbclib       = fbclib251;
    fbembedlib   = fbembedlib251;
{$ENDIF}
{$IFDEF Windows}
  {$DEFINE extdecl:=stdcall}
  const
    gdslib = 'gds32.dll';
    fbclib = 'fbclient.dll';
    fbembedlib = 'fbembed.dll';
    libfc  = fbclib;
    libem  = fbembedlib;
{$ENDIF}                         
mig-31
постоялец
 
Сообщения: 193
Зарегистрирован: 14.07.2011 13:46:48

Re: Linux FIBL ошибка линковки

Сообщение tria » 19.11.2018 22:59:32

Vadim писал(а):Мы не в церкви и это не вопрос веры, а вопрос знаний. :-D На картинке снизу как раз нарисовано то, что я Вам сказал. Компилируется за милую душу.

У меня со строкой
IBASE_DLL = {$IFDEF WIN32}'fbclient.dll'{$ELSE}'fbclient.so'{$ENDIF};
не компилится. Чего и полез разбираться.

Vadim писал(а):У меня компилятор версии 3.0.4, а у Вас?

3.0.2

Vadim писал(а):Давайте тогда проверять, а где у Вас ищются библиотеки. Сначала загляните в /etc/ld.so.conf, потом в /etc/ld.so.conf.d/libs.conf, потом в файл fpc.cfg и проверить там ключи, которые начинаются на -Fl.


Я ошибочно думал, что библиотеки ищутся по перечню в PATH. Ваш пост натолкнул на дополнительную "курку" статей в инет.
В /etc/ld.so.conf одна строка - include ld.so.conf.d/*.conf
и много файликов *.conf. Пока что не могу найти комманду, которой можно узнать весь перечень путей поиска.

Файл /etc/ld.so.conf.d/libs.conf отсутствует.

Файл fpc.cfg:
# searchpath for libraries
#-Fl/usr/lib64/fpc/$fpcversion/lib
#-Fl/lib;/usr/lib
-Fl/usr/lib64/fpc/$fpcversion/lib/$FPCTARGET
Строка с /usr/lib64, где лежит libfbclient.so.2, отсутсвует.

Vadim писал(а):На всякий случай. Линковщик работает в стиле Си, поэтому когда он пишет "-lfbclient", то "-l" означает "библиотека", а всё остальное название библиотки. В Юниксах библиотеки, как правило, начинаются с префикса "lib", поэтому упоминание полного имени необязательно, это относится только к винде, где обязательной части имени просто не существует.

Это та информация, которую я не знал, и без которой тупо впадал в ступор.
Я вообще-то по основной деятельности 1С-ник, Си не знаю в принципе.

Добавлено спустя 5 минут 13 секунд:
Vadim писал(а):
olegy123 писал(а):может разные битности(x32/x64) библиотек и компилятора?

Такое обычно в винде бывает. В Linux'е обычно всё из репов ставится, спутать сложно. Судя по версии Лазаря и CentOS как раз всё из репов ставилось.
Хотя можно на всякий случай проверить...

Firebird из репозитария, Лазарь из rpm, просто последняя версия почему-то не встала.
Так что вроде все х64
У вас нет необходимых прав для просмотра вложений в этом сообщении.
tria
постоялец
 
Сообщения: 372
Зарегистрирован: 03.04.2006 11:24:10

Re: Linux FIBL ошибка линковки

Сообщение olegy123 » 20.11.2018 00:58:31

tria писал(а):Я ошибочно думал, что библиотеки ищутся по перечню в PATH. Ваш пост натолкнул на дополнительную "курку" статей в инет.
В /etc/ld.so.conf одна строка - include ld.so.conf.d/*.conf
и много файликов *.conf. Пока что не могу найти комманду, которой можно узнать весь перечень путей поиска.

в /etc/ld.so.conf или раздельно в ld.so.conf.d/[название].conf прописываются пути к либлам, аналог %PATH% в Windows
Но!!! линух их кэширует, после обязательно нужно запустить из пользователя root-а команду ldconfig которая перечитает ld.so.conf,ld.so.conf.d/, все теперь линух знает о либлах в папках.
команда ldconfig -p выдаст список. это есть аналог %PATH%

если нужно не заносить в систему, а выполнить в окружении пользователя, или только при запуске определенных программ, которые требуют особые библиотеки, которые даже могут конфликтовать с системными, то есть переменная окружения LD_LIBRARY_PATH
LD_LIBRARY_PATH=[путь1]:[путь2]:[путь3] [программа] - заставляет смотреть сперва [путь1]:[путь2]:[путь3] в поиске библиотек для [программа], после идут системные из [ld.so.conf].
Это разово, т.е. просто запуск [программа] [путь1]:[путь2]:[путь3] уже не будут присутствовать.
можно задать так
export LD_LIBRARY_PATH=[путь1]:[путь2]:[путь3]:..
тогда все программы, запускаемые в этом окружении!!!, будут знать о путях [путь1]:[путь2]:[путь3]

Добавлено спустя 2 минуты 8 секунд:
есть еще одна волшебная команда
ldd [программа] - которая покажет какие либлы требует программа и какие будут запущены..
olegy123
энтузиаст
 
Сообщения: 1197
Зарегистрирован: 25.02.2016 12:10:20

Re: Linux FIBL ошибка линковки

Сообщение Vadim » 20.11.2018 09:12:47

tria
Сделаем по Азимову - МНВ. :-D
Добавьте в /etc/fpc.cfg:
-Fl/usr/lib64
Vadim
долгожитель
 
Сообщения: 3133
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Linux FIBL ошибка линковки

Сообщение tria » 21.11.2018 00:19:50

ldconfig -p | grep fb выдает:

libfbembed.so.2.5 (libc6,x86-64) => /usr/lib64/libfbembed.so.2.5
libfbclient.so.2 (libc6,x86-64) => /usr/lib64/libfbclient.so.2

В /etc/fpc.cfg добавил строчку (последняя)
# searchpath for libraries
#-Fl/usr/lib64/fpc/$fpcversion/lib
#-Fl/lib;/usr/lib
-Fl/usr/lib64/fpc/$fpcversion/lib/$FPCTARGET
-Fl/usr/lib64

В целевой платформе поставил х86_64

Убрал из проекта Fibl, написал в коде:
IBASE_DLL = 'libfbclient.so.2';
function isc_attach_database(....
{$IFDEF WIN32}stdcall{$ELSE}cdecl{$ENDIF};
external IBASE_DLL;


Добавил в параметры проекта путь к библиотекам "/usr/lib64".
По кнопке показать параметры выдает:
-Tlinux -Px86_64 -MObjFPC -Scghi -Cg -O1 -g -gl -l -vewnhibq -Filib/x86_64-linux -Fl/usr/lib64 -Fl/opt/gnome/lib -Fu/home/pavel/Lazarus/fibl/lib -Fu/usr/lib64/lazarus/lcl/units/x86_64-linux/gtk2 -Fu/usr/lib64/lazarus/lcl/units/x86_64-linux -Fu/usr/lib64/lazarus/components/lazutils/lib/x86_64-linux -Fu/usr/lib64/lazarus/packager/units/x86_64-linux -Fu. -FUlib/x86_64-linux -dLCL -dLCLgtk2

Все та же ошибка линковки.
tria
постоялец
 
Сообщения: 372
Зарегистрирован: 03.04.2006 11:24:10

Re: Linux FIBL ошибка линковки

Сообщение zoltanleo » 21.11.2018 02:17:14

tria писал(а):Все та же ошибка линковки

А просто указывать клиентскую либу при коннекте не вариант? Имхо, зашивать пути к ней в недрах программы - моветон.
Аватара пользователя
zoltanleo
постоялец
 
Сообщения: 246
Зарегистрирован: 17.10.2013 10:55:01

Re: Linux FIBL ошибка линковки

Сообщение olegy123 » 21.11.2018 09:01:10

tria писал(а):Все та же ошибка линковки.
все сообщения лазаруса.. ну неможет быть чтобы у всех работало - а у одного нет.
иногда необходимо полностью пересобрать проект, желательно очистить его.
olegy123
энтузиаст
 
Сообщения: 1197
Зарегистрирован: 25.02.2016 12:10:20

Re: Linux FIBL ошибка линковки

Сообщение Vadim » 21.11.2018 09:06:46

Судя по описанию подключения биб-ки IBASE_DLL, у Вас не самая последняя версия FIBL. Скачайте и попробуйте скомпилировать версию 0.7.3:
https://sourceforge.net/projects/fibl/files/FIBL/0.7.3/

У меня она компилится без малейших проблем.
Vadim
долгожитель
 
Сообщения: 3133
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Linux FIBL ошибка линковки

Сообщение tria » 21.11.2018 10:31:46

У меня пробный проект состоит из одной формы с кнопкой и описанием вызова функции из клиента фаеберда:
Код: Выделить всё
IBASE_DLL = 'libfbclient.so.2';
function isc_attach_database(....
{$IFDEF WIN32}stdcall{$ELSE}cdecl{$ENDIF};
external IBASE_DLL
;
Как я посмотрел, FIBL за последние 10 лет не "свежел". Когда-то давно он у меня под другим линуксом компилился (тогда еще Лазарь работал в 1251).

Добавлено спустя 5 минут 3 секунды:
С утра пришла мысль:
dconfig -p | grep fb выдает:

libfbembed.so.2.5 (libc6,x86-64) => /usr/lib64/libfbembed.so.2.5
libfbclient.so.2 (libc6,x86-64) => /usr/lib64/libfbclient.so.2

Но /usr/lib64/libfbclient.so.2 - это ссылка на /usr/lib64/libfbclient.so.2.5
А почему /usr/lib64/libfbclient.so.2.5 нет в этом списке?
Может что-то не так с самой либой? И как это проверить?
tria
постоялец
 
Сообщения: 372
Зарегистрирован: 03.04.2006 11:24:10

Re: Linux FIBL ошибка линковки

Сообщение Vadim » 21.11.2018 12:53:33

tria писал(а):Как я посмотрел, FIBL за последние 10 лет не "свежел".

Им давно никто не занимается. Видимо незачем. Вот например меня в большинстве случаев устраивают компоненты БД, которые уже есть в Лазаре.
Vadim писал(а):Может что-то не так с самой либой? И как это проверить?

Нужно поставить какую-нибудь программу, которая с этой либой работает. Например flamerobin - клиент для работы с базами FireBird. Если в нём удастся открыть какую-нибудь БД, значит с библиотекой всё в порядке.
Vadim
долгожитель
 
Сообщения: 3133
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Linux FIBL ошибка линковки

Сообщение zoltanleo » 21.11.2018 13:10:42

Vadim писал(а):Например flamerobin - клиент для работы с базами FireBird. Если в нём удастся открыть какую-нибудь БД, значит с библиотекой всё в порядке.

:D
Аватара пользователя
zoltanleo
постоялец
 
Сообщения: 246
Зарегистрирован: 17.10.2013 10:55:01

Re: Linux FIBL ошибка линковки

Сообщение mig-31 » 21.11.2018 14:04:09

Специально для вас установил FIBL и попробывал подключиться к Firebird 2.5.

OS: CentOS 7 64-bit
Lazarus 1.6.4
FPC 3.0.2
FIBL 0.7.3 (в исходниках надо подправить пару строк для успешной компиляции).
FBClient из репозитория CentOS 7 (добавлен сим линк ln -s /usr/lib64/fbclient.so.2 /usr/lib64/fbclient.so)
FireBird 2.5.4 на удаленном сервере.

Тест проект успешно собрался и успешно подключился к базе.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
mig-31
постоялец
 
Сообщения: 193
Зарегистрирован: 14.07.2011 13:46:48

Re: Linux FIBL ошибка линковки

Сообщение tria » 29.11.2018 18:36:53

Кажись, разобрался.
Установил CentOS 7.5 (VirtualBox), Firebird 2.5.8, Lazarus 1.8.4 - те же грабли.
Сделал симлинк:
ln -s /usr/lib64/libfbclient.so.2.5.8 /usr/lib64/libfbclient.so
Поменял:
Код: Выделить всё
IBASE_DLL = 'libfbclient.so.2;

на
Код: Выделить всё
IBASE_DLL = 'libfbclient.so;

Заработало!

При этом симлинк libfbclient.so.2 лежит в /usr/lib64/

Вывод: судя по всему, имя библиотеки должно обязательно заканчиваться на .so

Большое спасибо всем откликнувшимся.
tria
постоялец
 
Сообщения: 372
Зарегистрирован: 03.04.2006 11:24:10

Re: Linux FIBL ошибка линковки

Сообщение zoltanleo » 29.11.2018 19:16:49

Вывод: стараться не использовать статическую линковку, если не предполагается впридачу к своему приложению прилагать FB админа
Аватара пользователя
zoltanleo
постоялец
 
Сообщения: 246
Зарегистрирован: 17.10.2013 10:55:01

Re: Linux FIBL ошибка линковки

Сообщение olegy123 » 30.11.2018 03:30:37

tria писал(а):Вывод: судя по всему, имя библиотеки должно обязательно заканчиваться на .so

не так, so -> so.2 -> so.2.xx.xx так в линухе конкретизируют версии либл. so.2 и so.2.xx.xx должно работать.
Вспомнил - что в паскале есть {$L},{$Link} - для статики,{$LINKLIB} - для динамики.
также можно линковать через объявление функции: function name(): longint;cdecl;external 'namelib';
можно управлять загрузкой - выгрузкой через LoadLibrary
olegy123
энтузиаст
 
Сообщения: 1197
Зарегистрирован: 25.02.2016 12:10:20

Пред.След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

Рейтинг@Mail.ru