静态库
在一定场景下将一些代码编译成一个库文件,以供其他程序使用
示例代码如下:
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