一、什么是库
我们先来回顾一下之前的内容:
我们在编译我们写的 C 语言文件的时候分为以下 4 个步骤:
- 预编译:完成头文件的展开,去掉注释,宏替换等,形成的是 xxx.i 文件。
- 编译:进行词法、语法和语义的分析,将代码翻译为汇编指令,形成的是 xxx.s 文件。
- 汇编:将汇编指令转换成二进制指令,形成的是 xxx.o 文件。
- 链接:将生成的各个 xxx.o 文件链接,形成的就是可执行程序了。
这里有个简单记忆的方法 iso(对应的是相机的感光度)。
我引入这个概念就是为了指出我们生成的 xxx.o 文件实际上是可进行打包的,这样别人在用的时候就只要 xxx.o 一链接就可以执行你自己写的代码了,这样做不仅方便而且不会直接暴露出你的源代码。
实际上我们的库是有两种的:
静态库:.a[Linux]、.lib[windows]
动态库:.so[Linux]、.dll[windows]
敲黑板:
动静态文件例如:libmgc.a
去掉前缀 lib 和后缀.a 才是库文件的名字。
二、认识动静态库
我们可以写个代码来见一见:
#include <stdio.h>
int main() {
printf("Hello World!\n");
return 0;
}
接下来我们来看看这个代码生成的可执行文件所依赖的库文件:
命令:
ldd test
这个 libc.so.6 的文件就是我们的程序所依赖的库文件了,我们可以看看这个文件的属性:
这里我们可以看到,我们的库文件实际上是一个对 libc-2.17.so 的软链接文件,我们可以看看它的类型:
命令:
file /lib64/libc-2.17.so
我们可以看到实际上这个文件是一个共享的库文件,也就是动态库。
那么我们应该怎样拿到一个是依赖静态库的可执行程序呢?
这个时候我们就要在编译的时候在文件的末尾加上-static 的选项了:
这个时候我们再用 ldd 命令来查看的时候就会显示不再是动态可执行:
我们也是可以用 file 命令来确定文件类型的:
这里有个细节就是我们可以明显的看到依赖静态库的可执行文件明显比依赖动态库的可执行文件大:
三、静态库
📝静态库的生成
我们为了方便理解,我们设置两个函数来验证,声明和实现分离,分别是:
printhello.h
#pragma once
extern void ;


