动静态库生成使用

       🔥🔥 欢迎来到小林的博客!!
      🛰️博客主页:✈️林 子
      🛰️博客专栏:✈️ 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.oar -rc $@ $^
%.o:%.cgcc -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.ogcc -shared -o $@ $^#产生.o目标文件,程序内部的地址方案是: 与位置无关,库文件可以在内存的任何位置加载,而且不影响和其他程序的关联性
%.o:%.cgcc -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.cgcc -o $@ $^ -I. -L. -lmymath .PHONY:clean
clean:rm -f test

然后编译,执行。

在这里插入图片描述

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

与动态库不再同一目录

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

test:test.cgcc -o $@ $^ -I./lib -L./lib -lmymath .PHONY:clean
clean:rm -f test

然后编译

在这里插入图片描述

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

格式:

export LD_LIBRARY_PATH= lib文件目录

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

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

相关文章

Vue2学习重点总结(Vue配置和使用+Vue脚手架配置代理+Vuex+Router)

V2脚手架文件结构 my-vue-project/ ├── build/ # 构建相关的配置文件&#xff0c;一般情况下你不需要关心这个目录 ├── config/ # 项目的配置文件&#xff0c;例如开发环境和生产环境的配置 ├── node_modules/ # 项目依赖的…

Purple Pi OH(Debian/Ubuntu)使用python控制gpio

本文分享的是Purple Pi OH开源主板搭载Debian/Ubuntu系统如何使用python控制gpio。 Purple Pi OH作为一款兼容树莓派的开源主板&#xff0c;采用瑞芯微RK3566 (Cortex-A55) 四核64位超强CPU,主频最高达1.8 GHz,算力高达1Tops&#xff0c;支持INT8/INT16&#xff0c;支持Tensor…

leetcode 129. 求根节点到叶节点数字之和

2023.9.8 好久没写回溯题了&#xff0c;有点陌生ToT。 本题思路就是通过回溯保存所有根节点到叶子节点的路径&#xff0c;然后将这些路径转化为数字并全部相加。 直接看代码&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* Tre…

Mavan进阶之多模块(聚合)

文章目录 Maven 多模块&#xff08;聚合&#xff09;非父子关系的多模块项目 Maven 多模块&#xff08;聚合&#xff09; Maven 继承和聚合是 2 个独立的概念。工程与工程之间可能毫无关系&#xff0c;也可能是继承关系&#xff0c;也可能是聚合关系&#xff0c;也可能既是继承…

Father and Child类的关系

做鼎桥笔试一个很有意思的点&#xff0c;记录一下&#xff1a; 1、考察的是方法重载&#xff1a;方法重载是在一个类中定义多个具有相同名称但参数列表不同的方法的行为。编译器使用传递给方法的参数类型以及它们的数量来确定调用哪个方法。 首先说结果&#xff1a;输出的是I…

使用Docker部署debezium来监控 MySQL 数据库

使用Docker部署debezium来监控 MySQL 数据库 Debezium是一个分布式平台,它将来自现有数据库的信息转换为事件流,使应用程序能够检测并立即响应数据库中的行级更改。 Debezium构建在Apache Kafka之上,并提供了一组Kafka Connect兼容的连接器。每个连接器都与特定的数据库管…

Python的math.sqrt()和math.pow()的使用

一、求平方根&#xff08;即开方&#xff09;——math.sqrt(被开方数) >>> math.sqrt(8) 2.8284271247461903 >>> math.sqrt(64) 8.0 # 等同于使用 **0.5 &#xff08;乘方数的倒数&#xff09; >>> 8**0.5 2.8284271247461903 >>> 64…

用python实现基本数据结构【01/4】

说明 如果需要用到这些知识却没有掌握&#xff0c;则会让人感到沮丧&#xff0c;也可能导致面试被拒。无论是花几天时间“突击”&#xff0c;还是利用零碎的时间持续学习&#xff0c;在数据结构上下点功夫都是值得的。那么Python 中有哪些数据结构呢&#xff1f;列表、字典、集…

seata的部署和集成:部署Seata的tc-server、微服务集成seata、TC服务的高可用和异地容灾

seata的部署和集成 一、部署Seata的tc-server 1.下载 首先我们要下载seata-server包&#xff0c;地址在http&#x1f615;/seata.io/zh-cn/blog/download.html 当然&#xff0c;课前资料也准备好了&#xff1a; 2.解压 在非中文目录解压缩这个zip包&#xff0c;其目录结构…

Kafka3.0.0版本——消费者(消费者组初始化流程图解)

一、消费者组初始化流程图解 每个consumer都发送JoinGroup请求&#xff0c;如下图所示&#xff1a; 选出一个consumer作为leader&#xff0c;如下图所示&#xff1a; 把要消费的topic情况发送给leader 消费者&#xff0c;如下图所示&#xff1a; leader会负责制定消费方案…

QQ文件传输协议研究

引言 我们都知道,现在越来越多的应用采取了 HTTPS or TLS 传输协议,对于一般的协议,我们可以使用中间人技术对流量进行劫持转发,从而破解密文,这边可以参见我的另外一篇文章基于加密邮件协议的中间人攻防实战, 而对于 HTTPS 应用即使是我们采取中间人技术,也很难让浏览器…

File类操作

1. 练习一 在当前模块下的 text 文件夹中创建一个 io.txt 文件 import java.io.File; import java.io.IOException;public class Practice1 {public static void main(String[] args) {File file new File("D:\\kaifamiao");File file1 new File(file, "tex…

得帆信息副总裁——孔金:低代码在医药行业的应用实践

医药行业作为国计民生的重点行业之一&#xff0c;受到法律法规的严格监管&#xff0c;其信息化程度普遍较高&#xff0c;也是较早通过ERP&#xff08;企业资源管理系统&#xff09;、WMS&#xff08;仓储管理系统&#xff09;、TMS&#xff08;物流管理系统&#xff09;、MES&a…

AWS DynamoDB浅析

AWS DynamoDB是一个NOSQL数据库。 可以通过IAM直接控制权限&#xff0c;和AWS其他服务连用非常方便。 DynamoDB的几个概念 Partition Key&#xff1a;分区键。如果没有Sort key&#xff0c;那么Partition Key必须唯一&#xff0c;如有Sort key&#xff0c;Partition Key可以重…

dos汇编总结

前言&#xff1a; 计组课本需要学习汇编&#xff0c;可惜自己看不太懂。这里发现一个学习方法交给大家。其实新手可能一些抽象表示难理解&#xff0c;这里我把我学习的疑问点以及思路记录一下。 要点&#xff1a; 这里我以题为例给大家分析 输出输入对应大写字母的小写字母 …

MySql系列-常用命令

基础知识-常用命令 命令不区分大小写 1、mysql连接 mysql -u username -p 实例: mysql -u root -p 2、元数据查询 //服务器版本信息 SELECT VERSION( ) //当前数据库名 (或者返回空) SELECT DATABASE( ) //当前用户名 SELECT USER( ) //服务器状态 SHOW STATUS //服务…

网络原理(二)TCP的可靠传输

网络原理&#xff08;一&#xff09;目录 网络原理应用层传输层先说UDP&#xff08;不可靠传输&#xff09;重点说明&#xff34;&#xff23;&#xff30;&#xff08;可靠传输&#xff09;一、确认应答二、超时重传三、链接管理建立连接断开链接 四、滑动窗口五、流量控制&am…

Flink CDC-MySQL CDC配置及DataStream API实现代码...可实现监控采集多个数据库的多个表

MySQL CDC配置 第一步: 启用binlog 1. 检查MySQL的binlog是否已启用 show variables like %log_bin%;2. 若未启用binlog 打开MySQL配置文件my.cnf(MySQL安装目录的etc文件夹下)找到[mysqld]部分&#xff0c;添加如下配置log-binmysql-bin # 指定二进制日志文件的名称前缀…

MySQL之事务

事务概念 事务就是一组DML语句组成&#xff0c;这些语句在逻辑上存在相关性&#xff0c;这一组DML语句要么全部成功&#xff0c;要么全部失败&#xff0c;是一 个整体。 一个完整的事务&#xff0c;绝对不是简单的 sql 集合&#xff0c;还需要满足如下四个属性&#xff08;ACI…

由Qt::BlockingQueuedConnection引起的关闭Qt主页面而后台仍有进程残留

BUG&#xff1a;由Qt::BlockingQueuedConnection引起的关闭Qt主页面而后台仍有进程残留 1、错误代码示例 首先我们看下下面的代码&#xff0c;可以思考一下代码的错误之处 /** BlockingQueueDeadLock.h **/ #pragma once#include <QtWidgets/QMainWindow> #include &q…