[Linux] 动态 / 静态库的生成与使用

news2024/11/25 19:35:37

文章目录

    • 简要概念
  • 静态库
    • 生成
    • 使用
  • 动态库
    • 生成
    • 使用

简要概念

库一般分为两种:

  • 静态库
  • 动态库

在 Linux 中:

  1. 如果是动态库,库文件是以 .so 作后缀的
  2. 如果是静态库,库文件是以 .a 作后缀的

库文件的命名:

libXXX.so / libXXX.a …

库的真实名称:去掉 lib前缀 ,去掉.a- .so-(且包含)后缀,剩余的为库名称



静态库

生成

在这里插入图片描述

  1. 这里创建一个主文件夹 library 在文件夹内部创建一个my_lib文件夹,用来放所写的库函数,这里用add, sub两个函数

在这里插入图片描述

库文件的命名:

add,sub分别是两个简单的加减函数:

在这里插入图片描述
在这里插入图片描述


  1. library 进行其余代码的编写:

编写makefile文件

在这里插入图片描述

src=mytest.c ./my_lib/add.c ./my_lib/sub.c
obj=mytest.o ./my_lib/add.o ./my_lib/sub.o
    
mytest:$(obj)    
    gcc -o $@ $~    
%.o:%.c    
    gcc -c $<    
    
.PHONY:clean    
clean:    
    rm -f *.o mytest 

此时我们有以下文件

在这里插入图片描述


  1. 通过将.o文件打包形成静态库

进入my_lib文件夹写Makefile

在这里插入图片描述

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

在这里插入图片描述

此时 lib_mymath.a 就是一个 静态库

静态库的本质:将所有的.o文件打包形成库


  1. 为了保证库的保密性
    再次完善Makefile:
    在这里插入图片描述
lib_mymath.a:add.o sub.o    
    ar -rc $@ $^    
%.o:%.c    
    gcc -c $<    
    
.PHONY:clean    
clean:    
    rm -f *.o lib_mymath.a output

.PHONY:output
output:    
    mkdir output    
    cp -rf *.h output     
    cp lib_mymath.a output    

重新make,再进行output操作

在这里插入图片描述
在这里插入图片描述
此时查看output中的文件:

在这里插入图片描述



使用

创建一个 caller 文件夹(在my_lib中,与output同级目录),为调用库的调用者:

output 给调用者(移动到caller文件夹里),更名为caller_lib

caller下写一段测试代码:

#include "add.h"    
#include "sub.h"    
      
void test()    
{    
    int x = 20;    
    int y = 10;    
    int r1 = my_add(x, y);    
    int r2 = my_sub(x, y);    
    
    printf("add : %d\n", r1);   
	printf("sub : %d\n", r2);    
}    
    
int main()    
{    
    test();    
    return 0;    
}  

运行后会发现:

在这里插入图片描述
报错,程序找不到 add.h ,因为系统默认只在统计目录下找头文件,而 add.h / sub.h 都在 caller_lib 文件夹中,所以找不到,这里引入一个指令:

gcc test.c -I./caller_lib -L./caller_lib -l_mymath

这里进行解释:

在这里插入图片描述

为什么库名称为 _mymath ?
注意 这里指定的是库的真实名称,及去掉前后缀的名称。

此时执行操作,运行a.out文件,发现正常生成结果,则库的使用没有问题。

在这里插入图片描述


可以将该指令写入caller 的 makefile文件中

在这里插入图片描述

不再进行后续演示




动态库

生成

  1. 先执行 make clean 命令,清除之前的部分文件

更改 my_lib 中的 Makefile 文件

在这里插入图片描述

 # 动态库实现    
# 形成一个动态链接的共享库    
lib_mymath.o:add.o sub.o                                                               
    gcc -shared -o $@ $^    
    
#产生 .o 目标文件,程序内部的地址方案:与位置无关,库文件可以在内存的任何位置加载,而且不影响和其他程序的关联性
%.o:%.c    
    gcc -fPIC -c $<    
    
.PHONY:clean    
clean:    
    rm -f lib_mymath.so *.o    
    
.PHONY: lib    
lib:    
    mkdir lib    
    cp *.h lib    
    cp lib_mymath.so lib    

并 更改 callermakefile 文件

在这里插入图片描述

mytest:test.c    
    gcc -o $@ $^ -I./caller_lib -L./caller_lib -l_mymath    
        
.PHONY:clean    
clean:    
    rm -f mytest    

使用

执行 caller 中的 makefile 文件 发现报错

在这里插入图片描述

原因如下:

  • 静态库编译时需要,运行时直接拷贝
  • 动态库编译和运行时都需要

这里引入一个新指令

  • LIBRARY_PATH 可以用于指定非标准位置的库文件,以便编译器能够正确地链接程序。

在这里插入图片描述
解释:

  1. 这个命令将环境变量 LD_LIBRARY_PATH 设置为 /home/aiyimu/myLinux/libiary/static/my_lib/caller/caller_lib,并将其导出,使得在当前终端中启动的所有子进程都能够访问这个环境变量。
  2. LD_LIBRARY_PATH 环境变量用于指定系统动态链接库查找的路径。

此时再次执行 make 命令

在这里插入图片描述

执行生成的 mytest

在这里插入图片描述

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

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

相关文章

RBTree

目录 红黑树的概念 红黑树性质 红黑树节点设计 红黑树的插入 红黑树的验证 红黑树和AVL树的比较 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的…

Point-SLAM: Dense Neural Point Cloud-based SLAM阅读记录

前言 只读了前半部分就感慨文章结构真的好清晰&#xff0c;从Introduction到related work完完全全都在体现它的motivation——他做了一件什么事情&#xff1f;以及为什么要这么做&#xff1f;解决了什么问题。 第一遍阅读 keywords: 以RGBD作为输入 使用点云表示场景的 dens…

【P21】JMeter XPath2 提取器(XPath2 Extractor)

文章目录 一、准备工作二、测试计划 一、准备工作 百度&#xff1a;https://www.w3school.com.cn/example/xmle/cd_catalog.xml 进入网页后&#xff0c;右键检查或按F12&#xff0c;打开调试工具 如图&#xff0c;使用XPath2 提取器&#xff08;XPath2 Extractor&#xff09;…

python 使用pandas或xlrd、xlwt实现对Excel的读取、添加、追加等一系列封装

不说了&#xff0c;又是造轮子的一天。在此我要严重批评CSDN或百度一堆浑水摸鱼的&#xff0c;某些人明明代码明显报错也来上传发博客&#xff0c;要么就是标题党&#xff0c;代码没报错但压根就不是实现那个功能的&#xff0c;简直是浪费时间。 废话不多说直接贴代码&#xff…

Linux—网络基础

目录 计算机网络背景 网络发展 认识 "协议" 网络协议初识 协议分层 OSI七层模型 TCP/IP五层(或四层)模型 网络传输基本流程 协议报头 局域网通信 网络传输流程图 局域网通信图 跨网络通信图 数据包封装和分用 网络中的地址管理 认识IP地址 认识MAC地址…

8款主流产品原型设计软件分享

在产品设计中&#xff0c;你知道如何选择合适的产品设计软件吗&#xff1f;每个产品设计软件的功能实际上是不同的&#xff0c;不同的产品设计软件应用领域是不同的。 只有深入了解每个产品设计软件的功能和主要适合该软件的行业&#xff0c;我们才能在设计相应的产品时找到合…

linux内核篇-进程及其调度

介绍一个程序从源文件到进程执行的过程 1、编译链接&#xff08;源文件到二进制文件&#xff09; Linux 下面二进制的程序也要有严格的格式&#xff0c;称为ELF&#xff08;Executeable and Linkable Format&#xff0c;可执行与可链接格式&#xff09; &#xff0c;这个格式可…

Simulink 和 Gazebo联合仿真控制机械臂【Matlab R2022a】

逛 B 站&#xff0c;偶然发现一个 up 主上传的视频&#xff0c;可以实现 Simulink 中搭建机器人的控制器设计&#xff0c;对运行在虚拟机中 Gazebo 中的机械臂进行控制&#xff0c;链接&#xff1a;三关节机械臂Gazebo-Simulink联合仿真&#xff0c;这让我很感兴趣&#xff0c;…

Web基础 ( 一 ) HTML

1.HTML <input /><input typebutton value按钮 />1.1.概念 1.1.1.HTML文件是什么 HTML表示超文本标记语言&#xff08;Hyper Text Markup Language&#xff09;, HTML文件是一个包含标记的文本文件, 必须有htm标记或者html扩展名。 可以通过浏览器(Browser)直接…

如何用自己公司的知识、流程等来训练Chat GPT?

在玩过 ChatGPT 并向它询问有关世界、金融和初创公司的一般问题后&#xff0c;我开始思考&#xff1a;“如果我可以用我自己的初创公司甚至大型公司的所有流程、知识和商业经验来训练 AI 模型会怎样&#xff1f;企业&#xff1f;” 使用您自己公司的知识、流程等培训 ChatGPT …

华为OD机试 - 计算网络信号、信号强度( Python)

题目描述 网络信号经过传递会逐层衰减,且遇到阻隔物无法直接穿透,在此情况下需要计算某个位置的网络信号值。 注意:网络信号可以绕过阻隔物。 array[m][n] 的二维数组代表网格地图, array[i][j] = 0代表i行j列是空旷位置; array[i][j] = x(x为正整数)代表i行j列是信号源,…

Python实现哈里斯鹰优化算法(HHO)优化XGBoost回归模型(XGBRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 2019年Heidari等人提出哈里斯鹰优化算法(Harris Hawk Optimization, HHO)&#xff0c;该算法有较强的全…

【A*算法——清晰解析 算法逻辑——算法可以应用到哪些题目】例题1.第K短路

A*算法 A*算法是什么例题1. 第K短路题意解析 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示…

栈和队列的实现

栈 栈的概念 栈也是线性表的一种&#xff0c;但是栈只允许在固定的一端进行插入与删除数据&#xff0c;而进行插入与删除的一端同意称为栈顶&#xff0c;而另一端就称为栈底。简称&#xff1a;后进先出。 压栈&#xff08;push&#xff09;&#xff1a;将数据插入栈顶。 出…

C++进阶——AVL树的构建

C进阶——AVL树的构建 AVL树 概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当 于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landi…

2023Python最火的第三方开源测试框架 ——pytest

一、介绍 本篇文章是介绍的是Python 世界中最火的第三方单元测试框架&#xff1a;pytest。 它有如下主要特性&#xff1a; assert 断言失败时输出详细信息&#xff08;再也不用去记忆 self.assert* 名称了&#xff09;自动发现测试模块和函数模块化夹具用以管理各类测试资源对…

顺序表,让数据有序飞舞:C语言实现全攻略

本篇博客会讲解顺序表这种数据结构的相关知识&#xff0c;并且使用C语言实现一个顺序表。 概述 什么是顺序表呢&#xff1f;顺序表是一种线性的数据结构&#xff0c;其特点是&#xff1a;数据是从第一个位置开始&#xff0c;连续存放的。其实&#xff0c;你完全可以把它等价于…

哈工大软件过程与工具作业3

哈尔滨工业大学 计算学部/软件学院 2022年秋季学期 2020级本科《软件过程与工具》课程&#xff08;3.0学分&#xff09; 作业报告 作业3&#xff1a;软件测试报告 姓名 学号 联系方式 石卓凡 120L021011 944613709qq.com/18974330318 目 录 1 作业目的与要求...........…

《计算机网络—自顶向下方法》 Wireshark实验(七):以太网与ARP协议分析

1 以太网 1.1 介绍 以太网是现实世界中最普遍的一种计算机网络。以太网有两类&#xff1a;第一类是经典以太网&#xff0c;第二类是交换式以太网&#xff0c;使用了一种称为交换机的设备连接不同的计算机。 经典以太网&#xff1a;是以太网的原始形式&#xff0c;运行速度从 …

股价与期待值“背道而驰”,友车科技能否站稳科创板?

上周&#xff0c;共计7只新股登陆A股&#xff0c;其中&#xff0c;用友汽车信息科技&#xff08;上海&#xff09;股份有限公司&#xff08;以下简称友车科技&#xff09;于5月11日在科创板上市。发行价为33.99元&#xff0c;发行3607.94万股&#xff0c;募资总额为12.24亿元。…