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("*");
else
printf(" ");
}
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("*");
else
printf(" ");
}
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.c
gcc -c -static menu.c
gcc -shared -olibdemo.a menu.o graphic.o
gcc main.c -omain -ldemo -L.
编译完成之后执行下面这行代码就可以得到结果了。
[zhangben@localhost ex2]$ make -f static.mk demo
/*
注释部分为执行上面命令打印出来的,如果不想打印可以在上面.mk文件每条命令行全面加上@符号
gcc -c -static graphic.c
gcc -c -static menu.c
gcc -shared -olibdemo.a menu.o graphic.o
gcc main.c -omain -ldemo -L.
*/
[zhangben@localhost ex2]$ ./main
动态库的编译代码: demo.mk
demo:
gcc -c -fpic graphic.c
gcc -c -fpic menu.c
gcc -shared -olibdemo.so menu.o graphic.o
gcc main.c -omain -ldemo -L.
编译完成之后执行下面这行代码就可以得到结果了。
[zhangben@localhost ex2]$ make -f demo.mk demo
/*同上
gcc -c -fpic graphic.c
gcc -c -fpic menu.c
gcc -shared -olibdemo.so menu.o graphic.o
gcc main.c -omain -ldemo -L.
*/
[zhangben@localhost ex2]$ ./main
有些人在执行完上面的命令行之后可能会提示找不到动态库。可以先执行这条命令:
export LD_LIBRARY_PATH=.
这样就可以找到了。这只是其中一种比较简单的方法。还有两种将动态库拷贝/lib和/usr/lib目录下,但是需要root权限,想了解的可以去百度一下。当然动态库的链接也可以用函数实现
下图是程序运行结果图:
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。