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语言,有不科学的地方还请指导斧正。
阅读全文
1 0
- C语言简单使用动态库总结
- C语言动态库的使用
- object-c语言简单总结
- c语言关键字简单总结
- C语言简单知识点总结
- JNA调用C语言动态链接库学习实践总结
- JNA调用C语言动态链接库学习实践总结
- JNA调用C语言动态链接库学习实践总结
- 【C语言】【unix c】动态库的制作和使用
- C语言简单实现动态顺序表
- C语言指针使用总结
- C语言指针使用总结
- 动态链接库(DLL)总结---简单使用(1)
- 动态链接库(DLL)总结---简单使用(2)
- C语言使用动态链接库静态链接库
- C语言动态库的问题---Windows下使用VC
- Hadoop streaming 使用 C 语言动态链接库
- c语言起步(2):Linux动态链接库的使用
- BOSS软件修改以支持JSON格式输入文件
- 大数运算
- Codeforces Round #431 (Div. 2) A、Odds and Ends B、Tell Your World C、From Y to Y
- HOG特征
- 买卖股票的最佳时机I、II、III、IV
- C语言简单使用动态库总结
- 看不见的力量
- 倒计时
- JAVA写HTTP代理服务器(一)-socket实现
- Elasticsearch5.0 安装问题集锦
- MySQL 索引原理
- 初始化spring配置文件
- Android中ConvenientBanner的使用(轮播图)
- Kotlin入门之extentions