1. 定义一个函数main.c
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 1;
int b = 2;
printf("%d + %d = %d\n",a,b,add(a,b));
return 0;
}
直接编译它时提示:
[root@localhost static]# gcc main.c -Wall -o main
main.c: In function 'main':
main.c:6: warning: implicit declaration of function 'add'
/tmp/cceFJsXJ.o: In function `main':
main.c:(.text+0x2b): undefined reference to `add'
collect2: ld returned 1 exit status
表示没有定义add
#ifndef __ADD_H__
#define __ADD_H__
int add(int a, int b);
#endif
添加add.c
#include "add.h"
int add(int a, int b)
{
return (a + b);
}
编译add.c 的目标文件
[root@localhost static]# gcc -c add.c -o add.o
3. 通过命令ar创建静态链接库
- [root@localhost static]# ar -crs libadd.a add.o
- [root@localhost static]# ls -al
- total 56
- drwxr-xr-x 2 root root 4096 Jul 16 17:12 .
- drwxr-xr-x 4 root root 4096 Jul 16 16:51 ..
- -rw-r--r-- 1 root root 63 Jul 16 16:53 add.c
- -rw-r--r-- 1 root root 66 Jul 16 16:53 add.h
- -rw-r--r-- 1 root root 1240 Jul 16 17:09 add.o
- -rw-r--r-- 1 root root 1380 Jul 16 17:12 libadd.a
- -rw-r--r-- 1 root root 143 Jul 16 16:55 main.c
- -c: create
- -r: replace的意思,表示当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误,并不替换其它同名模块
- -s:代表如果归档文件中包含了对象模式(c++)
- [root@localhost static]# gcc main.c -o main -ladd
- /usr/bin/ld: cannot find -ladd
- collect2: ld returned 1 exit status
- [root@localhost static]# gcc main.c -o main -ladd -L.
- [root@localhost static]# ls -al
- total 68
- drwxr-xr-x 2 root root 4096 Jul 16 17:22 .
- drwxr-xr-x 4 root root 4096 Jul 16 16:51 ..
- -rw-r--r-- 1 root root 63 Jul 16 16:53 add.c
- -rw-r--r-- 1 root root 66 Jul 16 16:53 add.h
- -rw-r--r-- 1 root root 1240 Jul 16 17:09 add.o
- -rw-r--r-- 1 root root 1380 Jul 16 17:12 libadd.a
- -rwxr-xr-x 1 root root 6930 Jul 16 17:22 main
- -rw-r--r-- 1 root root 143 Jul 16 16:55 main.c
- [root@localhost static]#
L : 指定静态库的查询路径,L 后面加个 “." 表示静态函数库在当前目录下查找
4. 运行main
- [root@localhost static]# gcc main.c -o main -ladd -L.
- [root@localhost static]# ls -al
- total 68
- drwxr-xr-x 2 root root 4096 Jul 16 17:25 .
- drwxr-xr-x 4 root root 4096 Jul 16 16:51 ..
- -rw-r--r-- 1 root root 63 Jul 16 16:53 add.c
- -rw-r--r-- 1 root root 66 Jul 16 16:53 add.h
- -rw-r--r-- 1 root root 1240 Jul 16 17:09 add.o
- -rw-r--r-- 1 root root 1380 Jul 16 17:12 libadd.a
- -rwxr-xr-x 1 root root 6930 Jul 16 17:25 main
- -rw-r--r-- 1 root root 143 Jul 16 17:24 main.c
- [root@localhost static]# ./main
- 1 + 2 = 3
5. 删除libadd.o,运行main,仍可以成功
- [root@localhost static]# rm -rf libadd.a
- [root@localhost static]# ls -al
- total 60
- drwxr-xr-x 2 root root 4096 Jul 16 17:26 .
- drwxr-xr-x 4 root root 4096 Jul 16 16:51 ..
- -rw-r--r-- 1 root root 63 Jul 16 16:53 add.c
- -rw-r--r-- 1 root root 66 Jul 16 16:53 add.h
- -rw-r--r-- 1 root root 1240 Jul 16 17:09 add.o
- -rwxr-xr-x 1 root root 6930 Jul 16 17:25 main
- -rw-r--r-- 1 root root 143 Jul 16 17:24 main.c
- [root@localhost static]# ./main
- 1 + 2 = 3