10.1 使用GNU打包器创建一个库文件

GNU打包器ar集合多个目标文件到一个单独归档文件中,也被称为库。同时发布大量相关的目标文件时打包为一个归档文件是非常方便的方法。

为了说明GNU打包器的使用方法我们将创建一个’libhello.a’库,它包含两个函数hello和bye。

第一个目标文件会用包含hello函数的源码文件’hello_fn.c’生成:

include

include "hello.h"

void

hello (const char * name)

{

printf ("Hello, %s!\n", name);

}

第二个目标文件使用包含bye函数的’bye_fn.c’源码文件创建:

include

include "hello.h"

void

bye (void)

{

printf ("Goodbye!\n");

}

两个函数都使用’hello.h’头文件,现在又包含bye()函数的原型声明:

void hello (const char * name);

void bye (void);

使用下面命令将源码文件编译为目标文件’hello_fn.o’和’bye_fn.o’:

$ gcc -Wall -c hello_fn.c

$ gcc -Wall -c bye_fn.c

这些目标文件可以使用下面命令结合为一个静态库文件:

$ ar cr libhello.a hello_fn.o bye_fn.o

‘cr’选项代表“创建和替代”。如果这个库文件不存在则创建它。如果这个库已经存在,库文件中任何原先的同名文件都会替换为命令行指定的新文件。命令后面的参数是需要复制到库中的目标文件名。

打包器ar也提供一个“目录”选项用于列出已知库中的所有目标文件:

$ ar t libhello.a

hello_fn.o

bye_fn.o

注意当一个库发布后,头文件中提供的公共函数和变量应该也是可用的,因此终端用户可以包含他们并得到正确的原型。

我们现在可以使用这个库中的函数写一个程序:

include "hello.h"

int

main (void)

{

hello ("everyone");

bye ();

return 0;

}

这个文件可以使用下面的命令编译,就像2.6章节描述的,假设’libhello.a’库存放在当前目录:

$ gcc -Wall main.c libhello.a -o hello

主程序和’libhello.a’库中的目标文件被链接生成最终的可执行文件。

快捷库链接选项’-l’也可以用于链接这个程序,而且不需要指定全文件名:

$ gcc -Wall -L. main.c -lhello -o hello

‘-L’选项需要添加当前目录到库查找路径,最终生成的可执行文件照常可以运行:

$ ./hello

Hello, everyone!

Goodbye!

程序的输出结果是从库中定义的hello和bye函数得来的。