Dynlibs - не работает на FreeBSD ?

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

Ответить
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

Не могу понять, если линкуюсь с динамической библиотекой на этап компиляции то все ОК. А если пытаюсь загрузить ее с помощью функций dynlibs, то березултаттно

Вариант 1 (работает)

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

program PBS;
uses PBSShare, PBSLog, crt;
procedure ConnectionManagerMain;external 'ConnectionHandler';
begin
 SysMessage('Загружаем менеджер соедеинений');
 ConnectionManagerMain;
 repeat
  delay(500);
 until KeyPressed;
end.


Варинат 2 (не работает)

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

program PBS;
uses PBSShare, PBSLog, crt, dynlibs;
type
 TProc=procedure;
 PProc=^TProc;

var
 CHLib:TlibHandle;
 ConnectionManagerMain:TProc;
begin
 SysMessage('Загружаем менеджер соедеинений');
 CHLib:=LoadLibrary('libConnectionHandler.so');
 if CHLib=NILHandle then
 begin
  SysMessage('Не могу загрузить менеджер соединений');
  Halt(1);
 end;
 ConnectionManagerMain:=PProc(GetProcAddress(CHLib, 'ConnectionManagerMain'))^;
 ConnectionManagerMain;
 repeat
  delay(500);
 until KeyPressed;
 UnloadLibrary(CHLib);
end.


Функция LoadLibrary возвращает NIL. Смущяет меня тот факт, чтоесли указать какуюнибудь из не моих библиотека (например libxml2.so), то она загружается!!!!

Кратко сама библиотека:

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

{$SMARTLINK OFF}
library ConnectionHandler;
uses sockets, baseunix, crt, PBSLog, PBSShare;
... здесь всякие другие функции и тп
 {------------------------------------------------------------}
 procedure ConnectionManagerMain;
...
 begin
...
 end;

 exports  ConnectionManagerMain;

end.

Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Хорошо б каким-нибудь objdump'ом посмотреть, какое имя экспортируется. Могут быть заморочки, например, с регистром символов.
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

Иван Шихалев писал(а): Хорошо б каким-нибудь objdump'ом посмотреть, какое имя экспортируется. Могут быть заморочки, например, с регистром символов.

А при чем тут это? Не загружается функцией LoadLibrary библиотека, а что там дальше это по-моему уже другой вопрос. :)
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

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

LoadLibrary('ConnectionHandler')
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

Иван Шихалев писал(а):

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

LoadLibrary('ConnectionHandler')

Я с этого начал :( Повторюсь, почему-то не загружается именно написанная мною библиотека (например libxml2.so загружается). Собранную библиотеку я помещаю в /usr/local/lib и запускаю ldconfig -R.

Сейчас пробовал на простых примерах эффект - никакой :(

Вызывающий код(полностью):

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

{$smartlink off}
program tmylib;
uses dynlibs, crt;
type
 TProc=procedure;
 PProc=^TProc;

var
 CHLib:TLibHandle;
 MyFunc:TProc;
 
begin
 CHLib:=LoadLibrary('mylib');
 if CHLib=nil then
 begin
  writeln('не загрузили');
  halt(1);
 end;
 MyFunc:=PProc(GetProcAddress(CHLib,'MyFunc'))^;
 if @MyFunc<>nil then MyFunc;
 repeat
  delay(500);
 until KeyPressed;
 UnloadLibrary(MyFunc);
end.


Библиотека(полностью):

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

{$smartlink off}
library MyLib;

 procedure MyFunc;
 begin
  Writeln('bbbb');
 end;

 exports MyFunc;

end.


И на всяки случай файл ~/.fpc.cfg

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

-Sgic
-CX
-Fu/usr/local/lib/fpc/2.0.0/units/$fpctarget
-Fu/usr/local/lib/fpc/2.0.0/units/$fpctarget/*
-Fu/usr/local/lib/fpc/2.0.0/units/$fpctarget/rtl
-Fu/usr/home/stakan/units/*
-Fu*
-Fl/usr/local/lib
-FD/usr/home/stakan/fpc/$fpctarget/bin
#-Xs
-XX
-l
-viwn
-Xf
Ответить