为了跨语言交互编程及实现代码保护,常把源代码内相关函数编译为动态库,从而方便使用。现对动态库编译及应用总结如下:
一、编译动态库
1、 编写libtest.c
int test (int a,int b)
{
return a+b;
}
2、编译libtest.so
gcc -shared -Wl,-soname,libtest.so -o libtest.so libtest.c
通过上述步骤即可在当前目录获得libtest.so的动态库文件,该库文件内有一test()函数,完成了两个输入参数的加法运算。
二、C语言下应用动态库编程
libdl.so提供了对动态库打开、加载函数、关闭、错误处理四个函数,应用该四个函数能够完成对libtest.so内的test()函数的加载,并应用该函数完成相应的程序开发。
1、编写runlib.c
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#define DLL_PATH "./libtest.so"
typedef int (*func)(int, int);
int main(){
void *dlhandler;
char *error;
func func = NULL;
dlhandler = dlopen(DLL_PATH,RTLD_LAZY);
if(dlhandler == NULL){
fprintf(stderr,"%s\n",dlerror());
exit(-1);
}
dlerror();
func = dlsym(dlhandler,"test");
printf("%d\n",func(1,2));
dlclose(dlhandler);
return 0;
}
2、编译runlib.c
gcc runlib.c -o runlib -l dl
./runlib 可以得到输出结果为3。程序能够调用当前目录下libtest.so内部的test()函数,并把该函数指针映射到了func函数,从而完成了1+2输出3的运算。