动态加载是在 程序运行时用dlopen,dlsym函数进行的。
静态加载发生在 程序装载时。
1.1 用c语言静态方式调用动态库libsthc.so:
/*
* ctest.c
* Testing program for libsthc.so library //测试程序为在c语言中调用libsthc.so库
* in c languange
*
*/
#include "libsthc.h" //程序中需包含头文件,程序会自动在缺省的库(/usr/lib)里寻找libsthc.so,需在makefile具体指明库名;或者放在当前文件夹;如果都不在需指明路径
{
printf("%d\n", add(1, 2));
return 0;
}
#makefile:
ctest:ctest.o
gcc ctest.o -lsthc -o ctest //-lsthc就是库名
ctest.o:ctest.c
gcc -c ctest.c -o ctest.o
all:ctest
clean:
rm -f *.o ctest
1.2 用c语言动态方式调用动态库libsthc.so:
/*cdltest.c*/
#include "stdio.h"
#include "stdlib.h"
#include "dlfcn.h" //需要此头文件
int main(void)
{
void *handle;
int (*fcn)(int x, int y);
const char *errmsg;
/* open the library */ //打开库
handle = dlopen("libsthc.so", RTLD_NOW);
if(handle == NULL)
{
fprintf(stderr, "Failed to load libsthc.so: %s\n", dlerror());
return 1;
}
dlerror();
//*(void **)(&fcn) = dlsym(handle, "add"); //ok
fcn = dlsym(handle, "add"); //ok
if((errmsg = dlerror()) != NULL)
{
printf("%s\n", errmsg);
return 1;
}
printf("%d\n", fcn(1, 5));
dlclose(handle);
return 0;
}
#makefile:
cdltest:cdltest.o
gcc cdltest.o -ldl -lsthc -o cdltest //多写了-ldl,即多需要这个库
cdltest.o:cdltest.c
gcc -c cdltest.c -o cdltest.o
all:cdltest
clean:
rm -f *.o cdltest