C语言标准库glibc
基础知识:LINUX下动态库加载相关知识
在LINUX 系统/etc 目录下有三个与动态库加载相关的文件,分别是ld.so.conf、ld.so.conf.d、ld.so.cache.
其中ld.so.conf中记录了程序在运行过程中需要加载的动态链接库(后缀名为.so的文件)的路径,默认情况下/lib路径和/usr/lib路径下的动态链接库会直接被包含到系统的搜索路径中,也就是说只要把动态库放到这两个目录中的任何一个,应用程序就可以直接调用,但是如果所有的动态库都放到这两个路径中,就会看起来很乱,而且后期升级动态库的时候也很难查找,因此需要将我们自己的动态库路径告诉系统,最简单的方法就是修改ld.so.conf文件,假如我的动态库文件放在/usr/local/lib路径下,只要我们在ld.so.conf的末尾加上一句/usr/local/lib即可,系统就会在运行应用程序时自动搜索该路径下有没有需要的库文件。
ld.so.cache是ld.so.conf的缓存文件,我们在修改完ld.so.conf文件后,要执行一下/sbin/ldconfig指令,该指令的需要在root用户下执行,作用是重新加载ld.so.conf的内容到ld.so.cache文件中供系统使用,如果不执行该命令,则新添加的动态路路径不会生效。
ld.so.conf.d 是一个文件夹,该文件夹里面是各种动态库路径的配置文件,这些文件里记载了动态库的搜索路径。我们打开ld.so.conf文件后可以看到里面只有一句内容:include /etc/ld.so.conf.d/*.conf 意思就是使用ld.so.conf.d文件夹下的所有配置文件中记录的路径作为动态库搜索路径。
使用ldconfig -p 可以查看系统中所有的动态链接库,如果要查看某个应用程序依赖于那个动态库,可以使用ldd指令,例如我们想要查看/home/hello 依赖于那个动态库可以输入 ldd /home/hello 进行查看。
添加动态库搜索路径除了修改ld.so.conf文件外还有以下方法,其加载优先级如下:LD_PRELOAD>LD_LIBRARY_PATH>/etc/ld.so.cache>/lib>/usr/lib
使用LD_PRELOAD环境变量设置加载路径的优先级更高,应用程序在检索依赖的动态库时会优先使用LD_PRELOAD环境变量中设置的检索路径下的动态库文件。其次是环境变量LD_LIBRARY_PATH ,再其次是修改/etc/ld.so.conf,然后是/lib,最后是/usr/lib,利用这种优先级关系,可以在替换动态库文件时,使用高优先级配置方法进行设置,这样应用程序就会优先加载自己替换的动态库文件。使用方法如下: LD_PRELOAD=/usr/local/hello.so
现在我们来介绍下C库:
C库顾名思义就是运行C语言需要依赖的库文件,没有这个库文件,C语言就运行不起来。常用的C库有ANSI C库和GUN C 库两种,其中ANSI C 库使用C标准化组织定义的,特点是不依赖平台,在LINUX 下可以使用,在WINDOWS下也可以使用,GUNC 库是专门用于LINUX系统下的C运行库。
一般我们在编写应用程序时尽量使用ANSI C 库,否则一旦需要将应用程序进行跨平台移植,就会有很多麻烦。
以下时ANSI C 库包含的相关头文件:
<ctype.h>:包含用来测试某个特征字符的函数的函数原型,以及用来转换大小写字母的函数原型;
<errno.h>:定义用来报告错误条件的宏;
<float.h>:包含系统的浮点数大小限制;
<math.h>:包含数学库函数的函数原型;
<stddef.h>:包含执行某些计算 C 所用的常见的函数定义;
<stdio.h>:包含标准输入输出库函数的函数原型,以及他们所用的信息;
<stdlib.h>:包含数字转换到文本,以及文本转换到数字的函数原型,还有内存分配、随机数字以及其他实用函数的函数原型;
<string.h>:包含字符串处理函数的函数原型;
<time.h>:包含时间和日期操作的函数原型和类型;
<stdarg.h>:包含函数原型和宏,用于处理未知数值和类型的函数的参数列表;
<signal.h>:包含函数原型和宏,用于处理程序执行期间可能出现的各种条件;
<setjmp.h>:包含可以绕过一般函数调用并返回序列的函数的原型,即非局部跳转;
<locale.h>:包含函数原型和其他信息,使程序可以针对所运行的地区进行修改。
地区的表示方法可以使计算机系统处理不同的数据表达约定,如全世界的日期、时间、美元数和大数字;
<assert.h>:包含宏和信息,用于进行诊断,帮助程序调试。
在Linux平台上最广泛使用的C函数库是glibc
,其中包括C标准库的实现,也包括本书第三部分介绍的所有系统函数。几乎所有C程序都要调用glibc
的库函数,所以glibc
是Linux平台C程序运行的基础。glibc
提供一组头文件和一组库文件,最基本、最常用的C标准库函数和系统函数在libc.so
库文件中,几乎所有C程序的运行都依赖于libc.so
,有些做数学计算的C程序依赖于libm.so
,以后我们还会看到多线程的C程序依赖于libpthread.so
。以后我说libc
时专指libc.so
这个库文件,而说glibc
时指的是glibc
提供的所有库文件。
glibc 库作为LINUX系统最底层的库,几乎所有的C应用程序的运行都依赖这个库文件,我们在编译运行C应用程序时就不可避免的牵扯到版本的问题,比如当执行某一应用程序时,系统提示glibc版本过低,这时候就需要升级glibc库。
1. 下载解压
glibc库下载地址:https://ftp.gnu.org/gnu/glibc/
2. 执行configure 生成Makefile (注意执行configure的路径不能在glibc路径下,可以到其他路径下使用绝对路径命令执行)
/home/configure \
CC=arm-none-linux-gnueabi-gcc \
CXX=arm-none-linux-gnueabi-g++ \
--prefix=/home/glibc \
--target=arm-linux --host=arm-linux
3. make && make install
4. 修改环境变量,更新glibc 库搜索路径
//添加环境变量
vim /etc/profile
//在文件里加入这一行,保存退出
export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:/home/glibc-2.17/lib
//使之生效 source /etc/profile
C语言标准库glibc相关推荐
- Linux中C语言标准库glibc源码下载
在这篇文章理清gcc.libc.glibc.libc++.libstdc++的关系,我们大概理解了libc,glibc之间的一些关系. 下面我们就开了解一些Linux中C语言标准库glibc源码. 在 ...
- c运行库之 c语言标准库、glibc、 gcc库
C语言标准库 即ANSI C ,非常轻量,仅包含,数学函数,字符/字符串处理,io 等基本方面,处理目前的版本是c99 glibc库 即GNU c library,也是目前linux 平台的c 标准库 ...
- C/C++——C语言标准、C语言标准库、 C标准库实现glibc, uClibc, Elibc
C语言标准 C语言作为一种常用的计算机开发语言,被用于各种领域,尤其是单片机与嵌入式的开发,在现阶段更有着无可替代的作用,我也经常会使用C语言进行各种开发,使用过程中我们经常会听说 GUN C .AN ...
- 【C语言】标准库(头文件、静态库、动态库),windows与Linux平台下的常用C语言标准库
一.Introduction 1.1 C语言标准库 1.2 历代C语言标准 1.3 主流C语言编译器 二.C语言标准库 2.1 常用标准头文件 2.2 常用标准静态库 三.windows平台 四.Li ...
- Linux C语言运行库 glibc
C运行库 任何一个C 程序,它的背后都有一套庞大的代码来进行支撑,以使得该程序能够正常运行.这套代码至少包括入口函数,及其所依赖的函数所构成的函数集合.另外包括各种标准库函数的实现. ...
- c语言标准库低通的qsort函数不适宜所有排序任务的原因
c语言标准库低通的qsort函数不适宜所有排序任务的原因: 第一:它只能用于内存中的数组排序,不能对链表中的数据排序: 第二:因为它是参数化的函数,所以能对各种数据进行操作,也造成它的运行速度比针对单 ...
- C++语言标准库functional中的函数对象,绝对是装B神器~
C++语言标准库<functional>中的函数对象,绝对是装B神器~用一下,感慨万千~~~ 基本上是C++ Primer上的,show一下代码: #include <iostrea ...
- Go 语言标准库中 atomic.Value
在 Go 语言标准库中,sync/atomic包将底层硬件提供的原子操作封装成了 Go 的函数.但这些操作只支持几种基本数据类型,因此为了扩大原子操作的适用范围,Go 语言在 1.4 版本的时候向sy ...
- mysql c语言数字转字符串函数_C++_c语言标准库中字符转换函数和数字转换函数,字符转换为数字:
#includest - phpStudy...
c语言标准库中字符转换函数和数字转换函数 字符转换为数字: #include atoi();将字符转换为整型 例:char ch1;int i=atoi(ch1); atol();将字符转化为长整 ...
最新文章
- android离线宝,Android 离线安装宝典
- matlab 高分屏 变小,解决Ubuntu高分屏下matlab标题栏(菜单栏)字体过小问题
- jdbc获取一行字符串_JDBC基础
- C/C++ 交换两个数,不使用第三个变量, 函数模板来实现
- centos 6.9 +nginx 配置GIT HTTPS服务器(证书采用自签名)
- Airflow 中文文档:设置配置选项
- Android 应用开发---ViewPager---4自主实现滑动指示条
- 检验密码强度的JS类(from thin's blog)
- Openstack Fuel 9.0安装后网卡设置
- Android Studio 使用 Gradle 打包 Jar
- arcgis栅格数据绘制等值线_ArcGIS Help 10.2 - 
绘制等值线的工作原理
- 软件工程保研成功率_软件工程专业保研还是工作?
- 团队的Kick off
- directory opus使用教程
- over()分析函数
- 在IPCAM上实现RTSP协议直播-live555
- 用谷歌按钮登录_使用非常简单的设置即可登录Google的按钮
- 64位win7下安装SQL Server 2008(图文解说版)----本人备注
- 和月薪5W的华为程序员聊过后,才知道自己一直在打杂...
- Excel Macros 的使用
热门文章
- Java抽象类和接口的区别
- C语言实现逆波兰法计算表达式
- 在java 使什么居中的代码_java 居中的代码
- 自动弹窗被拦截 html,用JavaScript检查弹出窗口是否被阻拦的方法
- 笔记1 第13课 动规2 ——买卖股票最佳时机,打家劫舍,零钱找兑——极客时间算法
- WebBuilder开发笔记
- ReadWriteWeb《2008十大国际化产品》 国内的Maxthon傲游浏览器上榜
- “互联网+教育”三大发展趋势
- [node] node
- nin神经网络_深度学习基础(三)NIN_Network In Network