动静态库生成使用

news2024/11/20 6:30:52

       🔥🔥 欢迎来到小林的博客!!
      🛰️博客主页:✈️林 子
      🛰️博客专栏:✈️ Linux
      🛰️社区 :✈️ 进步学堂
      🛰️欢迎关注:👍点赞🙌收藏✍️留言

目录

  • 静态库和动态库
  • 静态库
    • 静态库的生成
    • 静态库的使用
  • 动态库
    • 生成动态库

静态库和动态库

  • 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静 态库
  • 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
  • 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文 件的整个机器码
  • 在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个 过程称为动态链接(dynamic linking)
  • 动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚 拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。

静态库

静态库的生成

生成静态库,我们只需要把要打包的.o目标文件打包在一起生成静态库即可。

首先,我们要先有4几个.c和.h的文件。

add.c

#include "add.h"

int add(int x,int y)
{
  return x+y;
}

add.h

int add(int x,int y);

sub.c

#include"sub.h"

int sub(int x,int y)
{
  return x- y;
}

sub.h

int sub(int x,int y);

然后我们编写一个Makefile自动化构建工具。

libmymath.a:sub.o add.o
	ar -rc $@ $^
%.o:%.c
	gcc -c $<

.PHONY:clean
clean:
	rm -rf libmymath.a *.o output

.PHONY:output 
output:
	mkdir output 
	cp *.h output 
	cp libmymath.a output

libmymath.a:sub.o add.o :libmymath.a 这个静态库是依赖于sub.o,add.o。

ar -rc $@ $^ :生成静态库。

%.o:%.c :当前目录下所有的.o文件都依赖于.c文件。

gcc -c $< : 生成所有可生成的.o文件。

.PHONY:clean : 清除所有生成的文件。

.PHONY:output:把.h和静态库打包进一个文件夹。

然后我们make一下,就可以生成静态库了。

在这里插入图片描述

我们会发现,先生成.o文件,再通过.o目标文件打包成静态库libmymath.a。

然后我们使用output,把头文件和静态库打包进同一个文件夹。并且进入output文件夹。

在这里插入图片描述

静态库的使用

要使用静态库,我们要先有一个主函数。我们创建一个test.c的主文件。

#include<stdio.h>
#include"add.h"
#include"sub.h"

int main()
{
  int x = 10;
  int y = 20;
  int r1 = add(x,y);
  int r2 = sub(x,y);
  printf("%d + %d = %d",x,y,r1);
  printf("%d - %d = %d",x,y,r2);

  return 0;
}

那么我们还需要编译这个test.c文件,我们需要在编译的时候。指定它的库路径,和库名。

gcc test.c -L. -lmymath 编译

-L 要链接的静态库路径,.为当前路径

-l 要链接的静态库名,静态库名不包含开头的lib和结尾的.a/.so

编译完之后会生成一个可执行文件。

在这里插入图片描述

执行结果。

在这里插入图片描述

这里忘记换行了。但不影响。

动态库

生成动态库

生成动态库就简单多了。我们还是使用Makefile来自动化生成。

libmymath.so:add.o sub.o #libmymath.so 依赖于add.o sub.o
	gcc -shared -o $@ $^

#产生.o目标文件,程序内部的地址方案是: 与位置无关,库文件可以在内存的任何位置加载,而且不影响和其他程序的关联性
%.o:%.c
	gcc -fPIC -c $<

.PHONY:clean
clean:
	rm -r -f libmymath.so *.o lib 

.PHONY:output
output:
	mkdir lib 
	cp *.h lib 
	cp libmymath.so lib 

  • shared: 表示生成共享库格式
  • fPIC:产生位置无关码(position independent code)
  • 库名规则:libxxx.so

这样我们就生成了.so的动态库。

在这里插入图片描述

然后我们output打包一下。

在这里插入图片描述

和刚才一样,我们创建一个.c的主文件。

test.c:

#include<stdio.h>
#include"add.h"
#include"sub.h"

int main()
{
  int x = 10;
  int y = 20;
  int r1 = add(x,y);
  int r2 = sub(x,y);
  printf("%d + %d = %d",x,y,r1);
  printf("%d - %d = %d",x,y,r2);

  return 0;
}

然后我们使用makefile来生成自动化编译。

makefile:

test:test.c
	gcc -o $@ $^ -I. -L. -lmymath 

.PHONY:clean
clean:
	rm -f test

然后编译,执行。

在这里插入图片描述

这是在同一目录下可以直接执行,如果在不同目录下。则会报错。

与动态库不再同一目录

此时我的动态库在lib目录下,源文件与lib在同一目录下。这时我们要稍微修改一下Makefile。

test:test.c
	gcc -o $@ $^ -I./lib -L./lib -lmymath 

.PHONY:clean
clean:
	rm -f test

然后编译

在这里插入图片描述

提示我们编译失败,这是因为不在同一目录下。加载器无法找到动态库并把它加载到内存,这时候我们把动态库添加进环境变量即可。

格式:

export LD_LIBRARY_PATH= lib文件目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1000892.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2000-2022年上市公司行业异质性数据(技术密集型、劳动密集型、资本密集型)(含原始数据和处理代码)

2000-2022年上市公司行业异质性数据&#xff08;技术密集型、劳动密集型、资本密集型&#xff09;&#xff08;含原始数据和处理代码&#xff09; 1、时间&#xff1a;2000-2022年 2、指标&#xff1a;股票代码、年份、股票简称、统计日期、行业名称、行业代码、成立日期、上…

React复习日志大纲

文章目录 创建项目启动项目项目目录说明调整项目src剩余目录01基本使用02 列表渲染03 条件渲染04 样式处理05 函数和类组件创建和渲染06 事件绑定07 事件对象e08 传递额外参数09 组件状态修改10 受控组件11 非受控组件12 组件通信父传子13 Props说明14 组件通信子传父15 组件通…

【已解决】您所使用的密钥ak有问题,不支持jsapi服务,可以访问该网址了解如何获取有效密钥。

您所使用的密钥ak有问题&#xff0c;不支持jsapi服务&#xff0c;可以访问该网址了解如何获取有效密钥。详情查看&#xff1a;http://lbsyun.baidu.com/apiconsole/key#。 问题 百度密钥过期 思路 注册成为开发者 如果还没注册百度地图api账号的&#xff0c;点击以后就进入…

LRU算法之我见

文章目录 一、LRU算法是什么&#xff1f;二、使用原理三、代码实现总结 一、LRU算法是什么&#xff1f; LRU算法又称最近最少使用算法&#xff0c;它是是大部分操作系统为最大化页面命中率而广泛采用的一种页面置换算法。是一种缓存淘汰策略&#xff0c;根据使用频率来淘汰无用…

华清远见第六课程day4作业

仿照string类&#xff0c;完成myString 类 #include <iostream> #include <cstring>using namespace std;class myString{ private:char *str;int size; public:myString():size(10){str new char[size];strcpy(str,"");}myString(const char*s){size …

mysql leetcode打题记录

文章目录 完成度基本语法高级语法连接日期 函数编写函数聚合函数 因为上过的数据库课实在太水了&#xff0c;所以打算先在菜鸟教程/CSDN/leetcode先学一下基本语法&#xff0c;然后去做Stanford数据库原理的课程CS145。 小目标&#xff1a;把leetcode上不用钱的mysql的题先做一…

RabbitMQ死信队列与延迟队列

死信队列 死信队列的定义 死信队列&#xff08;Dead Letter Queue&#xff09;&#xff1a; 死信队列是一种特殊的队列&#xff0c;用于存放不能被消费的消息。当消息满足某些条件时&#xff0c;比如消息过期、消息被拒绝消费或消息达到最大重试次数等&#xff0c;RabbitMQ 会…

实现数组去重的七种方法

实现数组去重的 7 种方式 1. 方法一&#xff1a;利用两层循环数组的splice方法 通过两层循环对数组元素进行逐一比较&#xff0c;然后通过splice方法来删除重复的元素。此方法对NaN是无法进行去重的&#xff0c;因为进行比较时NaN ! NaN。 let arr [1, 2, 2, abc, abc, true,…

Mac系统 AndroidStudio Missing essential plugin:org.jetbrains.android报错

打开Android Studio,提示 Missing essential plugin:org.jetbrains.android错误&#xff0c;产生的原因是Kotlin被禁用。 解决的方法是删除disabled_plugins.txt&#xff0c;Mac OS对应的路径为&#xff1a; /Users/xzh/Library/Application Support/Google/AndroidStudio202…

C#中async/await的线程ID变化情况

一、简单的起步 Console.WriteLine($"主线程开始ID&#xff1a;{Thread.CurrentThread.ManagedThreadId}");//aawait Task.Delay(100);//cConsole.WriteLine($"主线程结束ID&#xff1a;{Environment.CurrentManagedThreadId}");//b 结果&#xff1a; …

MySQL复合查询(查询直接看这里)

回顾基本查询 查询工资高于500或岗位为TOM的雇员&#xff0c;同时还要满足他们的姓名首字母为大写的J select * from EMP where(sale > 500 or job TOM) and ename like J%;按照部门号升序而雇员的工资降序排序 select * from EMP order by deptno, sal desc;最后&#…

CANoe中的工作模式之争:由一段简单的代码引出的问题

1、引子 有网友问我一个CAPL中timer定时器的代码问题。他在CANoe工程中写了一段代码:每5秒循环触发一次定时器事件程序,输出一句文本信息到Write窗口。但是执行后发现并不是每5秒触发一次定时器事件程序,而是非常快的触发定时器事件程序。当他把这段代码复制到一个新的CANo…

【integrin + vWFa vWF】

CR3 ; CR4 ; 也有 vWFA CD11 CD18 vWF --Crystal structure and substrate-induced activation of ADAMTS13 神奇&#xff01; HGNC:12726 vWF 12p13.31 HGNC: 7 a2M 12p13.31

微服务之流控、容错组件sentinel

背景 2012年阿里巴巴研发的流量治理组件&#xff0c;核心功能流控、容错 有什么功能 流量控制 流量控制 网关控制 黑白名单 熔断降级 熔断 保护分布式系统防止因为调用下有服务时产生故障或者请求超时等异常影响上游服务&#xff0c;使用熔断方案&#xff0c;类似断路器…

城市内涝监测预警系统:有效降低内涝风险,保障城市安全

近日&#xff0c;受台风“海葵”的影响&#xff0c;福建广东多地遭遇了持续性强降雨的袭击&#xff0c;道路积水严重&#xff0c;“城市看海”模式再次开启&#xff0c;不少网友纷纷调侃房子已经升级为海景房。近年来受极端天气影响&#xff0c;城市内涝灾害越发凸显&#xff0…

vscode 画流程图

文章目录 1、安装插件 draw2、新建文件3、开始画图4、另存为图片 vscode可以画流程图了&#xff0c;只需要安装插件就可以了。 1、安装插件 draw 2、新建文件 3、开始画图 4、另存为图片

小程序中如何查看会员的等级及变更记录

会员等级变更记录是了解用户购买行为和消费习惯的重要依据。下面就将介绍如何怎么查看会员的等级以及等级变更记录。 1. 找到指定的会员卡。在管理员后台->会员管理处&#xff0c;找到需要查看等级和记录的会员卡。也支持对会员卡按卡号、手机号和等级进行搜索。在这个页面…

后端太卷,我不玩了!

作者&#xff1a;阿秀 InterviewGuide大厂面试真题网站&#xff1a;https://top.interviewguide.cn 这是阿秀的第「303」篇原创 小伙伴们大家好&#xff0c;我是阿秀。 校招岗位形势是一直在变化的&#xff0c;并不是一成不变的&#xff0c;从18、19、20年这三年里的算法岗大热…

1-2 AUTOSAR规范文档

目录 一、AUTOSAR文档下载 二、AUTOSAR文档分类 三、软件设计规范文档解读&#xff08;SWS&#xff09; 一、AUTOSAR文档下载 AUTOSAR规范文档下载可以到AUTOSAR官网&#xff08;Home AUTOSAR&#xff09;进行下载。 下载操作如下图所示&#xff1a; 二、AUTOSAR文档分类 AU…

golang面试题:json包变量不加tag会怎么样?

问题 json包里使用的时候&#xff0c;结构体里的变量不加tag能不能正常转成json里的字段&#xff1f; 怎么答 如果变量首字母小写&#xff0c;则为private。无论如何不能转&#xff0c;因为取不到反射信息。如果变量首字母大写&#xff0c;则为public。 不加tag&#xff0c…