1.什么是库
库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。
本质上来说库是⼀种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:
静态库.a[linux] .lib[windows]
动态库.so[linux] .dll[windows]
2.静态库
1.静态库:程序在编译链接的时候把库的代码链接到可执行文件中,程序运行的时候将不再需要静态库。
2.一个可执行程序可能用到许多的库,这些库运行有的是静态库,有的是动态库,二我们的编译默认为动态链接库,只有在该库下找不到动态.so的时候才会采用同名静态库。我们也可以使用gcc的 -static 强制转换车工链接静态库。
2.1静态库的生成和使用
静态库生成是个什么逻辑呢?
首先我们需要先把需要制作成库的.c文件都生成.o文件,这样在最后直接进行链接即可生成可执行程序。
这里是我们文件夹中的三个文件,首先mystr.h就是声明fun方法(这里我们的功能就是计算字符串的长度)然而我们在mystr.c 中实现的fun函数的功能,在test测试函数中调用。
那么我们怎么实现让别人不知道我们的代码,但是可以使用我们代码的功能呢?
首先我们先使用gcc -c mystr.c
这个命令,将我们目录中我们需要制作成库的.c文件全都处理成汇编后的二进制.o文件。
这里需要哪些文件-c后面就跟哪些文件(可以跟多个)
有了.o文件这个时候我们使用一个叫做ar的命令:
ar -rc libmyc.a mystr.o
ar是一个归档工具 -rc(表示replace和create)
这里就生成了我们的静态库(libmyc.a)。
这里我们还需要将我们的测试文件编译成.o形式
最后一步就是使用gcc进行编译,用到的命令是:
gcc -o test test.o -L . -lmyc
-L表明除了在系统库目录下找库,还要再当前目录下寻找
-l表明指定我们的库myc ,这里全称是libmyc.a,因为这是一个库的格式,这里使用时直接采用lib后和.a前这中间的名称即可。
当然我们怎么才能让别人看不到我们的代码而使用呢?
这里我们来新创建一个目录叫做Test,用来模拟其他用户。
然后我们打开这个libmyc.a这个库文件看看是什么呢
没错这就是经过汇编后生成的二进制文件这里是无法看到我们的源代码的,那么我们来看看能不能使用吧:
在这个新建的目录下我们发现也是可以直接使用库进行链接的,而且最终的答案跟我们test.c中的字符串长度相同。