linux动态库及静态库的制作和makefile的简单编写

    xiaoxiao2021-03-26  7

    一.库

    什么是库,简单的可以说是可执行代码的二进制形式,能够被操作系统载入内存执行。操作系统的不同,二者的库也是不兼容的,如windows与linux.

    库又分为静态库和动态库,动态库又称为共享库。linux下静态库(.a)文件,动态库(.so)文件。主要存放函数库的路径有:/lib , /usr/lib.

    二.静态库与动态库

    1.静态库

    这类库的名字一般是libname.a.利用静态库编写的文件比较大,原因是整个函数库中的数据都被整合进目标代码文件中去。它的优点是,编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进可执行文件了。同样它的不足,如果静态函数库改变了,那么你的程序必须重新编译,而且体积也较大。

    2.动态库

    名字一般是libname.so.相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数是菜调用函数库里的函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。而且如果多个应用程序都要使用同一函数库,动态库就非常适合,可以减少应用程序的体积。

    三.库的创建

    静态库的创建

    gcc -c filen.c

    ar -cr libname.a file1.o file2.o 。。

    ar:静态函数库创建的命令 -c :create的意思 -r :replace的意思,表示当前插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误信息,并不替换其他同名的模块。默认的情况下,新的成员增加在库德结尾处。

    动态库的创建

    gcc -shard -fpic -o libname.so test1.c test2.c ....

    -fpic:产生代码位置无关代码

    -shared 生成一个共享库

    四.实际操作

    动态库的创建

    gcc -shard -fpic -o libname.so test1.c test2.c ....

    -fpic:产生代码位置无关代码

    -shared 生成一个共享库

    四.实际操作

    1.编写三个简单函数ADD.c SUB.c MUL.c如下

    ADD.c

     #include <stdio.h>  int ADD(int a, int b)   {       return a+b;   }

     SUB.c

    #include <stdio.h>   int SUB(int a ,int b)   {       return a-b;

    }

     SUB.c

    #include <stdio.h>   int SUB(int a ,int b)   {       return a-b;   }

    MUL.c

     #include <stdio.h>   int MUL(int a , int b)      {       return a*b;   }

     和一个头文件 fun.h

    #ifdef __FUN_H_ #define __FUN_H_   extern ADD(int a , int b);   extern SUB(int a , int b);   extern MUL(int a , int b); #endif 以及一个main函数main.c

    main.c

    #include <stdio.h>

     #include <fun.h>  int main (void) {      int a=5;      int b=10;      printf("a=5,b=10\n");      printf("a+b=%d\n",ADD(a,b));      printf("a-b=%d\n",SUB(a,b));      printf("a*b=%d\n",MUL(a,b));      return 0;  }

     }  其中main.c 放在~/app下 fun.h ADD.c SUB.c MUL.c放在~/src下

    2.生成静态库

    [hongfuhao@localhost src]$ ls ADD.c  fun.h  makefile  MUL.c  SUB.c [hongfuhao@localhost src]$ gcc -c *.c [hongfuhao@localhost src]$ ls ADD.c  ADD.o  fun.h  makefile  MUL.c  MUL.o  SUB.c  SUB.o [hongfuhao@localhost src]$ ar -cr libfun.a *.o [hongfuhao@localhost src]$ ls ADD.c  ADD.o  fun.h  libfun.a  makefile  MUL.c  MUL.o  SUB.c  SUB.o

    上中libfun.a即是一个静态库

    生成动态库

    hongfuhao@localhost src]$ ls ADD.c  ADD.o  fun.h  libfun.a  makefile  MUL.c  MUL.o  SUB.c  SUB.o [hongfuhao@localhost src]$ gcc -shared -fpic -o libfun.so  *.c   [hongfuhao@localhost src]$ ls ADD.c  ADD.o  fun.h  libfun.a  libfun.so  makefile  MUL.c  MUL.o  SUB.c  SUB.o

    转载请注明原文地址: https://ju.6miu.com/read-600107.html

    最新回复(0)