首页 > 代码库 > linux下库文件的编程

linux下库文件的编程

  编程到了一定的时候,总喜欢追求新的东西。将代码尽量模块化就是我的追求之一,原来只是满足于将代码从单文件中分离,通过头文件和实现文件实现模块化,后来发现最好的方法是打包成库文件,使用更加方便。尽管在linux和windows下都有大量的库文件,由于二者的工具不同,加上笔者主要是在linux下编程和教学,因此本文主要介绍Linux下的库文件的制作。

  库文件在linux中主要有两种:静态库和动态库(共享库),二者的不同主要有:

  1、载入时机不同:静态库是在编译时进行载入到代码中;共享库在运行时载入到代码中;

  2、对生成的可执行文件的影响不同:静态库的缺失不会影响后期可执行文件的运行;共享库的缺失会影响可执行文件的执行;

  3、对可执行文件大小改变不同:静态库在编译过程中将所有文件添加到可执行文件中,生成可执行文件偏大;共享库在编译过程中将所有文件链接到可执行文件中,生成的可执行文件几乎没有增大;

  4、后期维护的影响不同:静态库可能会重复应用,浪费空间;共享库更容易引用使用,只需要一份库实现多个文件的共享使用;

  5、后缀名称不同:静态库的后缀名是.a; 动态库的后缀名是.so;

  6、生成方式不同:静态库主要是gcc将*.c文件形成*.o文件,使用ar命令打包成.a文件即可;动态库文件主要由gcc加上特定参数编译生成

  7、形成的可执行文件的执行方式不同:静态库生成的可执行文件直接执行即可;动态库生成的可执行文件执行时须保证动态库文件能够被找到:可以将动态库文件链接或复制到/usr/lib或/lib目录,一般不这样做;设置环境变量LD_LIBRARY_PATH,使用命令export  LD_LIBRARY_PATH=$(pwd);使用命令ldconfig目录,将制定目录下的动态链接库被系统共享起来sudo ldconfig /home/munication/WORKM/libDemo/;

  作为现成的库文件,一般都具有成熟可靠、能够复用、接口明确等特点。因此,善于利用库文件,会让初学者很容易站在巨人的肩膀上。

  下面为了更好的说明问题,通过三种方式来形成一个可执行文件testCal,功能很简单。

  一、不是用库的方式,代码add.c、sub.c、mul.c、div.c、mod.c、cal.h testCal.c都是一样的:

add.c  

 1 int add(int var1, int var2){                                                
 2     return var1 + var2;
 3 }

sub.c

 1 int sub(int var1, int var2){                                                
 2     return var1 - var2;
 3 }

mul.c

 1 int mul(int var1, int var2){                                                
 2     return var1 * var2;
 3 }

div.c

 1 int div(int var1, int var2){                                                
 2     if(0==var2){
 3         return -1;
 4     }else{
 5         return var1 / var2;
 6     }
 7 }

mod.c

 1 int mod(int var1, int var2){                                                
 2     return var1 % var2;
 3 } 

cal.h

 1 #ifndef cal_h
 2 #define cal_h
 3                                                                             
 4 int add(int, int);
 5 int sub(int, int);
 6 int mul(int, int);
 7 int div(int, int);
 8 int mod(int, int);
 9 
10 #endif

testCal.c

 1 #include <stdio.h>
 2 
 3 #include "cal.h"
 4 
 5 int main(int argc, char **argv)
 6 {
 7     int var1;
 8     int var2;
 9     printf("please input the var1: ");
10     scanf("%d", &var1);
11     printf("please input the var2: ");
12     scanf("%d", &var2);
13     printf("%d add %d is %d\n", var1, var2, add(var1, var2));
14     printf("%d sub %d is %d\n", var1, var2, sub(var1, var2));
15     printf("%d mul %d is %d\n", var1, var2, mul(var1, var2));
16     printf("%d div %d is %d\n", var1, var2, div(var1, var2));
17     printf("%d mod %d is %d\n", var1, var2, mod(var1, var2));               
18 
19     return 0;
20 }

  如果不是用库文件,可以直接使用命令:

  

    

linux下库文件的编程