Chinaunix首页 | 论坛 | 博客
  • 博客访问: 557334
  • 博文数量: 142
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1452
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-12 16:28
文章分类

全部博文(142)

文章存档

2016年(10)

2015年(60)

2014年(72)

我的朋友

分类: C/C++

2015-07-17 09:55:52


1. 定义一个函数main.c

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. int main(int argc, char *argv[])
  3. {
  4.     int a = 1;
  5.     int b = 2;
  6.     printf("%d + %d = %d\n",a,b,add(a,b));
  7.     return 0;
  8. }
直接编译它时提示:

点击(此处)折叠或打开

  1. [root@localhost static]# gcc main.c -Wall -o main
  2. main.c: In function 'main':
  3. main.c:6: warning: implicit declaration of function 'add'
  4. /tmp/cceFJsXJ.o: In function `main':
  5. main.c:(.text+0x2b): undefined reference to `add'
  6. collect2: ld returned 1 exit status
表示没有定义add

2. 添加add.h

点击(此处)折叠或打开

  1. #ifndef __ADD_H__
  2. #define __ADD_H__
  3. int add(int a, int b);
  4. #endif
添加add.c

点击(此处)折叠或打开

  1. #include "add.h"
  2. int add(int a, int b)
    {
  3.     return (a + b);
  4. }
 编译add.c 的目标文件

点击(此处)折叠或打开

  1. [root@localhost static]# gcc -c add.c -o add.o
3. 通过命令ar创建静态链接库

点击(此处)折叠或打开

  1. [root@localhost static]# ar -crs libadd.a add.o
  2. [root@localhost static]# ls -al
  3. total 56
  4. drwxr-xr-x 2 root root 4096 Jul 16 17:12 .
  5. drwxr-xr-x 4 root root 4096 Jul 16 16:51 ..
  6. -rw-r--r-- 1 root root 63 Jul 16 16:53 add.c
  7. -rw-r--r-- 1 root root 66 Jul 16 16:53 add.h
  8. -rw-r--r-- 1 root root 1240 Jul 16 17:09 add.o
  9. -rw-r--r-- 1 root root 1380 Jul 16 17:12 libadd.a
  10. -rw-r--r-- 1 root root 143 Jul 16 16:55 main.c

点击(此处)折叠或打开

  1. -c: create
  2. -r: replace的意思,表示当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误,并不替换其它同名模块
  3. -s:代表如果归档文件中包含了对象模式(c++)
加上静态链接库重新编译main.c

点击(此处)折叠或打开

  1. [root@localhost static]# gcc main.c -o main -ladd
  2. /usr/bin/ld: cannot find -ladd
  3. collect2: ld returned 1 exit status
 表示链接器找不到ladd库,需要直径ladd库的路径

点击(此处)折叠或打开

  1. [root@localhost static]# gcc main.c -o main -ladd -L.
  2. [root@localhost static]# ls -al
  3. total 68
  4. drwxr-xr-x 2 root root 4096 Jul 16 17:22 .
  5. drwxr-xr-x 4 root root 4096 Jul 16 16:51 ..
  6. -rw-r--r-- 1 root root 63 Jul 16 16:53 add.c
  7. -rw-r--r-- 1 root root 66 Jul 16 16:53 add.h
  8. -rw-r--r-- 1 root root 1240 Jul 16 17:09 add.o
  9. -rw-r--r-- 1 root root 1380 Jul 16 17:12 libadd.a
  10. -rwxr-xr-x 1 root root 6930 Jul 16 17:22 main
  11. -rw-r--r-- 1 root root 143 Jul 16 16:55 main.c
  12. [root@localhost static]#

L : 指定静态库的查询路径,L 后面加个 “." 表示静态函数库在当前目录下查找

4. 运行main:

点击(此处)折叠或打开

  1. [root@localhost static]# gcc main.c -o main -ladd -L.
  2. [root@localhost static]# ls -al
  3. total 68
  4. drwxr-xr-x 2 root root 4096 Jul 16 17:25 .
  5. drwxr-xr-x 4 root root 4096 Jul 16 16:51 ..
  6. -rw-r--r-- 1 root root 63 Jul 16 16:53 add.c
  7. -rw-r--r-- 1 root root 66 Jul 16 16:53 add.h
  8. -rw-r--r-- 1 root root 1240 Jul 16 17:09 add.o
  9. -rw-r--r-- 1 root root 1380 Jul 16 17:12 libadd.a
  10. -rwxr-xr-x 1 root root 6930 Jul 16 17:25 main
  11. -rw-r--r-- 1 root root 143 Jul 16 17:24 main.c
  12. [root@localhost static]# ./main
  13. 1 + 2 = 3

5. 删除libadd.o,运行main,仍可以成功

点击(此处)折叠或打开

  1. [root@localhost static]# rm -rf libadd.a
  2. [root@localhost static]# ls -al
  3. total 60
  4. drwxr-xr-x 2 root root 4096 Jul 16 17:26 .
  5. drwxr-xr-x 4 root root 4096 Jul 16 16:51 ..
  6. -rw-r--r-- 1 root root 63 Jul 16 16:53 add.c
  7. -rw-r--r-- 1 root root 66 Jul 16 16:53 add.h
  8. -rw-r--r-- 1 root root 1240 Jul 16 17:09 add.o
  9. -rwxr-xr-x 1 root root 6930 Jul 16 17:25 main
  10. -rw-r--r-- 1 root root 143 Jul 16 17:24 main.c
  11. [root@localhost static]# ./main
  12. 1 + 2 = 3






阅读(952) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~