Linux编程:创建一个只包含两个函数的小型静态函数库
库文件的名字总是以lib开头,随后的部分指明这是什么库(如c代表C语言库,m代表数学库)文件名的最后部分以.开始,然后给出库文件的类型:
.a代表传统的静态函数库
.so代表共享函数库
可以通过给出完整的库文件路径名或用-l标志来告诉编译器要搜索的库文件:
$ gcc –o fred fred.c /usr/lib/libm.a 或 $ gcc –o fred fred.c –lm
fred.c
#include <stdio.h>
void fred(int arg)
{
printf(“fred: you passed %d\n”, arg);
}
bill.c
#include <stdio.h>
void bill(char *arg)
{
printf(“bill: you passed %s\n”, arg);
}
编译以产生要包含在库文件中的目标文件——静态库最简单的形式就是一组处于“准备好使用”状态的目标文件。
$ gcc -c bill.c fred.c
$ ls *.o
bill.o fred.o
-c选项的作用是阻止编译器创建一个完整的程序。如果此时试图创建一个完整的程序将不会成功,因为没有定义main函数。
为该库文件创建一个头文件:
/*This is lib.h. It declares the functions fred and bill for users*/
void bill(char *);
void fred(int);
调用程序文件:program.c
#include “lib.h”
int main()
{
bill(“Hello World”);
exit(0);
}
可以为编译器显式指示指定的目标文件:
$ gcc -c program.c
$ gcc -o program program.o bill.o
$ ./program
bill: we passed Hello World
$
也可以通过ar程序来创建一个库文件:
$ ar crv libfoo.a bill.o fred.o
现在可以在编译器使用的文件列表中添加该库文件以创建程序:
$ gcc -o program program.o libfoo.a
$ ./program
bill: you passed Hello World
$
虽然程序中的头文件包含函数库中所有函数的声明,但这并不会将整个函数库包含在最终程序中。当程序被创建时,它只包含函数库中它实际需要的函数。