c语言学习笔记十五

静态库 
 在一定场景下将一些代码编译成一个库文件,以供其他程序使用
 
 示例代码如下:
   20-23文件放在子目录stack中


   test20.c文件:


   char stack[512];
   int top=-1;
 
   test21.c文件:
   extern char stack[512];
   extern int top;
   void push(char c){
         stack[++top]=c;
   }


   test22.c文件:


   extern char stack[512];
   extern int top;
   char pop(void){
return stack[top--]; 
   }
 
   test23.c文件:


   extern char stack[512];
   extern int top;
   int is_empty(void){
  return top==-1;
   }
  
   
   test18.h头文件
   #ifndef STACK_H
   #define STACK_H
   extern void push(char);
   extern char pop(void);
   extern int is_empty(void);
   #endif


   test24.c文件
   #include <stdio.h>
   #include "test18.h"
   
   int main(void){
  push('a');
        return 0;
   }


 
  1 将test20,test21,test22,test23编译成目标文件:
   gcc -c stack/test20.c stack/test21.c stack/test22.c stack/test23.c
  2 然后打包成一个静态库:
     //ar 打包
     //参数r 表示将后面文件添加到文件包中
     //参数s 表示生成静态库
     ar rs libstack.a test20.o test21.o test22.o test23.o   
   3 将编译生成的libstack.a和test24.c编译链接在一起: 
     /*
      * -L.  在当前目录查找库文件
      * -lstack  链接libstack库
      * -Istack  头文件所在目录
      */
     gcc test24.c -L. -lstack -Istack -o test24
     也可以将目标文件一起编译:
     gcc test24.c 
  查看编译器默认会test20.o test21.o test22.o test23.o -Istack -0 test24
  查找的目录:
  gcc -print-search-dirs


  注: 链接共享库和静态库的区别,
       共享库只在运行时作动态链接;
       链接静态库时,链接器会把静态库的目标文件取出来和可执行文件链接在一起
       
      可以使用反江编查看:objdump -d test24
       示例代码如下:
      080483b4 <main>:
        80483b4: 55                   push   %ebp
        80483b5: 89 e5                 mov    %esp,%ebp  


      080483d0 <push>:
        80483d0: 55                   push   %ebp
        80483d1: 89 e5                 mov    %esp,%ebp
        80483d3: 83 ec 04             sub    $0x4,%esp

你可能感兴趣的:(c语言学习笔记十五)