linux下的静态库与动态库

linux中的静态库与动态库,都是由“.o”文件创建的,因此我们需要将源程序通过gcc先编译成“.o”文件

一:静态库:windows下是*.lib linu下是*.a,其是被调用的,不主动执行(没有main函数)

linux上的静态库,其实就是目标文件的归档文件
格式:ar rcs libxxx.a xx1.o xx2.o
参数r:在库中插入模块(替换)。当插入的模块已经在库中存在,则替换同名模块;如果若干模块中有一个模块在库中不存在,ar显示一个错误信息,并且不会替换其中的同名模块。默认情况新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置
参数c:创建一个库(无论库是否存在)
参数s:创建目标文件索引,在创建较大的库时可节省时间(补充:如果不需要创建索引,可改写成大写S参数;如果.a文件缺少索引,可以使用ranlib命令添加)

注意:静态库后缀以.a文件结束,链接生成静态库需要使用ar命令。

1.创建静态库—创建目录 lib static
在这里插入图片描述
2.calc.h,calc.c文件的创建
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3.shell脚本函数:wildcard和patsubst
 在 GNU Make 里有一个叫 ‘wildcard’ 的函 数,它有一个参数,功能是展开成一列所有符合由其参数描述的文件名,文件间以空格间隔。你可以像下面所示使用这个命令:
SOURCES = $(wildcard *.c)

 这行会产生一个所有以 ‘.c’ 结尾的文件的列表,然后存入变量 SOURCES 里。当然你不需要一定要把结果存入一个变量。

 另一个有用的函数是 patsubst ( patten substitude, 匹配替 换的缩写)函数。它需要3个参数——第一个是一个需要匹配的 式样,第二个表示用什么来替换它,第三个是一个需要被处理的 由空格分隔的字列。例如,处理那个经过上面定义后的变量,

OBJS = 美元符号+(patsubst %.c,%.o,$(SOURCES)))
这行将处理所有在 SOURCES 字列中的字(一列文件名),如果它的 结尾是 ‘.c’ ,就用 ‘.o’ 把 ‘.c’ 取代。注意这里的 % 符号将匹 配一个或多个字符,而它每次所匹配的字串叫做一个‘柄’(stem) 。 在第二个参数里, % 被解读成用第一参数所匹配的那个柄。

4.编译
编写Makefile文件
在这里插入图片描述
在这里插入图片描述
执行make命令,生成.o文件和静态库
在这里插入图片描述
执行make install,将静态库拷贝到…/lib目录下
在这里插入图片描述
5.调用静态库
1>使用gcc命令带上库文件就OK了
gcc -o calcmain calcmain .c ./static/calc.a
在这里插入图片描述
2> 也可以使用命令”-l库名”进行,库名是不包含库函数库和扩展名的字符串。
gcc -o calcmain calcmain.c -lcalc
在这里插入图片描述
-L是告诉编译器去哪里寻找库文件

说明:上面的命令将在系统默认的路径下查找calc函数库,并把他链接到要生成的目标程序上。系统提示没有找到库文件calc,这是由于calc库函数没有在系统默认的查找路径下,我们需要认为指定库函数的路径,例如:库文件和当前编译文件在同一目录下: gcc -o calcmain calcmain.c -L ./static -lcalc
注意库的命名:建议写成lib+库名.a 例如libcalc.a
系统就能正常生成可执行文件。
说明:
在使用-l选项时,-o选项的目的名要在-l链接的库名之前,否则gcc会认为-l是生成的目标而出错。
-L ./static表示将./static目录作为第一个寻找库文件的目录,寻找的顺序是:./static -->/lib–>/usr/lib–>/usr/local/lib

上面的命令执行完后,系统返回:

calamain1.c
在这里插入图片描述
calcmain2.c
在这里插入图片描述
创建步骤:
基本步骤时生成目标文件calc.o
gcc -o calc.o -c calc.c
然后生成静态库libadd.a
ar -rcs libcalc.a calc.o

二:动态库 :windows中是*.dll,linux中是*.so
1.生成动态链接库
编译参数:gcc -fPIC -shared
gcc test.c -fPIC -shared -o libtest.so
-o 参数指定生成libtest.so ;此为动态库,Linux下格式为libxxx.so ,xxx 是后面你要调用的库名

注意:要生成动态库,需要在编译部分加入-fPIC编译选项
链接生成部分,需要加上–shared链接选项
动态库文件的前缀为lib,后缀为so
在这里插入图片描述
编译生成动态库
2.makefile:执行规则:
目标文件:依赖文件
要生成目标对象所执行的命令
预定义变量:
$@ 冒号左边要生成的目标对象
$< 冒号右边依赖文件中的一个
$^ 冒号右边的所有依赖文件
利用伪目标来执行我们的命令:clean:命令
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
因为我们在usr/lib中拷贝了我们的动态库,因此无需用-L去指定查找路径
在这里插入图片描述
静态库动态库区别:
Linux上的静态库,其实是目标文件的归档文件。

Linux下动态库文件的文件名形如 libxxx.so,其中so是 Shared Object 的缩写,即可以共享的目标文件。
在链接动态库生成可执行文件时,并不会把动态库的代码复制到执行文件中,而是在执行文件中记录对动态库的引用。
程序执行时,再去加载动态库文件。如果动态库已经加载,则不必重复加载,从而能节省内存空间。

区别:.h头文件是编译时必须的,.lib或 .a是链接时需要的,.dll或 .so是运行时需要的
windows中静态库是.lib,动态库是.dll

1:使用静态库的程序编译后,不再需要静态库了,因为直接将静态库代码编译到目标文件中
2:使用动态库的程序编译时,不对使用的函数名和动态库的路径是否正确做监测,程序运行时做检测。

优点:
1:有利于功能模块划分,便于管理和更新。
2:节省内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值