嵌入式学习24(静态库,动态库)
来源:互联网 发布:淘宝卖家祝福语范文 编辑:程序博客网 时间:2024/06/05 15:42
1、函数执行条件:声明+定义(链接函数体使之成为程序一部分),才能使用这个函数
2、概念
静态库:成为可执行文件的一部分(在链接时,编译器将此库链接成程序的一部分)
拷贝一份进来
优点:不会因此库文件的丢失而运行失败 缺点:维护与更新困难。
动态库:需要的时候导入。(当此程序需要某个模块时,系统此时才会将此程序导入到内存,并调用此函数。当此模块不再需要使用时,系统会释放此模块)
优先:更新于维护简单
缺点:当可文件丢失时,可能会造成运行失败
3、使用方法
静态库:将目标文件打包成一个库文件
步骤:
- 编辑源文件 vi fun.c
- 编译成目标文件gcc –c fun.c –o fun.o(目标文件是二进制文件,别人看不懂)
- 打包成静态库: ar -crv libfun.a fun.o(规定名字必须以lib开头 .a后缀)
链接: gcc/g++ main.c(源文件) -L./ -lfun -lm -o main
自定义库 系统库(看情况自行决定)动态库:并不是编译时将动态库链接成可执行文件的一部分,而是运行时需要此动态库时才导入此库文件。
注:如果两个库(动态库与静态库)同时存在(同名),以动态库优先。
方法一:共享- 编写源文件
- 生成可执行的库文件 gcc/g++ -fPIC –shared 源文件 –o lib文件名.so
- 添加当前路径:export LD_LIBRARY_PATH=”$LD_LIBRARY_PATH;./”
或添加到系统库中 运行程序
示例代码
#include<stdio.h>#include<dlfcn.h>//link with -ldlvoid main(){ char* path="./libfun.so";//函数所在动态库库名 char* fun_name="sort";//函数名 char* error=NULL;//用于反馈错误//1 打开 库指针 路径 打开方式 void* handle=dlopen(path,RTLD_LAZY); if(NULL!=(error=dlerror()))//如果存在错误 { printf("error:%s\n",error); return; }//2 从动态库中找匹配的入口地址(函数名) void (*pfun)(int*,int); pfun=dlsym(handle,fun_name); if(NULL!=(error=dlerror()))//如果存在错误 { printf("error:%s\n",error); dlclose(handle);//释放 return; }//3 调用 int a[5]={5,4,3,2,1}; pfun(a,5); int i; for(i=0;i<5;i++) printf("%d",a[i]);//4 关闭 dlclose(handle);}
阅读全文
1 0
- 嵌入式学习24(静态库,动态库)
- 嵌入式 makefile编译静态库和动态库(
- 静态库与动态库的区别与嵌入式概念
- cmake学习(一)静态库与动态库构建
- cmake学习(一)静态库与动态库构建
- cmake学习(一)静态库与动态库构建
- Linux学习(十七):动态库与静态库
- 静态库和动态库学习
- linux 静态库动态库学习记录
- Linux-----学习静态库,动态库
- C++动态库与静态库学习
- 动态/静态库(一)
- 嵌入式 Linux下在制作静态库或者动态库的时候注意问题
- 静态库 动态库
- 静态库 动态库
- 静态库 动态库
- 静态库、动态库
- 动态库 静态库
- 内存管理
- Median of Two Sorted Array leetcode java
- LRCN代码复现3
- 8月14日总结
- hdu1166 敌兵布阵 线段树
- 嵌入式学习24(静态库,动态库)
- Node的模块简单介绍
- Java第一个程序(CMD环境)
- java常见异常
- NOIP2012普及组-寻宝
- hdu 6115 Factory(lca暴力)
- 背包问题 01背包 完全背包 多重背包
- CSI(channel state information)目标识别和室内定位
- 修改mysql提示符