C语言简单使用动态库总结

来源:互联网 发布:淘宝网密码登录不了 编辑:程序博客网 时间:2024/06/05 05:12

静态库和动态库区别一句话:
静态库会被编译到执行文件里,相当于一起打包了。
动态库是在程序执行的时候去加载的,二者是分开的。

由于动态库用得很多,因此做个总结。

打开vscode,创建工程
这里写图片描述

第一步:先生成动态库
简单的代码
helper.h

#ifndef HELPER_H#define HELPER_Hint add(int,int);void show(char *);#endif

helper.c

#include "helper.h"#include<stdio.h>int add(int a,int b){    return a+b;}void show(char *str){    printf("%s\n",str);}

lib文件夹下makefile

helper:helper.c helper.h    gcc helper.c helper.h -shared -fPIC -o ../libhelper.so

注意,编译共享库,不加-fPIC 会报错,可能和CPU有关系。

在程序中使用so文件
main.c

#include<stdio.h>#include<dlfcn.h>int main(){    //动态库里的方法声明    int(*add)(int a, int b);      //加载动态库文件并完善声明的方法    void *pHelper;    //RTLD_LAZY 表示需要时才做,节省性能    //RTLD_NOW 表示立即去做    pHelper = dlopen("./libhelper.so", RTLD_LAZY);    //类似于JAVA调用C方法都需要完成函数内存地址的定位    add = dlsym(pHelper, "add");     //必须在so文件没有关闭的时候调用,就像读取文件时,文件没关闭才能读    int result = add(2, 2);    dlclose(pHelper);    printf("%d\n", result);  }

主程序的makefile

launcher: main.o    gcc -o launcher.out main.o -ldl#这里的 -ldl 是引用系统中的dlfcn库,它用于so文件的操作main.o:main.c    gcc -c main.cclean:    rm *.o *.out

执行,先调用库文件的makefile生成so文件,然后调用主程序的makefile生成最终执行文件,然后执行
这里写图片描述

另外还有一种方法:
之前的方法比较麻烦,so文件里的每个方法必须要定位一次函数内存地址,有没有直接使用so文件里的方法呢,有,但是可执行文件在编译的时候必须加上引用该so文件,比如一个动态库为
libhelper.so ,则gcc 命令为
gcc main.c -o launcher.out -l helper -L so文件路径

感觉这样用就有点像静态库了,而且有一点要注意的是如果so文件不在linux include目录内,需要用export配置环境变量,不然会在程序执行时找不到so文件报错。

初学C语言,有不科学的地方还请指导斧正。

原创粉丝点击