On 22.04.2011 18:31, Jilani Khaldi wrote:
{$linklib c}
uses
dynlibs;
procedure hello(const x: double); cdecl; external 'libmylib.so';
var
lHandle: TLibHandle;
v: double;
begin
lHandle := LoadLibrary('./libmylib.so');
if lHandle <> nilHandle then
begin
v := 3.14159;
hello(v);
end else
writeln('Cannot load "mylib.so"')
end.
You are mixing two different approaches here:
By using "external 'libmylib.so'" you tell the compiler to link the
library at compiletime, so you can call "hello" without the "LoadLibrary".
For using LoadLibrary you need to follow a different approach:
===source begin===
type
THelloProc = procedure(const x: Double); cdecl;
var
hello: THelloProc;
lHandle: TLibHandle;
begin
lHandle := LoadLibrary('./libmylib.so');
if lHandle <> NilHandle then begin
hello := THelloProc(GetProcAddress(lHandle, 'hello'));
if not Assigned(hello) then
Writeln('Cannot find ''hello'' function')
else
hello(3.14159);
end else
Writeln('Cannot load ''mylib.so''');
end.
===source end===
It is compiled without error but when I run it it throws:
./testlib: error while loading shared libraries: libmylib.so: cannot
open shared object file: No such file or directory.
It might not be the LoadLibrary that fails, but the statically linked
function. You need to add the path to your LD_LIBRARY_PATH and (to
answer your second mail) no, you can't add this to fpc.cfg, because this
is not a problem of the compiler, but of the runtime/the operating
system. A linux system searches by default only in the directories that
are mentioned in LD_LIBRARY_PATH for libraries.
What I did I miss?.
Thank you.
Btw: You don't need to include "linklib c".
Regards,
Sven
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal