目标:创建一个小型函数库,该函数库包含两个函数,分别为:fred和bill
1)创建文件fred.c,内容如下:
#include <stdio.h> void fred(int arg) { printf("fred: you passed %d\n",arg); }2)创建文件bill.c,内容如下:
#include <stdio.h> void bill(char *arg) { printf("bill: you passed %s\n", arg); }3)分别编译上述两个文件
rita@rita-desktop:~/linux_program/e1.1_static_lib$ gcc -c fred.c bill.c rita@rita-desktop:~/linux_program/e1.1_static_lib$ ls *.o bill.o fred.o rita@rita-desktop:~/linux_program/e1.1_static_lib$4)编写一个程序,该程序调用bill函数。
4.1)先为要创建的库文件创建一个头文件lib.h(这个头文件将声明库文件中的函数)
void fred(int); void bill(char *);4.2) 创建一个调用程序program.c,该程序包含库的头文件lib.h,并且调用库中的函数bill
#include "lib.h" int main() { bill("hello,world\n"); return 0; }
5)编译并测试program.c
方法一)不使用库文件,而是使用常规的目标模块链接方法。
rita@rita-desktop:~/linux_program/e1.1_static_lib$ gcc -c program.c
rita@rita-desktop:~/linux_program/e1.1_static_lib$ gcc -o program program.o bill.o
rita@rita-desktop:~/linux_program/e1.1_static_lib$ ./program
bill: you passed hello,world
rita@rita-desktop:~/linux_program/e1.1_static_lib$
方法二)
5.1)先将fred.o和bill.o创建为一个静态库libfoo.a
rita@rita-desktop:~/linux_program/e1.1_static_lib$ ar crv libfoo.a fred.o bill.o
a - fred.o
a - bill.o
rita@rita-desktop:~/linux_program/e1.1_static_lib$
5.2)为静态库libfoo.a创建一个内容表
rita@rita-desktop:~/linux_program/e1.1_static_lib$ ranlib libfoo.a
rita@rita-desktop:~/linux_program/e1.1_static_lib$
5.3)在编译命令行的文件列表中加入库文件libfoo.a,编译program.c
rita@rita-desktop:~/linux_program/e1.1_static_lib$ gcc -o program program.c libfoo.a
rita@rita-desktop:~/linux_program/e1.1_static_lib$ ./program bill: you passed hello,worldrita@rita-desktop:~/linux_program/e1.1_static_lib$
或者用-l选项使用库文件,编译program.c
rita@rita-desktop:~/linux_program/e1.1_static_lib$ gcc -o program program.c -lfoo
/usr/bin/ld: cannot find -lfoo
collect2: ld returned 1 exit status
rita@rita-desktop:~/linux_program/e1.1_static_lib$
因为库文件libfoo.a并没有保存在标准位置下,所有需要使用-L选项指定库文件所在位置。
rita@rita-desktop:~/linux_program/e1.1_static_lib$ gcc -o program program.c -L. -lfoo
rita@rita-desktop:~/linux_program/e1.1_static_lib$ ./program
bill: you passed hello,world
rita@rita-desktop:~/linux_program/e1.1_static_lib$
至此,表明成功创建了属于自己的静态库!!!
6)nm命令:查看目标文件、函数库或可执行文件里包含的函数
rita@rita-desktop:~/linux_program/e1.1_static_lib$ nm program|grep -v _
08048400 T bill
0804a014 b completed.7021
080483e4 T main
rita@rita-desktop:~/linux_program/e1.1_static_lib$