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

来源:互联网 发布:人工智能能否取代老师 编辑:程序博客网 时间:2024/06/06 01:12

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.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.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.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权限,想了解的可以去百度一下。当然动态库的链接也可以用函数实现

下图是程序运行结果图:

这里写图片描述

0 0
原创粉丝点击