这篇文章主要介绍“Linux静态函数库和动态函数库是什么”,在日常操作中,相信很多人在Linux静态函数库和动态函数库是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux静态函数库和动态函数库是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
对于静态函数库:在编译链接时候,程序所需要的函数会从静态函数库中拷贝到执行文件中。当程序运行的时候,就不需要链接外部的函数库了。
1、静态函数库是多个目标文件*.o的集合
2、可以使用ar命令(archiver)来生成.a文件
gcc -c part_a.c gcc -c part_b.c ar -r libtest.a part_a.o part_b.o
3、若要使用静态函数库中的函数,只需包含这些函数的声明头文件,并在编译时候指明静态函数库的名字,编译器会自从将函数拷贝到目标文件中。
4、生成的函数库的命名规范为:lib+函数库名。如,要生成一个test的函数库,则命名为libtest.a
示例:
(1)、分别创建三个文件:main.c、part_a.c、part_b.c
#include #include "part_a.h" int print_part_a(void) { printf("part A\n"); return 0; }
#include #include "part_b.h" int print_part_b(void) { printf("part B\n"); return 0; }
#include #include "part_a.h" #include "part_b.h" int main(void) { print_part_a(); print_part_b(); return 0; }
(2)、这里,我们创建三个目录:src、include、lib,分别存放源文件、头文件、库文件,然后生成的目标文件就存放在当前目录
(3)、编写Makefile
INCLUDE += -I./include SRC += ./src LIB += ./lib LIB_FILE += $(LIB)/libtest all: lib gcc $(INCLUDE) -o main $(SRC)/main.c -L$(LIB) -ltest lib: $(SRC)/part_a.o $(SRC)/part_b.o ar -r $(LIB_FILE).a $(FILE_A_OBJ) $(FILE_B_OBJ) $(SRC)/part_a.o: $(SRC)/part_a.c gcc $(INCLUDE) -c $(SRC)/part_a.c $(SRC)/part_b.o: $(SRC)/part_b.c gcc $(INCLUDE) -c $(SRC)/part_b.c
(4)、执行./main文件,就会先后打印print_part_a()函数和print_part_b()函数的内容了
分析:我们用命令objdump -S main和objdump -S libtest.a进行反汇编查看可知,此时可执行文件main中已经拷贝了静态函数库的函数了。
对于动态函数库:在编译链接时,程序所需要的函数不会从动态函数库中拷贝出来,而是在程序运行的时候,才会将所需要的函数加载进来。
四、本文用到的命令及相关参数
gcc命令相关参数分析:
1、-Idirname :-I (注:是大I)可以指定头文件路径为dirname(./表示当前路径 ../表示上一级目录),并将其加入到程序头文件目录列表中。
例如:假设头文件所在的目录为include,那么输入参数就为:-I ./include
2、-c :(注:是小c)只进行预编译、汇编,生成目标文件.o
3、-Ldirname:-L 将所指出的目录dirname加入到程序函数库的目标列表中,即告诉链接脚本先到-L指定的目录中寻找,然后到系统默认路径中寻找。
例如:指定当前目录,则输入参数为:-L .
4、-lname:-l (注:是小L)可以指定链接时装载名为libname.a的函数库。
例如:若需要一个名为libtest.a的函数库,则输入参数为:-ltest
ar命令相关参数分析:
1、-r:将文件插入到库文件中
2、-c:建立库文件
3、-t:显示库文件中所包含的文件
4、-d:删除库文件中指定的成员文件
到此,关于“Linux静态函数库和动态函数库是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。