Linux 下使用gcc生成so(动态链接库)文件
//the file name is sum.c
#include <stdio.h>
int sum(int a, int b)
{
return a + b;
}
OK.现在我们准备生成一个名为 libsum.so 的目标本地库。使用 GCC 编译器来编译生成我们要的结果
gcc -Wall -fPIC -O2 -c -o libsum.o sum.c //生成.o
gcc -shared -Wl,-soname,libsum.so -o libsum.so libsum.o //这步才生成共享库 .so 文
动态调用方法:
#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
int main(void)
{
void *handle;
int (*cosine)(int, int);
char *error;
handle = dlopen ("./libsum.so", RTLD_LAZY);
if (!handle)
{
fputs (dlerror(), stderr);
exit(1);
}
cosine = dlsym(handle, "sum");
if ((error = dlerror()) != NULL)
{
fputs(error, stderr);
exit(1);
}
printf ("%d\n", (*cosine)(4,5));
dlclose(handle);
return 0;
}
在Lazarus中的调用方法
1、动态调用
procedure TFPFormTest.Button7Click(Sender: TObject);
type
Tgetip = function (AIP: PChar): Integer; cdecl;
var
ip: string;
h: Pointer;
getip: Tgetip;
begin
h := dlopen('./libVAProxy.so', RTLD_LAZY);
try
if h = nil then begin
Memo1.Lines.Add(StrPas(dlerror()));
Exit;
end;
getip := dlsym(h, 'getlocalip');
if dlerror() <> nil then begin
Memo1.Lines.Add(StrPas(dlerror()));
Exit;
end;
SetLength(ip, 20);
getip(PChar(ip));
Memo1.Lines.Add(ip);
finally
dlclose(h);
end;
end;