Linux下库的实现以及比较
Posted seekmeet
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux下库的实现以及比较相关的知识,希望对你有一定的参考价值。
首先,先创建一个文件夹,我创建的文件夹是Study,以下文件均在此文件夹下。
以下代码是对随机产生的20个数进行排序,仅用于举例
sort.h
1 #ifndef sort_h 2 #define sort_h 3 #include<stdio.h> 4 #include<stdlib.h> 5 #include<time.h> 6 #define N 20 7 8 void bubble(int a[],int n); 9 void insertsort(int a[],int n); 10 void selectsort(int a[],int n); 11 int main(int argc, char **argv); 12 13 #endif 14 15
bubble.c
1 #include"sort.h" 2 void bubble(int a[],int n){ 3 int i,j,t; 4 for (i=1;i<n;i++){ 5 for (j=0;j<n-i;j++){ 6 if (a[j]>a[j+1]){ 7 t = a[j]; 8 a[j] = a[j+1]; 9 a[j+1] = t; 10 } 11 } 12 } 13 }
insertsort.c
1 #include"sort.h" 2 void insertsort(int a[],int n){ 3 int i ,j,temp; 4 for (i=1; i<n;i++){ 5 temp = a[i]; 6 j=i-1; 7 while (j>=0 && a[j]>temp){ 8 a[j+1]=a[j]; 9 j--; 10 } 11 a[j+1] = temp; 12 } 13 }
selectsort.c
1 #include"sort.h" 2 void selectsort(int a[],int n){ 3 int i,j,k,m; 4 for (i=0;i<n-1;i++){ 5 m=a[i]; 6 k=i; 7 for (j=i+1;j<n;j++) 8 if(a[j]<m){ 9 m=a[j];k=j; 10 } 11 a[k] = a[i]; 12 a[i] = m; 13 } 14 } 15
testsort.c
1 #include"sort.h" 2 int main(int argc, char **argv){ 3 int a[N],i; 4 printf("开始运行: "); 5 srand(time(0)); 6 for (i=0;i<N;i++)a[i] = rand() % 100; 7 printf("初始数据为:"); 8 for (i=0;i<N;i++) 9 printf("%d ",a[i]); 10 printf(" "); 11 bubble(a,N); 12 printf("冒泡排序后数据:"); 13 for (i=0;i<N;i++) printf("%d ",a[i]); 14 printf(" "); 15 insertsort(a,N); 16 printf("直接插入排序后数据:"); 17 for (i=0;i<N;i++) printf("%d ",a[i]); 18 printf(" "); 19 selectsort(a,N); 20 printf("简单选择排序后数据:"); 21 for (i=0;i<N;i++) printf("%d ",a[i]); 22 printf(" "); 23 }
Makefile
1 OBJ=testsort.o bubble.o insertsort.o selectsort.o 2 testsort:$(OBJ) sort.h 3 gcc $(OBJ) -o testsort 4 testsort.o:testsort.c 5 bubble.o:bubble.c 6 insertsort.o:insertsort.c 7 selectsort.o:selectsort.c 8 9 .PHONY:cleanA clean 10 cleanA: 11 rm testsort $(OBJ) 12 clean: 13 rm $(OBJ)
一 没有库的实现
输入命令:make
cc -c -o testsort.o testsort.c cc -c -o bubble.o bubble.c cc -c -o insertsort.o insertsort.c cc -c -o selectsort.o selectsort.c gcc testsort.o bubble.o insertsort.o selectsort.o -o testsort
可执行文件的大小
-rw-rw-rw- 1 huxingui huxingui 265 Mar 21 10:02 Makefile -rw-rw-rw- 1 huxingui huxingui 184 Mar 21 10:02 bubble.c -rw-rw-rw- 1 huxingui huxingui 1448 Mar 21 10:03 bubble.o -rw-rw-rw- 1 huxingui huxingui 190 Mar 21 10:02 insertsort.c -rw-rw-rw- 1 huxingui huxingui 1424 Mar 21 10:03 insertsort.o -rw-rw-rw- 1 huxingui huxingui 192 Mar 21 10:02 selectsort.c -rw-rw-rw- 1 huxingui huxingui 1456 Mar 21 10:03 selectsort.o -rw-rw-rw- 1 huxingui huxingui 232 Mar 21 10:02 sort.h -rwxrwxrwx 1 huxingui huxingui 12856 Mar 21 10:03 testsort -rw-rw-rw- 1 huxingui huxingui 656 Mar 21 10:02 testsort.c -rw-rw-rw- 1 huxingui huxingui 3064 Mar 21 10:02 testsort.o
执行可执行文件
开始运行: 初始数据为:43 23 33 98 44 75 49 92 71 94 7 57 78 83 3 0 99 94 61 25 冒泡排序后数据:0 3 7 23 25 33 43 44 49 57 61 71 75 78 83 92 94 94 98 99 直接插入排序后数据:0 3 7 23 25 33 43 44 49 57 61 71 75 78 83 92 94 94 98 99 简单选择排序后数据:0 3 7 23 25 33 43 44 49 57 61 71 75 78 83 92 94 94 98 99
二 使用静态库文件,生成静态库。库文件一般以lib为前缀,紧接着是库的名称,扩展名为.a,例如我们这里要创建库名libhxg.a的库,使用命令ar,具体如下:
ar rcs libhxg.a bubble.o insertsort.o selectsort.o
这样就生成了libhxg.a的动态库
现在我们就可以把libhxg.a sort.c testsort.c放入同一个文件夹中,如libSamp
然后使用以下命令进行编译
gcc -o testsort testsort.c -static -L. -lhxg
其中上边命令的说明:
(1)、gcc -o testsort:使用gcc编译,-o指定文件名,后边的testsort就是最终生成的文件名
(2)、-static:指明使用静态库
(3)、-L.:-L指明使用库,后面的.表明库文件在当前目录
(4)、-lhxg:表明是库文件的名称,其中-表明是选项,l是lib的简写,后边的hxg才是真正的库文件名称,后缀名是不需要的
可执行文件的大小
-rw-rw-rw- 1 huxingui huxingui 4622 Mar 21 10:08 libhxg.a -rw-rw-rw- 1 huxingui huxingui 232 Mar 21 10:08 sort.h -rwxrwxrwx 1 huxingui huxingui 850056 Mar 21 10:09 testsort -rw-rw-rw- 1 huxingui huxingui 656 Mar 21 10:08 testsort.c
执行可执行文件
开始运行: 初始数据为:91 41 77 70 35 12 78 90 61 10 13 14 65 9 2 10 64 80 6 88 冒泡排序后数据:2 6 9 10 10 12 13 14 35 41 61 64 65 70 77 78 80 88 90 91 直接插入排序后数据:2 6 9 10 10 12 13 14 35 41 61 64 65 70 77 78 80 88 90 91 简单选择排序后数据:2 6 9 10 10 12 13 14 35 41 61 64 65 70 77 78 80 88 90 91
三、使用动态库文件:生成动态库文件。库文件一般以lib为前缀,紧接着是库的名称,扩展名为.so,例如我们这里要创建库名libhxg.so的库,具体如下
首先将bubble.o insertsort.o selectsort.o sort.h testsort.c 文件放入同一个文件夹中,如libSo
接着使用以下命令
gcc -shared -fPIC -o libhxg.so bubble.o insertsort.o selectsort.o
其中上边命令的说明:
(1)、gcc -o libhxg.so:使用gcc编译,-o指定文件名,后边的libhxg.so就是最终生成的动态库名
(2)、-shared:指明生成动态库
(3)、-fPIC.:该选项告诉gcc产生的代码不要包含对函数和变量具体内存位置的引用,运行时进行地址链接
这样就生成了一个libhxg.so的动态库文件
使用以下命令进行编译
gcc testsort.c -L. -lhxg -o testsort
可执行文件的大小
-rw-rw-rw- 1 huxingui huxingui 1448 Mar 21 10:11 bubble.o -rw-rw-rw- 1 huxingui huxingui 1424 Mar 21 10:11 insertsort.o -rwxrwxrwx 1 huxingui huxingui 7584 Mar 21 10:13 libhxg.so -rw-rw-rw- 1 huxingui huxingui 1456 Mar 21 10:11 selectsort.o -rw-rw-rw- 1 huxingui huxingui 232 Mar 21 10:12 sort.h -rwxrwxrwx 1 huxingui huxingui 12752 Mar 21 10:14 testsort -rw-rw-rw- 1 huxingui huxingui 656 Mar 21 10:12 testsort.c
执行可执行文件
开始运行: 初始数据为:50 12 6 96 83 65 3 95 33 19 24 24 80 5 65 84 88 9 98 88 冒泡排序后数据:3 5 6 9 12 19 24 24 33 50 65 65 80 83 84 88 88 95 96 98 直接插入排序后数据:3 5 6 9 12 19 24 24 33 50 65 65 80 83 84 88 88 95 96 98 简单选择排序后数据:3 5 6 9 12 19 24 24 33 50 65 65 80 83 84 88 88 95 96 98
通过以上数据对比可知,没有库文件的情况下可执行文件的大小为12856,静态库下是850056 ,动态库下是12752.可见静态库的可执行文件较大。但在编译动态库的时候可能会出现未定义的情况,基于这种情况我暂时也没有搞清楚。gcc testsort.c -L. -lhxg -o testsort这条指令是参考了网上的一些资料。
以上是关于Linux下库的实现以及比较的主要内容,如果未能解决你的问题,请参考以下文章