linux静态动态库,Linux下的静态库和动态库

我们以三种排序(冒泡排序、插入排序、直接选择排序)方式的代码为例,代码如下,将五个随机数进行排序。以下文件均在同一文件夹中。

1、bubble.c(冒泡排序)

1 #include "sort.h"

2 void bubble(int a[], intn) {3 int i, flag=1, t;4 for (i=1; i a[j+1]) {8 t =a[j];9 a[j] = a[j+1];10 a[j+1] = t;flag = 1; }11 }12 }13 }

2、insert.c(插入排序)

1 #include "sort.h"

2 void InsertSort(int a[], intn) {3 inti, j, temp;4 for (i=1; i=0 && a[j]>temp) {8 a[j+1] =a[j];9 j--;10 }11 a[j+1] =temp;12 }13 }

3、select.c(直接选择排序)

1 #include "sort.h"

2 void SelectSort(int a[], intn) {3 inti, j, k, m;4 for (i=0; i

4、sort.h

1 #ifndef sort_h2 #define sort_h

3 #include

4 #include

5 #include

6 #define N 5

7

8 void bubble(int a[],intn);9 void insertsort(int a[],intn);10 void selectsort(int a[],intn);11 intmain();12

13 #endif

5、test.c

1 #ifndef sort_h2 #define sort_h

3 #include

4 #include

5 #include

6 #define N 5

7

8 void bubble(int a[],intn);9 void insertsort(int a[],intn);10 void selectsort(int a[],intn);11 intmain();12

13 #endif

6、Makefile

1 OBJ=test.o bubble.o lnsert.o select.o2 test:$(OBJ) sort.h3 gcc $(OBJ) -o test4 test.o:test.c5 bubble.o:bubble.c6 lnsert.o:lnsert.c7 select.o:select.c8

9 .PHONY:cleanA clean10 cleanA:11 rm testsort $(OBJ)12 clean:13 rm $(OBJ)

一、没有库的实现

1、输入命令:make,生成可执行文件test。

2、然后输入命令ls -l查看可执行文件的大小。

查看后可知没有打包成库时,生成的可执行文件大小为12800字节。

可执行文件运行结果

二、静态库,库文件一般以lib为前缀,紧接着是库的名称,扩展名为.a,例如我们这里要创建库名libsort.a的库,使用命令ar,具体如下:

ar rcs libsort.a bobble.o insert.o select.o

这样就生成了一个名为libsort.a的静态库

使用静态库,可用如下命令编译:

gcc -o test test.c -static -L. -lsort

以上命令的说明:

(1)、gcc -o test:使用gcc编译,-o指定文件名,后边的test就是生成可执行文件的文件名。

(2)、-static:指明使用静态库。

(3)、-L.:-L指明使用库,后面的 "." 表明库文件在当前目录。

(4)、-lsort:表明是库文件的名称,此处的库文件的名称就是之前所创建的libsort.a,其中"-"表明是选项,l是lib的简写,后边的sort才是真正的库文件名称,后缀名是不需要的。

我们再次用ls -l查看可执行文件的大小。

此时我们发现可执行文件的大小达到了849984字节,远大于没有库的时候。

运行可执行文件。

三、使用动态库文件:生成动态库文件。库文件一般以lib为前缀,紧接着是库的名称,扩展名为.so,例如我们这里要创建库名libzzp.so的库,具体如下:

以上,先运行make命令,通过makefile文件生成目标文件test.o 、bubble.o、 insert.o、 select.o 。

如果不会编辑makefile文件也可输入以下命令得到.o文件

gcc -c bubble.c insert.c sselect.c

接着使用下面命令:

gcc -shared -fPIC -o libzzp.so bubble.o insert.o select.o

其中上边命令的说明:

(1)、gcc -o libzzp.so:使用gcc编译,-o指定文件名,libzzp.so就是最终生成的动态库的名称。

(2)、-shared:指明生成动态库。

(3)、-fPIC.:该选项告诉gcc产生的代码不要包含对函数和变量具体内存位置的引用,运行时进行地址链接。

输入以下命令可以编译动态库文件

gcc -o test test.c -L. -lzzp

这个命令和编译静态库的命令差不多,该命令没有-static,代表着使用动态库。

我们再次输入命令查看可执行文件的大小。

文件大小为12704字节,比静态库小了很多。

动态库执行可执行文件时,可能会出现错误,提示找不到动态库文件libzzp.so文件,解决方案主要有如下几种:

(1)、将生成的库文件libcal.so文件复制到目录/usr/lib或者/lib目录中,这种方式容易污染系统的库文件,也可以将自己作的库文件libzzp.so链接到/usr/lib或/lib中,再次执行可执行文件就正常了;

(2)、连接器会搜索LD_LIBRARY_PATH指定的目录,将该环境变量设置为当前目录,具体命令为:

export LD_LIBRARY_PATH=$(pwd)

(3)、使用命令ldconfig目录,将制定目录下的动态链接库被系统共享起来,具体命令为:

sudo ldconfig /(当前文件目录)/

通过以上三次实现可知

不打包成库编译出的可执行文件大小为12800字节。

静态库编译出的可执行文件大小为849984字节。

动态库编译出的可执行文件大小为12704字节。

我们发现不打包成库和动态库编译出的文件大小差不多,而静态库编译出的文件大小远远大于二者。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值