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

下图是程序运行结果图:

技术分享

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。