5 Nov 2022

Linux编程之动态库,静态库

我们都知道,库是写好的,现有的,成熟的,可以复用的代码。本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.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会有问题,因为找不到链接器

所以我们需要导入环境变量:

当然,还有其他方式处理:


Tags:
0 comments