我们看到, 真正找到磁盘上文件的并不是文件名, 而是inode, 其实在linux中可以让多个文件名对应于同一个inode.
硬链接是通过inode引用另外一个文件, 软链接是通过名字引用到另外一个文件, 但实际上, 新的文件和被引用的文件的inode不同, 应用场景上可以想象成一个快捷方式, 在shell中的做法:
硬链接:
软链接
库是写好的现有的, 成熟的, 可以复用的代码. 现实中每个程序都要依赖很多基础的底层库, 不可能每个人的代码都是从零开始, 因此库的存在意义非同寻常.
本质上来说库是一种可执行代码的二进制形式, 可以被操作系统载入内存执行. 库有两种:
Centos 动静态库
C:
C++:
预备工作:
注释: ar 是 gnu归档工具 rc表示(replace and create)
t: 列出静态库中的文件 v: verbose 详细信息
在任意目录下, 新建 main.c 引入库头文件
#include "my_stdio.h"
#include "my_string.h"
#include <stdio.h>
int main()
{
const char *s = "abcdefg";
printf("%s: %d\n", s, my_strlen(s));
mFILE *fp = mfopen("./log.txt", "a");
if(fp == NULL) return 1;
mfwrite(s, my_strlen(s), fp);
mfwrite(s, my_strlen(s), fp);
mfwrite(s, my_strlen(s), fp);
mfclose(fp);
return 0;
}
头文件安装到系统路径下, 图下:
库文件安装到系统路径下, 图下:
此时进行gcc main.c 进行编译会出现链接错误, 这是因为系统路径下gcc默认只会链接C的库, 第三方库需要进行指明
使用如下代码:
$ gcc main.c -lmystdio
//-l 表示指定链接的库, 空格可带可不带
头文件的查找规则是先查找同级目录, 在查找系统目录, 很显然头文件这里不会报错, 但是库找不到, 库只会在系统路径下查找, 这时候需要指明系统路径, 指明路径之后并且指明链接的库
使用如下代码:
$ gcc main.c -L. -lmymath
//-L表示指明库的路径
找不到头文件 , 头文件和main.c不在同一级目录下, 也不在系统目录下
此时头文件找到了, 现在库找不到了
有库的路径但不知道链接哪个库
此时编译成功.
使用如下代码:
$ gcc main.c -I头⽂件路径 -L库⽂件路径 -lmymath
// -I指明头文件路径
总结:
此时我们直接编译会造成链接错误, 和静态库一样
使用如下代码:
$ gcc main.c -lmystdio
场景二: 头文件和库文件和我们自己的源文件在同一个路径下
$ gcc main.c -L. -lmymath // 从左到右搜索-L指定的⽬录
场景三: 头文件和库文件都有自己的独立路径
$ gcc main.c -I头⽂件路径 -L库⽂件路径 -lmymath
ldd查看可执行文件依赖哪些库
如果我把库中的文件都删掉了, 就会报如下错误
因为是动态链接的, 删掉了就会造成链接错误, 而静态链接不会
解决方案:
但是重启xshell之后自己导入的环境变量就没了, 此时可以添加到 .bashrc中
把库的路径写入配置文件中, 系统会在配置文件中的路径寻找库, 自己创建一个配置文件, 如下
然后 命令行输入ldconfig, 此时即可
程序运行时和gcc没关系了, gcc是告诉编译器, 接下来OS要加载你的程序
如何给系统指定路径, 查找我自己的动态库, 如上就是解决方案
如果同时提供.so .a gcc/g++默认使用什么库呢?
动态库
如果想要静态链接, 需要添加-static
注意
如果你要强制静态链接, 必须提供对应的静态库
如果你只提供静态库, 但是连接方式是动态链接, gcc, g++没得选, 只能针对你的.a局部采用静态链接, 所以把系统路径下的库删除, 运行也能跑
完, 您的点赞收藏是我更新的最大动力!!!