En linux las librerías se pueden cargar en forma dinámica como las dll en windows, se denominan shared objects, de ahí la extensión .so.
Estube probando para ver como es el procedimiento, luego de sortear varios problemas cree una libería con freepascal 2.2.0 y construí una aplicación elemental en lazarus para probar la librería.
código de la librería:
Código Delphi
[-]library equ2n_raices;
uses
Classes,Math
;
const
SIN = 0;
UNA = 1;
DOS = 2;
function ResolverEq2nGrado(a, b, c : real; var x1, x2 : real) : Longint; cdecl; export;
var
discr : real; begin
discr := b*b - 4*a*c;
if discr < 0 then begin
ResolverEq2nGrado := SIN;
end
else begin
if discr = 0 then begin
ResolverEq2nGrado := UNA;
x1 := -b / (2*a);
x2 := -b / (2*a);
end
else begin
ResolverEq2nGrado := DOS;
x1 := (-b + Sqrt( discr )) / (2*a);
x2 := (-b - Sqrt( discr )) / (2*a);
end;
end;
end;
exports ResolverEq2nGrado;
begin
end.
Esta libreria sirve para calcular las raices de una ecuación de segundo grado.
Para probar la librería el código en lazarus es el siguiente:
Código Delphi
[-]
const
SIN = 0;
UNA = 1;
DOS = 2;
type
TResolverEq2nGrado = function(A1, A2, A3 : real; var A4, A5 : real) : Longint;cdecl;
Function dlopen (name : pchar ;mode : longint ) : pointer; cdecl; external 'dl';
Function dlsym( lib : pointer ; name : pchar ) : pointer; cdecl; external 'dl';
Function dlclose (lib : pointer) : longint; cdecl; external'dl';
var
Form1: TForm1;
implementation
procedure TForm1.Button1Click(Sender: TObject);
var
ResolverEq2nGrado : TResolverEq2nGrado;
h : pointer;
x1, x2, a, b, c : real;
fp1 : textfile;
begin
assignfile(fp1,'entrada.txt');
reset(fp1);
read(fp1,a);
read(fp1,b);
read(fp1,c);
h := dlopen('libequ2n_raices.so',3);
Pointer(ResolverEq2nGrado) := TResolverEq2nGrado(dlsym(h, 'ResolverEq2nGrado'));
if h = nil then begin
ShowMessage ('procedimiento no encontrado, ¿llamada erronea?');
end
else begin
case ResolverEq2nGrado(a, b, c, x1, x2) of
SIN : begin
showmessage ('Esta ecuación no tiene solución real');
writeln(fp2,'Esta ecuación no tiene solución real');
end;
UNA : begin
showmessage('Una solución : ' + #13#10 + 'X =' + FloatToStr(x1));
end;
DOS : begin
showmessage('Dos soluciones :'+#13#10+
'X1 =' + floattostr(x1)+#13#10+
'X2 =' + floattostr(x2));
end;
end;
dlclose(h);
end;
closefile(fp1);
end;
Sólo he puesto la parte que interesa.
Copié la librería en /usr/lib usando sudo cp libequ2n_raices.so /usr/lib
Para poder usar el programa usé: sudo chmod 555 test y para ejecutarlo ./test
Da un error en la consola:
GTKWindowStateEventCB Form1:TForm1 new_window_state=0 changed_mask=1
GTKWindowStateEventCB Form1:TForm1 0 [RMVDStPr]
GTKWindowStateEventCB :TPromptDialog new_window_state=0 changed_mask=1
GTKWindowStateEventCB :TPromptDialog 0 [RMVDStPr]
At end of ExceptionAddresStack
Si alguien ha tenido un problema parecido tal vez lo podría aclarar.
Saludos