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下库的实现以及比较的主要内容,如果未能解决你的问题,请参考以下文章

linux 下库的深入调研

linux下库的使用

Linux库的创建和使用

BottomNavigationView 滞后于片段事务

如何在android库的片段中添加按钮和textView

错误:当使用健全的空安全性时,默认情况下库不能选择退出空安全性