我们以三种排序(冒泡排序、插入排序、直接选择排序)方式的代码为例,代码如下,将五个随机数进行排序。以下文件均在同一文件夹中。
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字节。
我们发现不打包成库和动态库编译出的文件大小差不多,而静态库编译出的文件大小远远大于二者。