Решил попробовать 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.
Есть у кого какие соображения?