Linux 的静态库和动态库

本文目录

  • 一、静态库
    • 1. 创建静态库
    • 2. 静态库的使用
  • 二、动态库
    • 1. 为什么要引入动态库呢?
    • 2. 创建动态库
    • 3. 动态库的使用
    • 4. 查看可执行文件依赖的动态库

  

一、静态库

   在编译程序的链接阶段,会将源码汇编生成的目标文件.o与引用到的库(包括静态库)的二进制文件一起链接打包到最终的可执行文件中。

静态库常以.a.lib为后缀。
   静态库命名规范:lib[name].a,其中lib是静态库前缀,中间[name]为静态库名称,最后.a为静态库后缀。例如:libaddfunc.a,其中addfunc才是静态库的名称。

1. 创建静态库

   在使用创建静态库前,为了使得工程目录更加清晰,我们创建三个文件夹lib(存放.h文件)、src(存放.c文件)、debug(存放.o文件)

(1)编写库文件。
fun1.c

#include "stdio.h"

int add(int a, int b)
{
  return a+b;
}

fun1.h

#include "stdio.h"

int add(int a, int b);

将编写好的库文件存放到不同的文件夹里。

(2)将库文件编译为目标文件(.o)
  使用命令:gcc -c ./src/fun1.c -o ./debug/fun1.o,在debug目录下生成fun1.o目标文件。

(3)创建封装静态库
  使用ar工具,并添加命令 rcs,将debug文件夹里的所有的.o文件进行封装为静态库libaddfunc.a
  如:ar rcs libaddfunc.a ./debug/*.o。此时libaddfunc.a就是静态库。其中addfunc是静态库的名称。
在这里插入图片描述

2. 静态库的使用

(1)编写main.c源码文件

main.c

#include "fun1.h"
#include "stdio.h"

int main()
{
  int a=8;
  int b=10;
  int sum=0;
  sum=add(a,b);
  printf("%d\n"sum);
}

(2)编译源码时链接静态库,生成可执行文件。
  命令:gcc main.c -o main -I ./lib -L ./ -l addfunc
   -I ./lib :表示头文件所在的路径。
   -L ./ :表示静态库所在的路径,此处为当前路径。
   -l addfunc:表示要连接的静态库名称,addfunc为静态库名称。

在这里插入图片描述

(3)运行可执行文件。
在这里插入图片描述

二、动态库

   在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入。

动态库常以.so.dll为后缀。
   动态库命名规范:lib[name].a,其中lib是动态库前缀,中间[name]为动态库名称,最后.so为动态库后缀。例如:libsubfunc.so,其中subfunc才是动态库的名称。

1. 为什么要引入动态库呢?

   答:因为在静态库存在一个弊端,就是当我们对库文件添加或修改了部分内容,将其生成新的静态库文件后,我们需要将所有使用该库文件的程序文件都要重新编译。因为当静态库修改后,其二进制文件也会改变。静态库在程序编译链接阶段,将字节的二进制文件一同打包到程序的可执行文件中。所以静态库改变后,需要将使用了该静态库的可执行文件都需要重新进行编译。这样就会特别繁琐,所以引入了动态库。
   动态库只会在程序运行时载入。动态库作为一个独立的文件存在于系统中,可以被多个文件共享使用,当动态库进行维护时,只需要将新的动态库文件替换旧的动态库文件即可,不需要对使用动态库的文件程序重新编译,这就是动态库的好处。

2. 创建动态库

举例使用的库文件我们使用上述静态库时的库文件。同样存放到不同的文件夹中。

(1)将库文件生成目标文件(.o)

  使用命令:gcc -fpic -c ./src/fun1.c -o ./debug/fun1.o,在debug目录下生成fun1.o目标文件。

(2)生成动态库–共享库
  使用命令:gcc -shared ./debug/*.o -o libfun2.so。其中libfun2.so为动态链接库,也称共享库。
在这里插入图片描述

3. 动态库的使用

(1)编译源码,生成可执行文件
使用命令:gcc main.c -o main -I ./lib -L ./ -l fun2
   -I ./lib :表示头文件所在的路径。
   -L ./ :表示动态库所在的路径,此处为当前路径。
   -l addfunc:表示要连接的动态库名称。
在这里插入图片描述
  虽然这里我们也指定了动态库的路径,但是动态库在编译可执行文件时并不会进行链接,而是在执行时才会进行链接!所以当我们维护动态库时,才不会对所使用动态库的文件进行重新编译。

(2)将库路径添加到系统加载器
   生成的可执行文件,当我们执行时,会发生以下错误,原因是我们虽然告诉了编译器库文件和头文件的路径所在位置,但是当编译器编译好后,就与编译器无关了;当我们执行(运行)可执行程序时,是由加载器来完成的。所以我们需要在运行时,告诉系统库文件在哪里。
在这里插入图片描述

 方法一:将libfun2.so添加到/usr/lib/下, 使用命令:sudo cp libfun2.so /usr/lib/进行添加。不推荐!
 方法二:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/qjl , LD_LIBRARY_PATH环境变量用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径。
在这里插入图片描述

(3)运行可执行文件
在这里插入图片描述

4. 查看可执行文件依赖的动态库

使用命令:ldd 可执行文件
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024五一数学建模竞赛(五一赛)选题建议+初步分析

提示&#xff1a;DS C君认为的难度&#xff1a;B>A>C&#xff0c;开放度&#xff1a;AB<C。 以下为A-C题选题建议及初步分析&#xff1a; A题&#xff1a;钢板最优切割路径问题 l 难度评估&#xff1a;中等难度。涉及数学建模和优化算法&#xff0c;需要设计最优的…

创新指南|以患者为中心的DTC战略3大趋势推动医疗保健新增长

随着消费者愈发重视个性化和优质的医健体验,医健行业亟需直达消费者DTC重塑服务模式。本文着眼于医健领域的三大消费趋势:消费者在医健领域的支出不断增加,但对整体体验并不满意;消费者信任医健机构处理个人数据,但医疗机构利用数据提升体验的做法有限;消费者在选择医健服务时正…

树莓派4B、树莓派5使用 Debian 12(bookworm) 的配置

最新的系统Debian 12&#xff08;bookworm&#xff09;目前的一些配置发生了一些改变&#xff0c;同时树莓派5的硬件也做了一部分调整。 这里均以系统 Debian 12 对不同的配置做简单记录。 树莓派4B使用旧系统的配置见【树莓派】专栏。 新系统中的配置文件 config.txt 和 cmd…

第11章 数据库技术(第一部分)

一、数据库技术术语 &#xff08;一&#xff09;术语 1、数据 数据描述事物的符号描述一个对象所用的标识&#xff0c;可以文字、图形、图像、语言等等 2、信息 现实世界对事物状态变化的反馈。可感知、可存储、可加工、可再生。数据是信息的表现形式和载体&#xff0c;信…

github托管静态页面

免费在线上空间&#xff0c;不用简直就是浪费&#xff0c;关键还不限流量赶紧去折腾一下 这是搭建的GitHub托管网页&#xff0c;由于是GitHub的服务器&#xff0c;国内访问会非常&#xff01;慢 下载 Watt Toolkit 这里我建议下载一个软件 Watt Toolkit 它是一个开源跨…

QT——简易计算机(从0开始)

目录 一、题目描述&#xff1a; 二、创建工程&#xff1a; 三、UI界面设计&#xff1a; 四、程序编写&#xff1a; 五、总程序&#xff1a; 六、windows可执行文件 七、实现效果 一、题目描述&#xff1a; 创建一个简单的图形用户界面(GUI),包括一个文本框用于显示计算结…

Linux(Centos 7)环境下安装wget,并且更换阿里云镜像

Linux(Centos 7) Minimal 安装后&#xff0c;由于没有预装wget&#xff0c;在使用wget命令去下载安装相关应用时&#xff0c;提示&#xff1a;“wget: command not found” 先在Linux服务器窗口中&#xff0c;输入如下命令&#xff0c;检查Linux服务器有没有安装过wget。 rpm -…

【网站项目】戒烟网站

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

如何在Linux上安装Python?2024Python安装教程

在Linux上安装Python并不难&#xff0c;对于Ubuntu或Debian系统&#xff0c;使用命令sudo apt install python3&#xff1b;对于CentOS、Red Hat或Fedora系统&#xff0c;使用命令sudo yum install python3。 如何在Linux上安装Python&#xff1f; 确切的安装步骤有所不同&am…

【Linux 系统】多线程(线程控制、线程互斥与同步、互斥量与条件变量)-- 详解

一、线程概念 线程是进程的一个执行分支&#xff0c;是在进程内部运行的一个执行流。下面将从是什么、为什么、怎么办三个角度来解释线程。 1、什么是线程 上面是一张用户级页表&#xff0c;我们都知道可执行程序在磁盘中无非就是代码或数据&#xff0c;更准确点表述&#xff0…

Python基础学习之记录中间文件

倘若想记录代码运行过程中的结果文件&#xff0c;那么以下函数仅供参考 代码示例&#xff1a; import os import datetime import sys import pandas as pd# 定义总的文件夹路径 base_folder E:\\D\\log\\product_data_compare_log# 定义一个函数来创建带时间戳的文件夹 def…

Python量化炒股的财务因子选股

Python量化炒股的财务因子选股-财务因子选股 选股是股市投资的第一步&#xff0c;是最基础的一步&#xff0c;也是最重要的一步。 初识财务因子选股 量化选股是利用数量化的方法选择股票组合&#xff0c;期望该股票组合能够获得超越基准收益率的投资行为。总的来说&#xff…

el-tabs作为子组件使用页面空白

文章目录 前言一、问题展示二、源码分析三、解决方案 前言 如果el-tabs是子组件&#xff0c;父组件传值value / v-model为空字符&#xff0c;这个时候在watch中监听value / v-model就会发现监听的数据会被调用为‘0’。一定是作为子组件引用&#xff0c;且在watch进行监听&…

【webrtc】MessageHandler 7: 基于线程的消息处理:切换main线程向observer发出通知

以当前线程作为main线程 RemoteAudioSource 作为一个handler 仅实现一个退出清理的功能 首先on message的处理会切换到main 线程 :main_thread_其次,这里在main 线程对sink_ 做清理再次,在main 线程做出状态改变,并能通知给所有的observer 做出on changed 行为。对接mediac…

OpenNJet : 下一代云原生应用引擎

本心、输入输出、结果 文章目录 OpenNJet &#xff1a; 下一代云原生应用引擎前言OpenNJet 技术架构安装 OpenNJet为什么有了 OpenNJetOpenNJet 和 NGINX 是什么关系什么是云原生应用引擎&#xff1f;OpenNJet 的有哪些优势OpenNJet 的有哪些优势 OpenNJet 与国产化OpenNJet 使…

【团体程序设计天梯赛】往年关键真题 L2-036 网红点打卡攻略 模拟 L2-037 包装机 栈和队列 详细分析完整AC代码

【团体程序设计天梯赛 往年关键真题 详细分析&完整AC代码】搞懂了赛场上拿下就稳 【团体程序设计天梯赛 往年关键真题 25分题合集 详细分析&完整AC代码】&#xff08;L2-001 - L2-024&#xff09;搞懂了赛场上拿下就稳了 【团体程序设计天梯赛 往年关键真题 25分题合…

初学React基础

最近准备跟着黑马React学一下React&#xff0c;扩充一下技术面&#xff0c;打算还是以一边学习一边记笔记为主&#xff0c;进行学习&#xff01; 1. React介绍 1.1. React是什么&#xff1f; React是由FaceBook现在称&#xff08;Meta&#xff09;开发的开源 JavaScript 库&a…

SpringCloudStream 3.x rabbit 使用

1. 前言 今天带来的是SpringCloudStream 3.x 的新玩法&#xff0c;通过四大函数式接口的方式进行数据的发送和监听。本文将通过 rabbitMQ 的方式进行演示 3.x版本后是 可以看到 StreamListener 和 EnableBinding 都打上了Deprecated 注解。后续的版本更新中会逐渐替换成函数式…

如何批量修改文件的时间属性?修改创建时间,修改时间和访问时间

一&#xff0c;前言 在Excel中&#xff0c;修改文件的访问时间、创建时间和修改时间通常不是一个直接的功能。但是&#xff0c;我们可以通过一些间接的方法和工具来实现这一目标。请注意&#xff0c;直接修改这些时间戳可能会影响文件的完整性和安全性&#xff0c;因此在进行任…

Python 与 TensorFlow2 生成式 AI(四)

原文&#xff1a;zh.annas-archive.org/md5/d06d282ea0d9c23c57f0ce31225acf76 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第九章&#xff1a;文本生成方法的崛起 在前几章中&#xff0c;我们讨论了不同的方法和技术来开发和训练生成模型。特别是在第六章“使用 …