IO,库-10.24.25

news2024/11/20 10:26:49

库-10.24.25

一、概念

头文件:.h:函数声明,结构体定义,宏定义,外部引用,重定义,条件编译

#include <>:从系统路径(/usr/include)下查找

#include " ":先从指定的路径下查找,在指定路径下找不到,再去系统路径下查找

源文件:.c 

就是把一些常用函数的目标文件打包在一起,提供相应函数的接口,便于程序员     使用;本质上来说库是一种可执行代码的二进制形式。/usr/lib或 /lib。它可以被操 作系统载入内存执行。

由于windows和linux的本质不同,因此二者库的二进制是不兼容的分为:动态库和静态库

  1)静态库:静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态 库,因此体积较大。

  2)动态库在程序编译时并不会被连接到目标代码中,而是在程序运行时才被载入,因此 在程序运行时还需要动态库存在,因此代码体积较小

  动态库     静态库

      linux:.so    .a 

      windows:.dll  .lib

二、库的分类

静态库和动态库,本质区别是代码被载入时刻不同。

1) 静态库在程序编译时会被连接到目标代码中。

优点:程序运行时将不再需要该静态库;运行时无需加载库,运行速度更快

缺点:静态库中的代码复制到了程序中,因此体积较大;

静态库升级后,程序需要重新编译链接

2) 动态库是在程序运行时才被载入代码中。

优点:程序在执行时加载动态库,代码体积小;

程序升级更简单;

不同应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。

缺点:运行时还需要动态库的存在,移植性较差

  • 三、静态库的制作

  1. 1、创建静态库步骤:   

  静态库:库会编译到程序,体积比较大,移植性,可能会被多次加载到内存,耗费内存资源,程序运行不需要库存在,可以直接运行。
gcc -c xxx.c -o xxx.o
ar crs lib名字.a *.o
使用:gcc main.c -L. -l 名字   默认生成的a.out可以直接执行

       1.将源文件编译生成目标文件

         gcc -c  add.c -o add.o

       2.创建静态库用ar命令,它将很多.o转换成.a

        ar  crs  libmyadd.a  add.o 

libmyadd.a :lib指库,myadd是库名,.a指静态库

      3. 静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。使用静态链   接库

        gcc  main.c  -L.  -lmyadd  -o main

        -L:指定链接路径

 -l:链接库

      4. 执行./main

  2、 优缺点:

优点: 程序中已包含代码,运行时不再需要静态库。

运行时无需加载库,运行速度更快。

缺点: 静态库中的代码复制到了程序中,使程序会占更多的磁盘和内存空间

静态库升级后,程序需要重新编译链接

gcc编译四步:预处理(展开头文件,替换宏定义,删除注释)、编译(检查错误,生成汇编文件)、汇编(生成二进制文件)、链接(生成可执行文件)

  1. 将源文件编译生成目标文件

gcc -c xxx.c -o xxx.o

  1. 创建静态库,用ar命令,将许多.o文件转换成.a文件

ar crs libxxx.a xxx.o

静态库的命名规则:lib是库的前缀,xxx库名,  .a后缀(扩展名)

  1. 测试静态库的使用

gcc   xxx.c     -L库所在路径    -l库名

四、创建动态库(共享库)

  1. 1、创建动态库步骤:

动态库(共享库):

动态库(共享库):库不编译到程序,程序体积小,移植性差,只加载一次到内存,节省内存资源,程序运行需要动态已经提前加载到内存中。
生成动态库过程:
gcc -c -fPIC xxx.c -o xxx.o
    -fPIC :生成一个与地址无关的二进制文件
gcc -shared -o lib库名.so *.o
使用:gcc main.c -L. -l 库名
./a.out 执行会失败,需要提前加载到内存中再执行:
1.将动态库复制默认加载库路径中 -/lib 或 /usr/lib
2.export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库存在路径
    终端执行这个指令就临时生效
    放到用户主目录下的.bashrc中,该用户永久生效
    放到/etc/bash_bashrc中所有用户永久生效
3.在/etc/ld.so.conf.d/中创建一个xxxx.conf的文件,文件中写库的绝对路径

1我们用gcc来创建共享库

gcc -fPIC  -c add.c  -o add.o

-fPIC 创建与地址无关的编译程序

gcc -shared -o libmyadd.so add.o   

2)编译代码

gcc main.c  -L. -lmyadd -o main

ldd main 查看main的运行依赖那些库。

3为了让执行程序顺利找到动态库,有三种方法 :

(1)把库拷贝到/usr/lib和/lib目录下。

               sudo mv  libmyadd.so /usr/lib

(2)在LD_LIBRARY_PATH环境变量中加上库所在路径。 

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. (最好是绝对路径,要在一行)

(终端关闭,环境变量就没在了)

本次配置只在当前终端有效,关闭和关机后就没效了。想要永久有效需要到 .bashrc文件 中进行修改。生效文件:source .bashrc

(3) 添加/etc/ld.so.conf.d/*.conf文件,

把库所在的路径加到文件末尾,并执行ldconfig刷新

sudo vi xx.conf

添加动态库存在的路径,如:

/home/linux/DC20111/IO/day3/share

在/etc/ld.so.conf.d下

       执行:sudo ldconfig  生效

  2、 优缺点:

优点: 程序中已包含代码,运行时不再需要静态库。

运行时无需加载库,运行速度更快。

缺点: 静态库中的代码复制到了程序中,使程序会占更多的磁盘和内存空间

静态库升级后,程序需要重新编译链接

添加动态库存在的路径,如:

/home/linux/DC20111/IO/day3/share

在/etc/ld.so.conf.d下 执行:sudo ldconfig  生效

优缺点:

优点: 程序在执行时加载动态库,代码体积小,将一些程序升级变得简单。

不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。

缺点:运行时还需要动态库的存在,移植性较差

  注意:更新静态库,所有的可执行文件需要重新编译,更新动态库,所有的可执行文件不需要重新进行编译,直接执行。

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

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

相关文章

如何将Mysql数据库的表导出并导入到另外的架构

如何将Mysql数据库的表导出并导入到另外的架构 准备一、解决方法1.右键->导出->用mysqldump导出2.注意路径一般为&#xff1a;C:/Program Files/MySQL/MySQL Server 8.0/bin/mysqldump.exe和导出的sql文件位置3.右键->SQL脚本->运行SQL脚本4.找到SQL脚本并点击确定…

[moeCTF 2023] REV

逆向这东西&#xff0c;不太好说。 base64 这是个pyc文件&#xff08;python编译后的字节码文件&#xff09;&#xff0c;这东西可以直接用各种方法反编译。也可以不弄&#xff0c;必竟这应该签到级别的。用notepad打开&#xff0c;可以看到base64的编译和两个码表。显然猜是…

mac系统u盘启动盘制作教程,更新至macOS Sonoma 14

mac系统怎么制作装系统的u盘,如果您要在多台电脑上安装 macOS&#xff0c;而又不想每次都下载安装器&#xff0c;这时可引导安装器就会很有用。一起来看苹果电脑u盘启动盘制作教程吧。 Macos系统安装包合集包揽macos 10.15&#xff0c;macos 11和苹果最新系统等多个版本 1、A…

Windows 和 Linux 这2个系统在进行编程实现的时候的一些区别:

很惭愧&#xff0c;学了很多年才意识到&#xff0c;噢&#xff0c;原来这两个系统实现一些功能的时候会使用到不同的库&#xff0c;使用不同的函数。 那么&#xff0c;也会延伸出一些问题&#xff1a; 比如&#xff0c;如何实现版本的迁移。一个在Linux上运行的代码如何可以比…

Instant-NGP中的多分辨率哈希编码

Instant-NGP的出现&#xff0c;无疑给神经表达领域带来了新的生命力。可认为是NeRF诞生以来的关键里程碑了。首次让我们看到了秒级的重建、毫秒级的渲染的NeRF工作。 作为如此顶到爆的工作&#xff0c;Instant-NGP毫无疑问斩获SIGGRAPH 2022的最佳论文。虽然只是五篇最佳论文之…

微信公众号推送封面图制作:专业技巧大揭秘

在微信公众号推送中&#xff0c;一个吸引人的封面设计是吸引读者点击的重要因素。本文将指导你如何使用免费在线海报制作工具&#xff0c;如乔拓云&#xff0c;来制作一个适合节日的海报模板&#xff0c;并编辑文本、图片以及调整字体、颜色、布局等&#xff0c;最后导出并保存…

【Linux前篇 】VMWare虚拟机安装与环境配置及远程连接 —— windows版

目录 一、操作系统 1.1 什么是操作系统 1.2 常见操作系统 1.3 个人版本和服务器版本的区别 1.4 Linux的各个版本 二、VMWare 虚拟机安装配置流程 2.1 安装 2.2 配置虚拟网络编辑器 三、安装配置 Windows Server 2012 R2 3.1 创建虚拟机 3.2 安装 Windows Server 2012…

Linux文件I/O

下面的内容需要了解系统调用&#xff0c;可看下面的链接&#xff1a; 系统调用来龙去脉-CSDN博客 1.底层文件IO和标准IO 这里指的是操作系统提供的IO服务&#xff0c;不同于ANSI建立的标准IO。 底层IO和标准IO各自所使用的函数&#xff1a; 区别&#xff1a; 1.底层文件IO不…

TDesign设计系统全方位解析

随着互联网的发展和技术的不断更新和迭代&#xff0c;互联网产品类别的周期越来越短&#xff0c;用户需求也在不断提高。对于生产、设计和研究团队来说&#xff0c;有必要进行高效和持续的设计创新。腾讯“腾讯设计云”的研发帮助企业完成高效协作&#xff0c;提高设计开发效率…

SpringCloud学习:一【详细】

目录 服务架构演变 单体架构 分布式架构 分布式架构需要考虑的问题 微服务 架构比较 微服务技术对比 服务拆分注意事项 案例 服务远程调用 RestTemplate Eureka注册中心 RestTemplate存在的问题 服务调用考虑的问题 Eureka的作用 搭建EurekaServer 服务注册 …

分布式事务——CAP理论 解决分布式事务的思路 Seata组件初识 和 部署

前言 事务(TRANSACTION)是一个不可分割的逻辑单元&#xff0c;包含了一组数据库操作命令&#xff0c;并且把所有的命令作为一个整体向系统提交&#xff0c;要么都执行、要么都不执行。 事务作为系统中必须考虑的问题&#xff0c;无论是在单体项目还是在分布式项目中都需要进行…

Android WMS——概述(一)

Android 中的 WMS 指的是 Window Manager Service(窗口管理服务)。WMS 是 Android 系统中的核心服务,主要分为四大部分,分别是窗口管理,窗口动画,输入系统中转站和 Surface 管理 。负责管理应用程序窗口的创建、移动、调整大小和显示等操作。 一、功能简介 WMS 的职责可…

YOLO目标检测——红外人员数据集【含对应voc、coco和yolo三种格式标签+划分脚本】

实际项目应用&#xff1a;红外热像仪进行安全监控数据集说明&#xff1a;红外人员检测数据集&#xff0c;真实场景的高质量图片数据标签说明&#xff1a;使用lableimg标注软件标注&#xff0c;标注框质量高&#xff0c;含voc(xml)、coco(json)和yolo(txt)三种格式标签&#xff…

华为OD机试 - 德州扑克 - 逻辑分析(Java 2023 B卷 200分)

目录 专栏导读一、题目描述1、判断牌型2、说明 二、输入描述三、输出描述1、输入2、输出3、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAV…

自动化学报格式 Overleaf 在线使用 【2023最新教程】

自动化学报格式 Overleaf 在线使用 摘要 2023年10月26日19:28:17&#xff08;云南昆明&#xff09; 今天课程老师要我们期末提交一篇论文&#xff0c;以自动化学报格式提交。因此&#xff0c;去官网发现只有 latex 格式&#xff0c;下载下来发现各种格式不兼容&#xff1b;由于…

postgresql14管理(二)-用户与角色

介绍 查看 SELECT rolname FROM pg_roles;postgres是系统初始化时默认创建的角色&#xff0c;为超级管理员。 \duList of rolesRole name | Attributes | Member of ------------------------------------------------------…

Kafka - 异步/同步发送API

文章目录 异步发送普通异步发送异步发送流程Code 带回调函数的异步发送带回调函数的异步发送流程Code 同步发送API 异步发送 普通异步发送 需求&#xff1a;创建Kafka生产者&#xff0c;采用异步的方式发送到Kafka broker 异步发送流程 Code <!-- https://mvnrepository…

墨西哥专线大型工程设备海运

随着全球经济一体化的不断推进&#xff0c;国际贸易日益繁荣&#xff0c;跨国物流需求不断增长。墨西哥作为拉美地区的经济大国&#xff0c;拥有丰富的资源和庞大的市场&#xff0c;吸引了许多中国企业的投资。然而&#xff0c;由于地理位置的原因&#xff0c;许多大型工程设备…

23种设计模式【创建型模式】详细介绍之【建造者模式】

建造者模式&#xff1a;构建复杂对象的精妙设计 设计模式的分类和应用场景总结建造者模式&#xff1a;构建复杂对象的精妙设计建造者模式的核心思想建造者模式的参与者Java示例&#xff1a;建造者模式 设计模式的分类和应用场景总结 可以查看专栏设计模式&#xff1a;设计模式 …

Anaconda-2023版 下载安装配置(国内镜像+图文详解)

1、Anaconda 下载 1.1 国内镜像下载 Anaconda 是跨平台的&#xff0c;版本众多&#xff0c;小伙伴们按需下载。本文是Win11系统 下载途径一&#xff1a;官方网站 https://www.anaconda.com/download/ 下载途径二&#xff1a;国内清华镜像 https://mirrors.tuna.tsinghua.…