linux静态库和动态库的简单例子

1. 静态函数库 库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。

2. 动态函数库 这类库的名字一般是libxxx.so;相对于静态函数库,动态函数库在编译的时候 并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。linux系统有几个重要的目录存放相应的函数库,如/lib和/usr/lib。

例子:输出一个菜单,选择1打印矩形,,选择2打印菱形,选择0退出系统,其他数字打印非法选择。 代码: graphic.c–画矩形和菱形的函数

#include <stdio.h>int diamond (int r) { int x,y; for (y=0;y<=2*r;y++) {for (x=0;x<=2*r;x++){if(y==x+r||y==x-r||y==-x+r||y==-x+3*r)printf(“*”);elseprintf(” “);}printf(“\n”); } return 0;}int rectangle(int l){int x,y; for (y=0;y<=l;y++) {for (x=0;x<=l;x++){if(y==0||y==l||x==l||x==0)printf(“*”);elseprintf(” “);}printf(“\n”); } return 0;}

menu.c–打印菜单的函数

#include<stdio.h>int menuSelect(){int r;printf(“请根据菜单提示输入数字:\n”);printf(“输出矩形:1\n输出菱形:2\n退出:0\n”);scanf(“%d”,&r);return r; }

main.c–主函数

#include <stdio.h>int main(){int i;int r;i=menuSelect();while(1){if(i==1){printf(“请输入矩形半径r:”);scanf(“%d”,&r);rectangle(r);}if(i==2){printf(“请输入菱形半径r:”);scanf(“%d”,&r);diamond(r);}if(i==0){printf(“退出系统\n”);return 0;}if(i!=1&&i!=2&&i!=0){printf(“请输入有效选择!\n”);}i=menuSelect();}}

静态库的编译代码: static.mk

demo:gcc -c -static graphic.cgcc -c -static menu.cgcc a menu.o graphic.ogcc main

编译完成之后执行下面这行代码就可以得到结果了。

[zhangben@localhost ex2]$ make -f static.mk demo/*注释部分为执行上面命令打印出来的,如果不想打印可以在上面.mk文件每条命令行全面加上@符号gcc -c -static graphic.cgcc -c -static menu.cgcc -shared -olibdemo.a menu.o graphic.ogcc main.c -omain -ldemo -L. */[zhangben@localhost ex2]$ ./main

动态库的编译代码: demo.mk

demo:gcc -c -fpic graphic.cgcc -c -fpic menu.cgcc so menu.o graphic.ogcc main

编译完成之后执行下面这行代码就可以得到结果了。

[zhangben@localhost ex2]$ make -f demo.mk demo/*同上gcc -c -fpic graphic.cgcc -c -fpic menu.cgcc -shared -olibdemo.so menu.o graphic.ogcc main.c -omain -ldemo -L. */[zhangben@localhost ex2]$ ./main

有些人在执行完上面的命令行之后可能会提示找不到动态库。可以先执行这条命令:

export LD_LIBRARY_PATH=.

这样就可以找到了。这只是其中一种比较简单的方法。还有两种将动态库拷贝/lib和/usr/lib目录下,但是需要root权限,想了解的可以去百度一下。当然动态库的链接也可以用函数实现

下图是程序运行结果图:

走走停停,不要害怕错过什么,

linux静态库和动态库的简单例子

相关文章:

你感兴趣的文章:

标签云: