当前位置: 首页 > news >正文

Linux 学习笔记(十八)—— 动静态库

把自定义的方法给别人用,有两种方法:

  1. 把源代码给别人;
  2. 把源代码打包成库,给别人库文件和头文件; 
一、创建静态库
//Makefile
lib=libmymath.a
$(lib):mymath.oar -rc $^  // replace and create 如果存在就替换,如果不存在就创建
mymath.o:mymath.cgcc -c $^.PHONY:clean
clean:rm -fr *.o *.a lib.PHONY:output
output:mkdir -p lib/includemkdir -p lib/mymathlibmv mymath.h ./lib/includemv libmymath.a ./lib/mymathlib
//mymath.hextern int myerrno;int add(int x, int y);
int sub(int x, int y);
int mul(int x, int y);
int div(int x, int y);
//mymath.c
#include "mymath.h"int myerrno = 0;int add(int x, int y)
{return x + y;}int sub(int x, int y)
{return x - y;}int mul(int x, int y)
{return x * y;}int div(int x, int y)
{if(y == 0){myerrno = 1;return -1;}return x / y;}
二、使用静态库
#include "mymath.h"int main()
{printf("1 + 1 = %d\n", add(1, 1));printf("10 / 0 = %d\n, errno = %d", div(10, 0), myerrno);// 这里返回的“-1”如何知道是出错了还是计算结果就是-1;// 这里的errno出来的结果会是“0”// 因为C语言形参实例化的时候是从右向左的,所以先有了myerrno的值才计算除法printf("errno = %d,10 / 0 = %d\n", myerrno,div(10, 0));return 0;
}

指令:gcc main.c -I .lib/include/ -L .lib/mymathlib/ -lmymath


如果觉得太麻烦可以将头文件和库文件加入到系统目录中

【不建议这样操作,会污染系统文件,但是一般的第三方库都是这么做的;自己自定义的库可以采用软连接的方式,即放入软连接到系统目录中,也可以正常使用】

  • 头文件:cp 文件.h /user/include
  • 库文件:cp 文件.a /lib64/
  • 指令:gcc main.c -lmymath 【最后的-lmymath还是不能省略】
三、创建动态库

指令1:gcc -fPIC【产生位置无关码】 -c 文件.c    ——> 生成:文件.o

指令2:gcc -shared -o lib库名.so 文件.o

生成的so库文件会默认带有执行权限,是因为它会被调用,需要和可执行文件一起被加载到内存中;而静态库在链接之后就和可执行程序无关了,所以不需要执行权限~


http://www.mrgr.cn/news/67856.html

相关文章:

  • 浏览器存储策略解析(三)Local/sessionStorage实战:如何查看本地浏览器上数据
  • 什么是真正的数字化转型?
  • 什么是采购合同管理?
  • 查缺补漏----用户上网过程(HTTP,DNS与ARP)
  • HTMLCSS:爱上班的猫咪
  • Redis的缓存问题与应对策略
  • python语言基础-4 常用模块-4.2 time模块
  • C++之unordered_set容器的使用
  • 罗德里格斯公式-计算一个点绕着任意直线旋转一定角度后的新位置
  • Java15
  • Easyconnect官网下载安装使用教程
  • Windows命令行常用快捷指令
  • UE5.4 PCG 自定义PCG蓝图节点
  • 函数式编程
  • 数据结构------栈(Java语言描述)
  • 前向-后向卡尔曼滤波器(Forward-Backward Kalman Filter)资料汇总
  • [CARLA系列--02]CARLA 0.9.15 在Windows下的安装教程(二)
  • 国药准字生发产品有哪些?这几款不错
  • CC协议解读
  • <网络> 协议
  • 【vue2.7.16系列】手把手教你搭建后台系统__登录接口返回信息调整(16)
  • JDBC上课总结(1)(JDBC核心API、JDBC基本编码步骤)(JDBC底层由来、使用)
  • laravel chunkById 分块查询 使用时的问题
  • ES集群搭建(仅供自己参考)
  • 恢复rm -rf删除的数据
  • 源代码泄漏怎么办?SDC沙盒成为破局利器