31-库文件的制作与使用——静态库文件与动态库文件

news2025/4/21 3:04:08

31-库文件的制作与使用——静态库文件与动态库文件

一、库文件介绍

库文件是在计算机编程中用来存放变量函数的文件,提供给开发者开箱即用的资源。库文件分为静态库动态库两种,二者在程序链接阶段的行为不同:

  • 静态库:在程序的链接阶段被复制到程序中。每次程序运行时,静态库内容都被完整复制,因此占用更多的内存,但无需依赖外部文件,适合独立分发。
  • 动态库:在程序的链接阶段不被复制,而是程序运行时由系统动态加载到内存中。多个程序可以共享一个动态库实例,节省内存并便于模块化更新

1.1 静态库和动态库的区别

  • 静态库

    • 在编译时将库的内容复制到程序中。
    • 优点:无需担心运行时缺失库文件。
    • 缺点:占用更多内存,不便于更新。
    • 类似于书店,只卖不借。
  • 动态库

    • 运行时加载,不在编译时复制到程序中。
    • 优点:节省内存,提高程序执行效率。
    • 缺点:需要运行时动态库的支持。
    • 类似于图书馆,只借不卖。

1.2 库文件的命名规则

  • 前缀 lib:例如 libDeployPkg.so.0
  • 静态库后缀 .a
  • 动态库后缀 .so
  • 版本号在后缀之后:例如 libc.so.1.0.3

1 libc.so.1.0.3
lib 库文件的前缀
c 库的名字(链接库文件时 ,只需要写上该名字)
.so 后缀(so为动态库/共享库 a 则是静态库)
.1 库文件的版本号
.0.3 修正号

二、制作库文件

制作静态库和动态库的原材料都是 .o 文件(可重定位文件),这些文件不能包含主函数 main

2.1 静态库的制作

  1. 生成 .o 文件

    gcc -c -fPIC -I../inc swap.c -o swap.o
    gcc -c -fPIC -I../inc max.c -o max.o
    
    • -c:生成可重定位文件后停止。
    • -fPIC:生成与地址无关的可执行文件。

fPIC 选项《动态链接库》的说法:如果不加-fPIC,则加载.so文件的代码段时,代码段引用的数据对象需要重定位, 重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的copy.每个copy都不一样,取决于 这个.so文件代码段和数据段内存映射的位置(地址)

  1. 生成静态库文件

    ar -rcs libmy_lib.a swap.o max.o
    

rcs是生成静态库文件
三个参数,分别表示:

  • r:替换已存在的文件。
  • c:创建新的库文件。
  • s:生成索引,加快库文件的查找速度。
  1. 使用静态库文件

    gcc src/*.c -I./inc -L./lib -lmy_lib -o bin/main
    

-I是指定头文件的路径,-L是指定库文件的路径,-l是指定库文件的名字,-o是生成可执行文件的名字(路径)。

在这里插入图片描述

在这里插入图片描述

2.2 动态库的制作

  1. 生成 .o 文件

    gcc -c -fPIC -I../inc swap.c -o swap.o
    gcc -c -fPIC -I../inc max.c -o max.o
    
  2. 生成动态库文件

    gcc -shared -fPIC -o libmy_lib.so.0 swap.o max.o
    

-shared 表示生成动态库文件
-fPIC 表示生成与地址无关的可执行文件
-o 表示生成动态库文件的名字(路径)

在这里插入图片描述

  1. 生成动态库文件的软链接

    ln -s libmy_lib.so.0 libmy_lib.so
    

注意:软链接是非必须的,但是在版本管理中,我们通常需要为每个版本的库文件创建一个软链接,以便于管理。
为什么需要生成软链接?

  • 版本管理:动态库的版本会不断更新,例如从 libmy_lib.so.0 更新到 libmy_lib.so.1。通过软链接,你可以将 libmy_lib.so 指向最新的版本,无需修改代码或重新编译。
  • 编译方便:编译器和链接器通常会查找没有版本号的库文件名称(例如 libmy_lib.so),然后自动链接到相应的库文件。如果没有软链接,编译器可能会找不到库文件,导致编译失败。
  • 简化使用:软链接可以让你在编写 Makefile 或其他编译脚本时更加简洁,不需要关注具体的库文件版本号。
  1. 使用动态库文件
    • 编译:

      gcc src/*.c -I./inc -L./lib -lmy_lib -o bin/main
      
    • 运行:

      ./main
      
2.2.1 动态库加载问题及解决方法

直接使用会报错:

./mian: error while loading shared libraries: libmy_lib.so:cannot open shared object file: No such file or directory

原因是:
因为动态库在我们运行程序的时候需要加载到内存中,加载的动作由系统来完成。系统并不知道我们的库在哪里,因此加载失败。

  1. 方法一:将库文件放入系统默认路径(推荐)。–> /usr/lib/或者/lib

    sudo cp lib/libmy_lib.so /usr/lib/
    
  2. 方法二:将库路径添加到环境变量。

    vim ~/.bashrc
    

    在末尾添加:

    export LD_LIBRARY_PATH=/home/even/my_lib:$LD_LIBRARY_PATH
    

LD_LIBRARY_PATH 是一个环境变量,用于指定动态链接库的搜索路径。当程序运行时,系统会按照这个路径来查找动态链接库。:为分隔符,$LD_LIBRARY_PATH表示原来的路径。

重新加载配置文件:

source ~/.bashrc
  1. 方法三:在系统默认路径下添加新的路径。

    sudo vim /etc/ld.so.conf.d/libc.conf
    

    添加库路径:

    /home/even/my_lib
    

    重新生效配置文件:

    sudo ldconfig
    

注意:
如果动态库于静态库名字一样,而且放一起,则编译器==默认使用动态链接==
如何指定让编译器使用静态库 -static

2.3 静态编译选项

  • 指定使用静态库:

    gcc src/*.c -o bin/main -L./lib -I./inc -lmy_lib -static
    

三、 隐藏命令行路径

前面得路径太长了,可以进行隐藏:

  1. 编辑 .bashrc

    vim ~/.bashrc
    
  2. 添加以下内容:

    export PS1='[\u@\h \W]\$ '
    
  3. 重新加载配置文件:

    source ~/.bashrc
    

在这里插入图片描述

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

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

相关文章

HALCON如何添加外部函数

1、在HALCON菜单栏中点击【编辑】选择【参数选择】或者 点击【函数】选择【管理函数】进入到参数窗口; 2、在参数窗口下依次选择【函数】、【目录】和【添加】操作; 3、外部函数添加成功后,其他程序文件均可使用该外部函数。

自定义prometheus监控获取nginx_upstream指标

1、前言 上篇文章介绍了nginx通过nginx_upstream_check_module模块实现后端健康检查,这篇介绍一下如何自定义prometheus监控获取nginx的upstream指标来实时监控nginx。 2、nginx_upstream_status状态 支持以下三种方式查看nginx_upstream的状态 /status?formatht…

【C++】标准库:介绍string类

string 一.string类介绍二.string类的静态成员变量三.string类的常用接口1.构造函数(constructor)2.析构函数(destructor)3.运算符重载(operator)1.operator2.operator[]3.operator4.operator 4.string的四…

Kitti数据集解析

目录 一、概述 2、详细内容 1、lable标签 2、标定参数 3、点云数据 C++代码读取bin文件 python代码读取bin文件 三、功能实现 1、点云数据转成投影到图像 2、图像数据转成投影到点云 3、点云3D结果转成图像BEV鸟瞰图结果 一、概述 KITTI整个数据集是在德国卡尔斯鲁厄…

DDoS攻击:威胁与防护策略

DDoS(分布式拒绝服务)攻击是网络安全领域的一大挑战,对企业造成严重的影响。本文将深入探讨DDoS攻击的原理和防护方法。 DDoS攻击的原理 DDoS攻击通过大量请求,使目标系统无法响应正常请求。攻击者利用多台计算机发送大量请求&am…

【Unity2D 2022:Data】读取csv格式文件的数据

一、创建csv文件 1. 打开Excel,创建xlsx格式文件 2. 编辑卡牌数据:这里共写了两类卡牌,第一类是灵物卡,具有编号、卡名、生命、攻击四个属性;第二类是法术卡,具有编号、卡名、效果三个属性。每类卡的第一…

使用在UE5中使用AirSim插件Eigen库头文件引用报错,出现报错的解决方式

一、概述 如图所示&#xff0c;用红线圈出的两条头文件引用会报错&#xff0c;提示无法找到他们&#xff0c;但是可以发现的是&#xff0c;他们的路径书写是没有问题的。 // #include <Source/Airlib/deps/eigen3/Eigen/Core> // #include <Source/Airlib/deps/eigen…

追问试面试系列:开篇

我们不管做任何事情&#xff0c;都是需要个理由&#xff0c;而不是盲目去做。 为什么写这个专栏&#xff1f; 就像我们被面试八股文时&#xff0c;市面上有很多面试八股文&#xff0c;随便一个八股文都是500&#xff0c;甚至1000面试题。诸多面试题&#xff0c;难道我们需要一…

【系统架构设计师】十八、信息系统架构设计理论与实践①

目录 一、信息系统架构概述 二、信息系统架构风格与分类 2.1 信息系统架构风格 2.2 信息系统架构分类 三、信息系统架构模型 3.1 单体应用 3.2 客户机/服务器 3.2.1 二层 C/S 3.2.2 三层 C/S 和 B/S 3.2.3 多层 C/S 和 B/S 3.2.4 MVC 3.3 面向服务架构(SOA)模式 …

PVE环境中调整虚拟机磁盘大小

我的希望将PVE中的虚拟机磁盘调整一下&#xff0c;增加20GB。在查询了一些资料后&#xff0c;做一下总结教程。 环境是 PVE8.2.2 版本&#xff0c;虚拟机系统是centos7.9.2009-minimal&#xff0c; 安装系统时划分磁盘分区方式是默认分区方式&#xff08;不同分区方式下&#…

RISC-V (二)汇编语言编程

简介 汇编语言是一种“低级”语言。 汇编语言的缺点&#xff1a; -难度 -难写 -难移植 汇编语言的优点&#xff1a; -灵活 -强大 汇编语言的应用场景 -需要直接访问底层硬件的地方 -需要对性能执行极致优化的地方 汇编语言语法介绍&#xff08;GNU版本&#xff09; 基本组成 …

《python程序语言设计》第6章15题财务应用程序:打印税款表。利用程序清单4-7的代码

6.15 打印税款表 def computeTax(status_n, income):tax 0if status_n 0:if income < 8350:tax income * 0.10elif income < 33950:tax 8350 * 0.10 (income - 8350) * 0.15elif income < 82250:tax 8350 * 0.10 (33950 - 8350) * 0.15 (income - 33950) * 0.…

Docker 制作java8镜像

一、在Linux服务器安装Docker 可参考&#xff1a;Linux安装Docker-CSDN博客 二、使用Dokcer制作java8镜像 2.1 上传jdk8的压缩包 mkdir -p /home/data/develop/jdk cd /home/data/develop/jdk 在该路径下上传jdk-8u261-linux-x64.tar.gz包 如下图&#xff1a; 2.2 编写Docke…

HALCON如何创建本地函数

HALCON中有本地函数(.hdev)、外部函数(HDevelop函数文件.hdvp)和库函数(.hdpl) 本地函数(.hdev)&#xff1a;创建后仅在当前程序文件中使用&#xff1b; 外部函数(HDevelop函数文件.hdvp)&#xff1a;创建后可以在其他程序文件中复用&#xff0c;默认保存在…/ procedures/下…

【React】详解 Redux 状态管理

文章目录 一、Redux 的基本概念1. 什么是 Redux&#xff1f;2. Redux 的三大原则 二、Redux 的核心组件1. Store2. Action3. Reducer 三、Redux 的使用流程1. 安装 Redux 及其 React 绑定2. 创建 Action3. 创建 Reducer4. 创建 Store5. 在 React 应用中使用 Store6. 连接 React…

【Java算法专场】二分查找(下)

目录 山脉数组的峰顶索引 算法分析 算法步骤 算法代码 算法示例 寻找峰值 算法分析 算法步骤 算法代码 算法示例 寻找旋转排序数组中的最小值 算法分析 算法步骤 算法代码 算法示例 点名 算法分析 算法步骤 算法代码 算法示例 山脉数组的峰顶索引 …

生鲜云订单零售系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商品分类管理&#xff0c;商品信息管理&#xff0c;订单评价管理&#xff0c;订单管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;商品信息&#…

DDOS攻击学习 - kali初学

文章目录 本地ssh配置nmap(网络连接的工具)nmap -sP IP地址nmap -p 1-65535 -A IP地址主机发现Ping扫描端口扫描时序扫描常用扫描方式指纹识别与探测全端口版本探测防火墙/IDS逃逸报文分段信息收集IP信息收集WHOIS查询数据库渗透测试MySQL列举数据库列举MySQL变量发起请求目录扫…

暑假第一周——网易云音乐仿写

iOS学习 前言发现&#xff1a;控件的堆叠我的&#xff1a;更换头像账号&#xff1a;切换夜间总结 前言 本周正式开始暑期学习&#xff0c;完成了网易云音乐的仿写。 发现&#xff1a;控件的堆叠 发现页面由一个无限轮播图&#xff0c;四个自定义cell完成。无限轮播图在之前已经…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第五十九章 等待队列

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…