linux中静态库与动态库

news2024/10/6 20:36:12

linux中静态库与动态库

  • 1. 静态库
    • 静态库的制作:
    • 静态库的使用:
  • 2. 动态库
    • 动态库的制作:
    • 动态库的使用:
  • linux中静态库与动态库的区别

1. 静态库

静态库的制作:

gcc add.c mult.c -c //这样就生成add.o mult.o目标文件
ar rcs libcalc.a *.o//生成libmain.a静态库

静态库的使用:

头文件在include文件夹下
库文件在lib文件夹下(libcalc.a是静态库)
源文件main.cpp在src文件夹下
在这里插入图片描述
要编译main.cpp:

gcc main.c -o app   -I ../include/   -l calc   -L ../lib/
#-I表示后面跟着头文件的路径
#-l表示后面跟着库的名字
#-L表示后面跟着(静态)库的路径

在这里插入图片描述


在这里插入图片描述

在这里插入图片描述


2. 动态库

动态库的制作:

1.gcc -c -fpic   a.c b.c
2.gcc -shared    a.o b.o   -o libcalc.so
或者写成一句话:
gcc -shared -fpic  a.c b.c  -o libcalc.so
-shared 指定生成动态库
-fpic :fPIC选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。

动态库的使用:

头文件在include文件夹下
库文件在lib文件夹下(libcalc.so是动态库)
源文件main.cpp在src文件夹下

---library
   |
   |___include
   |   |_________head.h
   |___lib
   |   |_________libcalc.so
   |___src
   	   |_________main.c

在src文件中编译:

1.gcc main.c -o app    -I ../include    -l calc      -L ../lib/
#-I表示后面跟着头文件的路径
#-l表示后面跟着库的名字
#-L表示后面跟着(动态)库的路径

(此时编译通过,执行app却报错)
报错的原因:
我们使用-I,-L,-l这三个选项都是“在编译期间”告诉编译器我们使用的头文件和库文件在哪里以及是谁,
但是,
当生成的可执行程序生成后就与编译器没有关系了,此后该可执行程序运行起来后,操作系统找不到该可执行程序所依赖的动态库,我们可以使用ldd命令进行查看。

#在运行时,系统会按照下面这个路径去寻找动态库,
#DT_RPATH段–>环境变量LD_LIBRARY_PATH–>/etc/ld.so.cache文件列表->/lib和/usr/lib
#所以,我们需要在上任意一个路径中去配置动态库的绝对路径

3. ldd app 查看可执行文件app所依赖的文件是否都找到了
2.大多是直接在环境变量中配置动态库的绝对路径
1) vim .bashrc
2) 在.bashrc的最后面添加: 
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:libcalc.so的绝对路径(可以通过pwd获得)
3) source .bashrc #更新
#此时./app就可以用了

在这里插入图片描述

linux中静态库与动态库的区别

在Linux中,库是一组可以被程序调用的可执行代码和数据文件。静态库与动态库是两种不同类型的库。

  1. 静态库
    静态库也称为“存档文件”,它包含了编译器在编译时需要的对象文件的集合。这些对象文件会被打包在一个单独的文件中,被链接到程序中。当程序运行时,所有的代码和数据都被加载进内存,因此静态库也称为“静态链接库”。这意味着,每当程序运行时,都需要将库的完整副本加载到内存中,无论其中是否实际使用了所有函数或数据。因此,静态库通常比较大,但是具有很好的兼容性和稳定性。

  2. 动态库
    动态库是一种在程序运行时才被加载的库,也称为“共享对象文件”。与静态库不同,动态库并不会被整个程序复制到内存中,而只会在需要时加载。因此,动态库通常比静态库小,但可能需要更多的运行时开销来查找、加载和卸载库。由于动态库的特性,它们可以被多个程序共享,这可以减少内存开销,并且使更新和维护库更加方便。

总体来说,静态库和动态库都有各自的优点和缺点,开发人员需要根据具体情况来选择使用哪种类型的库。通常,当需要与其他语言链接时,静态库是首选;而当需要共享库并且在多个程序之间共享代码时,动态库是首选。

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

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

相关文章

【深度学习】基于MindSpore和pytorch的Softmax回归及前馈神经网络

1 实验内容简介 1.1 实验目的 (1)熟练掌握tensor相关各种操作; (2)掌握广义线性回归模型(logistic模型、sofmax模型)、前馈神经网络模型的原理; (3)熟练掌…

UBUNTU下NFS配置(用于嵌入式开发)

1. NFS简介 NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就…

低代码(九)低代码平台后设计一:模型驱动

我们先看一下汽车的基本构造,由车身、发动机、方向盘等多个零部件构成,因为它是一个工业产品,有实物存在,摸得着看得见,所以大家很容易理解。日本丰田汽车是如何做到自动化流水线生产的,本质上是把产品xBOM…

BufferedOutputStream,BufferedInputStream是字节流,对象处理流,序列化,输入输出流,转换流

BufferedInputStream字节输入流 意思就是InputStream类及其子类都能以参数的形式放到BufferedInputStream构造器的参数 package com.hspedu.outputstream_;import java.io.*;/*** author 韩顺平* version 1.0* 演示使用BufferedOutputStream 和 BufferedInputStream使用* 使用他…

数据挖掘:心脏病预测(测评指标;EDA)

目录 一、前期准备 二、实战演练 2.1分类指标评价计算示例 2.2数据探索性分析(EDA) 2.2.1 导入函数工具箱 2.2.2 查看数据信息等相关数据 判断数据缺失和异常 数字特征相互之间的关系可视化 类别特征分析(箱图,小提琴图&am…

ios客户端学习笔记(五):学习Swift的关键字和容易弄混的符号

1. 关键字 下面是Swift语言中的常见关键字及其说明和代码应用实例: class:定义一个类,用于封装一组相关的属性和方法。 示例代码: class Person {var name: String ""var age: Int 0 }struct:定义一个…

网络安全与攻防-常见网络安全攻防

目录 攻击手段&防御策略 阻断服务攻击(DoS) 地址解析欺骗(ARP攻击)(Address Resolution Protocol spoofing) 跨站脚本攻击(XSS) SQL注入 跨站请求伪造(csrf&am…

AlgoC++第二课:线性回归

目录 线性回归前言1. 定义2. 房价预测案例2.1 定义问题:2.2 MSE是如何被定义的?(如何推导的?)2.3 总结 3. 代码3.1 C实现3.1.1 数据读取和处理3.1.2 线性回归模型3.1.3 参数输出和预测3.1.4 完整示例代码3.1.5 C知识点 3.2 python实现3.2.1 房…

【移动端网页布局】移动端网页布局基础概念 ① ( 移动端浏览器 | 移动端屏幕分辨率 | 移动端网页调试方法 )

文章目录 一、移动端浏览器二、移动端屏幕分辨率三、移动端网页调试方法 一、移动端浏览器 移动端浏览器 比 PC 端浏览器发展要晚 , 使用的技术比较新 , 对 HTML5 CSS3 支持较好 , 常见的浏览器如下 : UC / QQ / Opera / Chrom / 360 / 百度 / 搜狗 / 猎豹 国内的浏览器 基本…

算法套路十一 ——回溯法之组合型回溯

算法套路十一 ——回溯法之组合型回溯 该节是在上一节回溯法之子集型回溯的基础上进行描写,组合型回溯会在子集型回溯的基础上判断所选子集是否符合组合要求, 故请首先阅读上一节算法套路十——回溯法之子集型回溯 算法示例:LeetCode77. 组合…

【C++ 十八】C++ map/ multimap容器

C map/ multimap 容器 文章目录 C map/ multimap 容器前言1 map 基本概念2 map 构造和赋值3 map 大小和交换4 map 插入和删除5 map 查找和统计6 map 容器排序 总结 前言 本文包含map基本概念、map构造和赋值、map大小和交换、map插入和删除、map查找和统计、map容器排序。 1 m…

使用Glib中测试框架对C代码进行单元测试

C项目的测试框架比较常见的是Google的gtest(前文CMake项目使用ctestgtest进行单元测试有使用实例介绍gtest,感兴趣的读者可以去看看),也有一些其它框架,比如Boost中的测试框架。这些框架虽然也可以测试C代码&#xff0…

Vue 消息订阅与发布

消息订阅与发布,也可以实现任意组件之间的通信。 订阅者:就相当于是我们,用于接收数据。 发布者:就相当于是媒体,用于传递数据。 安装消息订阅与发布插件: 在原生 JS 中 不太容易实现消息订阅与发布&…

Unity-ML-Agents-代码解读-RollerBall

使用版本:https://github.com/Unity-Technologies/ml-agents/releases/tag/release_19 文件路径:ml-agents-release_19/docs/Learning-Environment-Create-New.md 20和19的在rollerBall上一样:https://github.com/Unity-Technologies/ml-ag…

CSDN博客编写教程

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

osg widget 试用 方法

按钮 一个常见的 osg::Widget 就是按钮。下面的代码展示了如何使用 osg::Switch 和 osgText 创建一个简单的按钮&#xff1a; osg::ref_ptr<osg::Switch> buttonSwitch new osg::Switch(); osg::ref_ptr<osgText::Text> buttonText new osgText::Text(); buttonT…

浏览器不好用?插件来帮忙

一、目的 浏览器本身具备的功能并不完善&#xff0c;不同的用户可以为自己浏览器增加想要功能&#xff0c;使得浏览器更能符合自己的需求&#xff0c;提高浏览器使用的舒适度 二、推荐插件 AdblockPlus LastPass&#xff08;密码记录&#xff0c;全平台通用&#xff09; Dar…

JSON的用法和说明

JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式。 JSON建构于两种结构&#xff1a; "名称/值"对的集合。理解为对象 值的有序列表。理解为数组 JSON具有以下这些形式&#xff1a; 对象是一个无序的“ ’名称/值‘ 对”集合。一个…

阿里 Arthas (阿尔萨斯)工具的使用

目录 使用 一、安装与启动命令行控制台使用 使用 这款工具可以监控线上、测试或者其他环境的java运行中程序的情况&#xff0c;用于定位线上、测试等环境的问题。 一、安装与启动 通过termius远程登录测试或者线上环境&#xff0c;cd到指定目录下&#xff0c;输入命令&#…

高效部署Redis Sentinel模式(哨兵模式),手把手教学

Redis Sentinel模式部署 前言一、服务器部署同版本的redis1、换软件源在yum拉取包的时候启用remi源 二、修改配置文件1.修改/etc/redis.conf2.配置/etc/redis/sentinel.conf 三、启动redis服务1、启动服务2、连接redis3、检查redis 前言 这里就不过多的解释高可用的好处了&…