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
2. 添加add.h
-
#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++)
加上静态链接库重新编译main.c
-
[root@localhost static]# gcc main.c -o main -ladd
-
/usr/bin/ld: cannot find -ladd
-
collect2: ld returned 1 exit status
表示链接器找不到ladd库,需要直径ladd库的路径
-
[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
阅读(971) | 评论(0) | 转发(0) |