赞
踩
对于库的接触,其实在接触语言的时候就已将开始了,库分为两种,以.so为后缀的是动态库,以.a为后缀的是静态库;头文件和库是组合使用的,系统也有对应的库头文件的安装路径:/usr/lib64/和/usr/include/
库文件查看路径
头文件查看路径
环境安装的本质,就是安装配套的头文件和库以及编译器,将头文件和库拷贝到系统指定的路径下。
另外扩充一点环境开发工具的知识,想vs2019或者是vim等这样的工具在编写代码的时候都有语法提醒功能,其原理是编译器把用户输入的语句拿过来,通过在头文件不断的对比搜索后再把匹配的结果展现出来。语法检查功能,是编译器的不断检查报错的结果。
C语言中最常使用的函数就是printf()、scanf()等这样的输入输出函数,这些函数如果每个程序员在需要的时候都要自己去写,那么开发效率将会非常低下。这些库就相当于造好的轮子,使用的时候直接拿过来复用就行了。头文件和库是组合使用的,头文件提供说明,库提供实现方法,头文件是在预处理阶段使用的,链接的本质就是链接库。
以“libc-2.17.so”为例,其中lib是库的前缀,.so是库的后缀,真正的库名是c-2.17在命名的时候需要将前缀和后缀都加上,使用的时候要去掉前缀和后缀。
add.h
#pragma once
int add(int x,int y);
add.c
#include"add.h"
int add(int x,int y)
{
return x+y;
}
sub.h
#pragma once
int sub(int x,int y);
sub.c
#include"sub.h"
int sub(int x,int y)
{
return x-y;
}
将源文件生成目标文件
将目标打包成库放到lib目录
我们自己制作的库属于是第三方库,即不属于C语言的库,gcc本身是C语言的编译器,所以需要告诉gcc用户需要连接那个库,C语言的库和头文件都是在gcc默认的搜索路径下的,include和lib没有在默认搜索路径下,所以需要告诉gcc头文件和库的在什么地方。
也可以将include和lib拷贝到/urs/lib64/和/usr/include/下
将源文件打包成动态库放在lib目录中,生成动态库的时候必须将头文件和源文件放在一起,不然会出错,生成动态库的前提是生成与位置无关码Position-independent code。
动态库比静态库要特殊一点,它不光在链接的时候需要将头文件和库的位置告诉编译器,在可执行文件执行的时候,操作系统还要再用到动态库,所以还要再把库的路径告诉操作系统。有三种方法可以设置路径。
将动态库的路径添加到环境变量中就可以了,这个环境变量是临时环境变量,重新启动bash将失效
将动态库的文件创建一个软链接,将软链接放在/usr/lib目录下
在/etc/ld.so.conf.d目录下创建一个以.conf为后缀的配置文件,然后动态库的路径写到文件中,使用ldconfig命令使文件生效即可,注意不管是创建文件还是使用ldconfig命令都要用sudo命令
静态库在链接的时候是将用户使用的方法代码拷贝到执行文件中去的,也就是说只要生成可执行文件,就算删除静态库程序也照样可以运行,但是使用静态库可能会造成代码膨胀。静态库采用的是绝对编址的方式,在生成可执行的时候就已经对文件做好了编址,按照从全0到全f的方式进行编址,加载到内存的时候只需要按照地址一条一条的执行即可。
动态库与静态库不同的是,动态库并不是将库方法在链接的时候直接拷贝到可执行文件中去的,而是可执行文件在执行的时候遇到库方法调用时,由操作系统找到动态库文件,然后将它加载到物理内存中,再由页表映射到进程地址空间的共享区中,这个时候动态库的起始地址才是确定的,通过动态库起始地址加上库方法在库中的存储位置,也就是偏移量来访问库函数。两个进程公用一个动态库的时候是不需要重复加载的,只需要将物理内存中的库映射到另一个进程中去即可。每个进程的执行速度是不一样的,而且不同进程所需要链接的动态库数量也不一样,所以动态库在不同进程地址空间共享区中的位置也可能不一样。动态库文件中存储的地址都是偏移量,偏移量默认从0开始,所以与位置无关码,就是动态库的偏移量。
可执行文件执行到动态库方法,操作系统找到并加载动态库到物理内存,物理内存映射到进程mm_struct共享区,然后cpu从代码区跳转到共享区找到库函数并执行,然后再跳转到代码区接着执行下一条语句。
动态库如果删除那么可执行文件就不能执行了;当动态的库和静态库都有的时候,编译器会优先使用动态库,如果只有静态库那就只能使用静态库。一般云服务器是不安装静态库的需要自己手动安装,安装命令sudo yum -install -y glibc-static。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。