我们都知道,库是写好的,现有的,成熟的,可以复用的代码。本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。所谓静态、动态是指链接。库文件是事先编译好的方法的合集。静态库的扩展名一般为”.a”或”.lib”;动态库的扩展名一般为”.so”或”.dll”。
我们在Linux上制作静态库:
假如我们有一个test.c的主程序,主程序中调用一个外部的方法,比如add累加的方法,定义为add.c/add.h 首先我们需要编译add.c文件,生成二进制文件
gcc -c add.c -o add.o
然后把二进制文件打包,以.a作为后缀名,在Linux下一般命名为libxxx.a;
ar rcs libtest.a add.o
最后编译程序,加载外部包
gcc -o test test.c -L./ -I./ -ltest
./test即可正常执行程序
动态链接库:
首先编译文件的时候,需要加入fpic,加入该命令是为了创建与地址无关的编译程序,以作为共享(使用了绝对地址)
gcc -fpic -c add.c -o add.o
生成共享库:
gcc -shared add.o -o libtest.so
编译:
gcc test.c -o test -L./ -I./ -itest
但是执行./test会有问题,因为找不到链接器
所以我们需要导入环境变量:
当然,还有其他方式处理: