1.什么是库
认知1:库是写好的、现有的、可以复用代码。现实中每个程序都依赖很多基础的底层库,不可能每个人的代码都是从零开始。
静态库:.a[Linux]、.lib[windows]
动态库:.so[Linux]、.dll[windows]
认识几点:
①:动静态库中不包含main函数
②:动静态库的本质都是源文件对应的.o
③:头文件.h是对方法的描述
2.静态库
2.1简单建立一个静态库
步骤:
①:gcc -c *.c 将源文件转为目标文件(不包含有main函数的源文件)
②:ar -rc libMystr.a *.o 将目标文件转为静态库文件
注:动静态库的命名都以lib开头,去掉lib和后缀即为库的名称
2.2将静态库进行链接
若头文件与执行代码在同一个目录中:
gcc -o excute excute.c -L. -l Mystr
说明:
-L:去哪里找库 -L. 就是去当前路径中寻找库, -L ./lib/mylib 就是去该目录中寻找库
-l(link) Mystr: 与静态库(Mystr)链接
若头文件与执行代码不在同一个目录中:
gcc -o excute excute.c -I/lib/include -L. -l Mystr
说明:
-I:让系统在指定目录中寻找头文件
认知2:如果不把库和头文件下载(实际是拷贝)下来的话,每次调用都是这么麻烦,因此对于实际应用而言,要把头文件和库下载下来,对于linux系统而言,头文件是下载到/user/inluce/路径中,库文件下载到/lib64/,如下:
将自己的头文件拷贝到/user/include 中:
sudo cp lib/include/* /user/inlcude/
将自己写的库文件拷贝到/lib64中:
sudo cp lib/mylib/libMystr.a /lib64
注1:当完成上述拷贝后,不需要再像之前那样麻烦,但它形成的仍是一个第三方库,在执行可运行程序时,仍需要链接,如下:
gcc excute.c -Mystr
注2:gcc g++ 默认认识C标准库,所以c标准库不需要链接,而自己写的系统不认识
2.3通过makefile简单实现一个静态库
以下代码不具备普遍性!
libMystr.a:test.o @ar -rc $@ $^ test.o:test.c @gcc -c $< .PHONY:output output: mkdir -p lib/include mkdir -p lib/mylib cp -f *.h lib/include cp -f *.a lib/mylib tar czf lib.tgz lib .PhONY:clean clean: @rm -rf *.o *.a lib lib.tgz
认知3:当我们有了上述认识后,就可以自己写一个函数.c(无main函数)和该函数的声明.h,通过ar -rc 生成一个静态库,并将其拷贝进lib/mylib,同时将声明.h拷贝进lib/include中,这样就简单实现了一个自己的静态库,别人写代码的时候,只要调用声明就能够使用这部分代码。
3.动态库
动态库的建立和链接和静态库类似,但是在链接的过程中会出现问题。
最后一步进行链接完成后,执行可执行程序 usercoed,会出现以下问题:<