我对运行库的理解

一、libc、glibc

Linux系统有自己的底层操作函数,如底层输入输出(Low-Level Input/Output):

  • 打开文件:open
  • 关闭文件:close
  • 读取文件:read
  • 写入文件:write
  • 操作文件指针:lseek

随便拿个open作说明:int open (const char *filename, int flags, mode t mode);,如果要完成文件写入一个Hello World可不容易,因为我们必须熟悉操作系统中对flags和模式的设置,设置相当麻烦。C标准库就是完成对这些常见的操作的封装,当我们使用#include <stdio.h>时,我们就是在使用前辈们给我们封装好的函数,现在我们只需要使用fopen打开文件,fprintf输出文本文件。这些封装好的函数被打包成一个动态库,叫做运行时库。程序运行时,将会调用这些运行库中的函数,这就是为什么我们需要运行库的原因,如果没有这些库,编写C语言操作系统可不认识。这就是为什么运行库总是和操作系统、语言相关。
任何一个C 程序,它的背后都有一套庞大的代码来进行支撑,以使得该程序能够正常运行。这套代码至少包括入口函数,及其所依赖的函数所构成的函数集合。另外包括各种标准库函数的实现。

这样的一个代码集合称之为运行时库(Runtime Library),C 语言的运行时库,称为 C 运行库(CRT)。 C 运行库大致包含的功能:

  1. 启动与退出函数
  2. 由C 语言标准规定的C 语言标准库所拥有的函数实现。
  3. I/O 功能的封装与实现。
  4. 堆的封装和实现
  5. 语言中一些特殊功能的实现。
  6. 实现调试功能的代码。

在这些运行库的组成成分中,C语言标准库占据了主要地位并且大有来头。C语言标准库是C语言标准化的基础函数库,我们平时使用的printf、exit等都是标准库中的一部分。标准库定义了C语言中普遍存在的函数集合,我们可以放心地使用标准库中规定的函数而不用担心在将代码移植到别的平台时对应的平台上不提供这个函数[1]。

像是libc、glibc只是两种运行库的实现。ubuntu系统中,使用的标准库实现是glibc[2],他在系统的/lib/x86_64-linux-gnu/libc.so.6。因为ldd命令是由glibc提供的,所以要查看版本可以直接

ldd --version

在这里插入图片描述
作为一个动态库,也会存在版本问题。比如高版本编写的程序,在低版本执行。解决方法有:

  • 在低版本进行编译
  • LD_LIBRARY_PATH=./ 高版本的libc/libstdc++拷贝到当前程序目录下

QT为程序提供了界面相关的功能,其功能和libc一样封装在一个运行库中。

[1] https://blog.csdn.net/yexiangCSDN/article/details/83899116?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control

[2] https://stackoverflow.com/questions/54053087/libc-or-glibc-in-ubuntu

[3] https://www.zhihu.com/question/23779949

猜你喜欢

转载自blog.csdn.net/weixin_39258979/article/details/111413524
今日推荐