首页 > 代码库 > 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下库文件的编程