Решил попробовать Free Pascal для разработки проекта.
И практически сразу столкнулся с проблемой, в точности похожей на эту, с той лишь разницей, что у меня не FreeBSD, а Linux (Ubuntu 7.04).
Под Windows работают оба варианта (и со статической линковкой, и с динамической), под Linux - только со статической (если дать ссылку на библиотеку в /usr/lib; если не давать - тоже не работает, но это понятно - в мануале чёрным по-английски написано).
Привожу код:
Библиотека -
- Код: Выделить всё
- {$MODE OBJFPC}
 library testlib;
 procedure testproc; stdcall; export;
 begin
 WriteLn('TestProc called');
 end;
 exports
 testproc;
 end.
Программа (динамическая линковка) -
- Код: Выделить всё
- {$MODE OBJFPC}
 program testprog;
 uses
 sysutils, dynlibs;
 const
 Name_TestLib = 'testlib';
 Name_TestProc = 'testproc';
 
 procedure Debug(const aFn, aStr: AnsiString);
 begin
 WriteLn(TimeToStr(Now) + ' - ' + aFn + ': ' + aStr);
 end;
 procedure UnLoadLib(var LibHandle: TLibHandle);
 begin
 if LibHandle<>NilHandle then
 begin
 Debug('UnLoadLibrary', IntToStr(LibHandle));
 UnLoadLibrary(LibHandle);
 end;
 LibHandle := NilHandle;
 end;
 function GetLibProcAddr(const LibName, ProcName: AnsiString; var H: TLibHandle): Pointer;
 begin
 Result := nil;
 if H=NilHandle then
 begin
 Debug('LoadLibrary', LibName);
 H := LoadLibrary(LibName);
 if H<>NilHandle
 then Debug('LoadLibrary', LibName+'; Handle='+IntToStr(H));
 end;
 if H=NilHandle
 then Debug('LoadLibrary', LibName+' failed!')
 else
 begin
 Debug('GetProcedureAddress', LibName+'.'+ProcName);
 Result := GetProcedureAddress(H, ProcName);
 if not(Assigned(Result)) then
 begin
 Debug('GetProcedureAddress', LibName+'.'+ProcName+' failed!');
 UnLoadLib(H);
 end;
 end;
 end;
 type
 TTestProc = procedure; stdcall;
 var
 Handle_LibTest : TLibHandle;
 TestProc : TTestProc;
 begin
 Handle_LibTest := NilHandle;
 try
 TestProc := TTestProc(GetLibProcAddr(Name_TestLib, Name_TestProc, Handle_LibTest));
 if Assigned(TestProc)
 then TestProc;
 finally
 UnLoadLib(Handle_LibTest);
 end;
 end.
Программа (статическая линковка) -
- Код: Выделить всё
- {$MODE OBJFPC}
 program testprog1;
 procedure testproc; stdcall; external 'testlib';
 begin
 testproc;
 end.
Есть у кого какие соображения?



