程序函数库可分为3种类型:静态函数库(static libraries)、共享函数库(shared libraries)、动态加载函数库(dynamically loaded libraries)
动态函数库同共享函数库是一个东西(在linux上叫共享对象库,文件后缀是.so ,windows上叫动态加载函数库, 文件后缀是.dll)
静态函数库:在程序执行前(编译)就加入到目标程序中去了 ;
优点:编译后的执行程序不在需要外部的函数支持,运行速度相对快些,移植方便
缺点:程序太大,链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝,更新、部署、发布麻烦
动态函数库:在程序执行时动态(临时)由目标程序去调用;
优点:程序小而简洁,链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,多个程序可以共用,节省内存。 动态库升级简单,只需要替换库文件,无需重新编译应用程序
缺点:加载速度比静态库慢,程序运行需要提供依赖的动态库
静态库的生成和使用
ar是一种常用的Unix/Linux命令,用于创建、修改和提取归档文件(archive files),通常被称为静态库(static library)。
ar [参数选项] [归档文件名] [目标文件列表]
-
c:创建归档文件
-
r:向归档文件中添加目标文件
-
d:从归档文件中删除目标文件
-
t:列出归档文件中包含的目标文件列表
-
x:从归档文件中提取目标文件
静态库的制作:格式xxx.a
-
gcc text.c -c 生成xxx.o文件
-
ar rcs libtext.a text.o xxx.o文件生成xxx.a静态库文件
其中,选项-rc用于创建归档文件并向其添加目标文件,选项-s用于将符号表添加到归档文件中以便在链接时使用。 -
要查看静态库中包含的目标文件列表,可以使用以下命令:
ar -t libtest.a
要从静态库中提取一个目标文件,可以使用以下命令:
ar -x libtest.a test1.o
这将提取libtest.a中的test1.o文件并将其保存到当前工作目录中。
动态库的制作:xxx.so
gcc -shared -fpic text.c -o libtext.so
当使用 gcc -shared -fpic 命令编译代码时,会生成一个共享对象文件(.so 文件),该文件可以被其他程序动态链接使用。下面是关于 gcc -shared -fpic 的一些信息:
-
-shared 选项告诉编译器生成一个共享对象文件,而不是可执行文件。
-
-fpic 选项告诉编译器生成位置无关代码(Position Independent Code,PIC),这样代码可以在内存中的任何位置执行。这是为了支持动态链接,因为共享对象文件可以在不同的内存地址加载。
-
gcc -shared -fpic 命令通常用于将多个源文件编译为一个共享库,这样其他程序可以链接并使用该库中的函数和变量。
库的使用:
静态库:
gcc textX.c -ltext -L ./ -o main //最后只需要留下一个.a文件和.h文件即可
-
-ltext -l是指定要用的动态库,库名砍头去尾
-
-L告诉gcc编译器从-L指定的路径去找静态库(这里指定的是当前目录./)。默认是从/usr/lib 或者/usr/local/lib去找
动态库:
(14条消息) Linux库之动态库和静态库、Linux指定动态库的位置linux 指定动态库链接位置Love小羽的博客-CSDN博客
gcc textE.c -ltext -L ./ -o mains ==gcc -I和gcc -L都是gcc编译器的选项,用于指定头文件和库文件的搜索路径。== 等我们在一个程序中使用include <config.h>包含了我们自定义的文件,那么直接使用gcc xxx.c就会报错,要么使用include “config.h”要么使用gcc xxx.c -I ./编译程序
运行的时候也是默认去/usr/lib或者/usr/local/lib底下去找,但是每次去找太过于麻烦,而且把文件(动态库文件)放在/usr/bin也会有一定风险,所以临时指定库的位置,指定该程序运行时,在LD_LIBRARY_PATH所指定的路径去找库文 件:
export LD_LIBRARY_PATH=/home/orangepi/test //动态库文件所在的位置
./mains
通常为了编码方便会把这个指令和./mains一起编写成一个脚本文件去运行,因为上面的指定只是临时指定,如果窗口关闭重新开了一个窗口指定就失效了