用c语言调用动态库

来源:互联网 发布:淘宝好的大童装店铺 编辑:程序博客网 时间:2024/06/07 05:33
动态加载是在程序运行时用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
0 0
原创粉丝点击