linux调用库的方式有三种: 1.静态链接库 2.动态链接库 3.动态加载库 其中1,2都是在编程时直接调用,在链接时加参数-l进行链接 第三种需要在编程时使用dlopen等函数来获取库里面函数的定义,然后进行调用. 不过对于没有提供头文件的动态库,只能dlopen等函数来调用
gcc getmaxlen.c -fPIC -shared -o libtest.so
gcc main.c -ldl -g
#include <stdio.h>
#include <dlfcn.h> // 显式加载需要用到的头文件
int main()
{
void *pdlHandle = dlopen("./libtest.so", RTLD_LAZY); // RTLD_LAZY 延迟加载
int ret;
char *pszErr = dlerror();
int array[]={11,5,8,13,9,5};
if( !pdlHandle || pszErr )
{
printf("Load mylib failed!\n");
return 1;
}
// int getMaxLen(int *sel,int N)
int (*Print)(int *,int) = dlsym(pdlHandle, "getMaxLen"); // 定位动态链接库中的函数
if( !Print )
{
pszErr = dlerror();
printf("Find symbol failed!%s\n", pszErr);
dlclose(pdlHandle);
return 1;
}
printf("Print 0x%x\n", (int*) Print);
ret = Print(array, sizeof (array)/sizeof(int)); // 调用动态链接库中的函数
dlclose(pdlHandle); // 系统动态链接库引用数减1
printf("result %d\n", ret);
return ret;
}