Linux 对函数库的理解

2023-11-07

一、前言

我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?
最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函
数“printf”了,而这也就是链接的作用。
函数库一般分为静态库和动态库两种,同样的,链接也分为动静态链接。

二、动静态链接

1.动态链接

我们举个形象的例子,我们寝室没有电脑,并且我们周末列了一系列计划,执行到上网的计划的时候,我们跑到校外的XX网吧去上网,上完网后,返回寝室继续执行计划。把程序比作我们的话,网吧比作库,这种上网然后返回的行为就叫做 库函数跳转
那么,程序怎么找到库呢?
编译器或者编辑器会指引程序找到库,这个过程叫做 和库建立链接
库在升级我们会受到影响吗?会的。
库如果被取缔了,我们会受到影响吗?会的。
在实现库函数跳转的时候我们要耗费时间吗?要的。
动态链接的优点: 形成的可执行程序小!这样可以节省资源 -- 内存,磁盘,网络。

2.静态链接

静态链接就像我们买下了网吧的电脑,放在了寝室方便玩。

链接的时候,不是产生关联,而是将我们程序内部要用的方法,给程序拷贝一份,就完成了静态链接!

这时候,库升级和被删除我们都不会受到影响了!

静态链接的优点:形成的可执行程序大!


三、在Linux下库的命名

1.动态库

我们直接编译一个文件,之后用file指令查看编出的 test 可执行文件,这里可以看到 dynamically linked ,翻译成中文就是动态链接的意思。
我们再 ldd test 查看链接的文件

可以看到链接的库叫做:libc.so.6   

动态库的名字一般格式为:libXXX.so   这里的.6是版本。其中XXX就是库的名字,我们可以看到上面的库的名字是c,所以链接的是c标准库。

用这个库的程序非常多,但是库只有一份,所有有C语言写的程序,不会出现重复的代码!

因为,动态库是一个共享库。所以,我们下载一个C写的程序,是不需要再下载标准库的。

  

2.静态库

一般而言,系统会自动携带动态库,但是静态库可能需要自己装

我们输入命令:sudo yum install glibc-static

我们默认是动态链接的,那么如何静态链接呢?
只需要在编译的时候手动在编译指令的后面加上一个 -static 即可。
  
编译完我们可以看到这里已经变成了 statically linked ,翻译成中文就是静态链接的意思。

静态库的命名格式为:libXXX.a    

   

3.拓展

  

可以看到,使用静态链接生成的可执行程序,是动态链接生成的可执行程序大小的一百倍。

另外,我们要记住动态链接只能链接动态库,静态链接只能链接静态库,两者不能互通。
  
系统本身,为了支持我们编程,给我们提供了什么呢?
系统给我们提供 标准库的 .h(告诉我们怎么用),动静态库 .so/.a
我们的代码 + 库的代码 = 可执行程序!
这一套只在Linux下有效吗?在windows下原理也是一样的!动态:.dll  ,静态:.lib
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 对函数库的理解 的相关文章

  • git 错误:无法处理 https

    当我尝试使用 git clone 时https xxx https xxx我收到以下错误我不处理协议 https 有人可以帮我吗 完整消息 dementrock dementrock A8Se git 克隆https git innosta
  • 为什么我可以在 /proc/pid/maps 输出中看到几个相同的段?

    测试在32位Linux上进行 代码如下 int foo int a int b int c a b return c int main int e 0 int d foo 1 2 printf d n d scanf d e return
  • Linux 上的基准测试程序

    对于一项任务 我们需要使用不同的优化和参数来对我们的实现进行基准测试 有没有一种可行的方法可以在Linux命令行 我知道时间 上使用不同的参数对小程序进行基准测试 从而为我提供CSV或类似内容的时间数据 输出可能类似于 Implementa
  • 从 systemd bash 内联脚本创建 filename_$(date %Y-%m-%d)

    我正在尝试执行systemd计时器并希望将执行脚本的输出保存在每个日期的文件中 这是我的ExecStart脚本中的 service file ExecStart bin bash c echo date Y m d gt gt home u
  • 后台分叉无法正常工作[重复]

    这个问题在这里已经有答案了 我运行这个程序 在前景和背景中 int main int pid printf App Start pid d n getpid while 1 pid fork if pid 0 printf Child n
  • vagrant ssh -c 并在连接关闭后保持后台进程运行

    我正在编写一个脚本来启动和后台流浪机器内的进程 似乎每次脚本结束和 ssh 会话结束时 后台进程也会结束 这是我正在运行的命令 vagrant ssh c cd vagrant src nohup python hello py gt he
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • Fedora dnf 更新不起作用?

    当我尝试使用 update 命令更新 Fedora 22 时 sudo dnf update 我收到以下错误 错误 无法同步存储库 更新 的缓存 无法准备内部镜像列表 Curl 错误 6 无法解析主机名 无法解析主机 mirrors fed
  • 如何从 C 程序中获取 NIC 详细信息?

    我想要获取连接到我的计算机的所有 NIC 的以下详细信息 1 接口名称 例如eth0 2 接口编号 如Windows http answers yahoo com question index qid 20080517041705AAOmJ
  • 使用 posix_spawn 启动进程

    我正在使用以下代码在 Linux 中启动新进程 pid t processID char argV 192 168 1 40 char 0 int status 1 status posix spawn processID home use
  • PyPI 上的轮子平台约束有什么限制吗?

    是否有任何地方 PEP 或其他地方 声明关于 Linux 轮子上传范围的限制 PyPI http pypi io 应该有 具体来说 上传是否被认为是可接受的做法linux x86 64轮子到 PyPI 而不是manylinux1 x86 6
  • 在 Linux 上访问 main 之外的主要参数

    是否可以访问参数main在外面main 即在共享库构造函数中 在 Linux 上除了通过解析之外 proc self cmdline 您可以通过将构造函数放入 init array部分 功能在 init array 不像 init 使用相同
  • C - 为什么我无法映射较小(256UL 或更小)的内存?

    请告诉我 为什么我的简单应用程序无法映射较小的内存 而且 为什么有这样一个特定的边界 257UL define MAP SIZE 256UL or below fail define MAP SIZE 257UL ok include
  • 推荐用于小型站点的 IRC 服务器 (ircd)? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 情况 我想使用 IRC 机器人作为我正在研究的其他代码的通用通信接口 服务器硬件陈旧且内存不足 但运行在相对最新的 Debian GNU
  • 在 Linux 上创建线程与进程的开销

    我试图回答在 python 中创建线程与进程有多少开销的问题 我修改了类似问题的代码 该问题基本上运行一个带有两个线程的函数 然后运行带有两个进程的相同函数并报告时间 import time sys NUM RANGE 100000000
  • 用于读取文件的 Bash 脚本

    不知道为什么最后一行没有从脚本中删除 bin bash FILENAME 1 while read line do cut d f2 echo line done lt FILENAME cat file 1 test 2 test 3 t
  • ubuntu 的 CSS 更少(并且自动编译)? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我尝试过 simples 但现在 l
  • 如何在 Linux/OS X 上温和地终止 Firefox 进程

    我正在使用 Firefox 进行一些自动化操作 尽管我可以从 shell 打开 Firefox 窗口 但我无法正确终止它 如果我kill火狐进程与kill 3 or kill 2当我下次打开新的 Firefox 窗口时 命令会询问我是否要在
  • 使用c在linux上分块读写

    我有一个 ASCII 文件 其中每一行都包含一个可变长度的记录 例如 Record 1 15 characters Record 2 200 characters Record 3 500 characters Record n X cha
  • 完整的 C++ i18n gettext()“hello world”示例

    我正在寻找完整的 i18ngettext 你好世界的例子 我已经开始了一个基于的脚本使用 GNU gettext 的本机语言支持教程 https web archive org web 20130330233819 http oriya s

随机推荐

  • PHP(五十八)

    PHP XML Expat 解析器 内建的 Expat 解析器使在 PHP 中处理 XML 文档成为可能 XML 是什么 XML 用于描述数据 其焦点是数据是什么 XML 文件描述了数据的结构 在 XML 中 没有预定义的标签 您必须定义自
  • No toolchains found in the NDK toolchains folder for ABI with prefix: arm-linux-androideabi

    产生背景 最近把Android Studio更新到3 0 更新之后出现了build错误 No toolchains found in the NDK toolchains folder for ABI with prefix arm lin
  • MATLAB线性规划——2019/7/4,7/5

    线性规划问题 MATLAB中规定线性规划的标准形式为 min x f T
  • 华为OD机试真题 Java 实现【找数字】【2023Q2 100分】

    目录 专栏导读 一 题目描述 输入数组nums为 输出 二 输入描述 三 输出描述 四 补充说明 五 解题思路 六 Java算法源码 七 效果展示 1 输入 2 输出 3 说明 华为OD机试 2023B卷题库疯狂收录中 刷题点这里 专栏导读
  • PAT1033 旧键盘打字 (20 分)

    题目描述 旧键盘上坏了几个键 于是在敲一段文字的时候 对应的字符就不会出现 现在给出应该输入的一段文字 以及坏掉的那些键 打出的结果文字会是怎样 输入格式 输入在 2 行中分别给出坏掉的那些键 以及应该输入的文字 其中对应英文字母的坏键以大
  • chatgpt赋能python:Python学习:如何建立一个空集合?

    Python学习 如何建立一个空集合 作为一门流行的编程语言 Python在数据处理 机器学习和Web应用开发等领域广泛应用 其中 集合是Python中常用的数据类型之一 它是由不同元素组成的无序集合 其中每个元素都是唯一的 当需要处理一些
  • Git&TortoiseGit安装和配置

    前言 日常开发提交代码的过程中 Git工具是必不可少的 有些小伙伴喜欢可视化界面 TortoiseGit工具就是不二之选了 下面提供纯Git配置和Git TortoiseGit两种方式 1 纯Git安装与配置 下载 Git官网 下载安装完成
  • Python Email应用的中文乱码问题解决方法

    或者是对python的unicode理解得不透彻 时常遇到各种各样的中文乱码问题 今天 在email应用中 中文乱码又出来捣乱了 经过一段时间的误打误撞 搞出了一个解决方法 coding utf 8 Created on 2010 6 21
  • [docker]笔记-存储管理

    1 docker数据存储分为非永久性存储和永久性存储 非永久性存储 容器创建会默认创建非永久性存储 该存储从属于容器 生命周期与容器相同 会随着容器的关闭而消失 可理解为内存中数据 会随关机而消失 多用来保存不需要存储的数据 永久性存储 创
  • eclipse中注释模板的修改

    window gt preferences gt java gt code style gt code template gt comments code 手机扫一扫 关注程序员技能成长
  • Android 取主色逻辑

    Palette是Google官方提供的一个类 用于帮助开发者提取图片的主色 1 生成 Palette 根据bitmap生成 Palette 同步方法 应该在子线程中使用 Palette p Palette generate bitmap 异
  • date时间格式化 只想要年月日

    传进来的时间是String类型 DateTimeFormatter format DateTimeFormat forPattern yyyy MM dd HH mm ss DateTime paraDate DateTime parse
  • ssm(spring+springMVC+Mybatis)框架 集成Quartz(定时任务框架)

    1 ssm框架基础jar 包 aopalliance jar aspectjrt jar aspectjweaver jar commons beanutils 1 9 2 jar commons codec 1 9 jar commons
  • Python基础--入门基础和数据类型测试题(一)

    Made By Zly All Right Reversed 上一篇 篇三 Python 入门基础和数据类型测试题 一 1 在Python语言中 不能作为变量名的是 A P B Temp C 3p D fg 2 以下关于Python缩进的描
  • 【华为OD统一考试B卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • Java 生成测试字符串的库:Java Faker

    一 背景 Java的单元测试经常需要构造各种测试数据 其中一项就是构造测试的字符串 如果手动创建非常麻烦 也有一些框架支持创建指定长度的随机字符串 但是并不是我们想要的效果 我们想要的是人名 地名等 那么有一个库叫java fake可以实现
  • 从MCU上电启动流程出发编写bootloader(上)

    配置开发板的BOOT 从EFLASH 即片内Flash存储器 启动 在KEIL中也需要进行相应的设置 将接下来要编写的bootloader烧写至EFLASH bootloader段需要设置从0x8000000开始 空间根据bootloade
  • 50个热门语义分割数据集免费、高速下载资源分享,涵盖通用视觉、遥感、自动驾驶、医疗等多种场景题

    小伙伴们期待已久的数据集资源盘点系列又来啦 本期将分享50个语义分割任务相关的热门公开数据集资源 粗略分了4类 通用视觉类 智慧遥感类 自动驾驶类 其他 快来看看有没有你想要的吧 如果觉得不错的话 记得收藏 一 通用视觉类 No 1 PAS
  • 【java筑基】IO流基础之文件的常见操作

    前 言 作者简介 半旧518 长跑型选手 立志坚持写10年博客 专注于java后端 专栏简介 深入 全面 系统的介绍java的基础知识 文章简介 本文将深入全面介绍IO流知识 建议收藏备用 创作不易 敬请三连哦 大厂真题 大厂面试真题大全
  • Linux 对函数库的理解

    一 前言 我们的C程序中 并没有定义 printf 的函数实现 且在预编译中包含的 stdio h 中也只有该函数的声明 而没有定义函数的实现 那么 是在哪里实 printf 函数的呢 最后的答案是 系统把这些函数实现都被做到名为 libc