石新柱的新家

导航

Linux C----创建静态库

静态库,也称为 归档文件(archive),按照惯例它们的名字都以 .a 结尾。比如,标准C语言函数库 /usr/lib/libc.a 和 X11 函数库 /usr/x11/lib/libx11.a .

我们可以容易地创建和维护自已的静态库,只要使用 ar 程序和 gcc -c命令对函数进行分别编译就可以了。

下面,我们就来创建一个小型函数库,它包含两个函数,然后在一个示例程序中调用其中一个函数。

1) 首先,我们为两个函数分别创建各自的源文件(将它们分别命名为 fred.c 和 bill.c ) .

下面是第一个源文件

#include<stdio.h>

void fred(int arg)

{

   printf("fred: you passed %d\n",arg);

}

下面是第二个源文件

#include<stdio.h>

void bill(char *arg)

{

   printf("bill: you passed %s\n",arg);

}

2)分别编译这些函数,产生要包含在库文件中的目标。这通过调用带有 -c 选项的 C 语言编译器来实现。-c 选项的作用是阻止编译器创建一个完整的程序。

# gcc -c bill.c fred.c

# ls *.o

bill.o fred.o

3)现在编写一个调用 bill 函数的程序。我们需要为库文件创建一个头文件,这个头文件将声明我们的为文件中的函数。它应该被所有希望使用我们的库文件的应用程序所包含。

把头文件包含在源文件 fred.c 和 bill.c 中是有益的,它将有助于编译器发现所有错误。 shilib.h 源码如下:

/*

 * This is shilib.h It declares the function fred and bill for users

 */

 void bill(char *);

 void fred(int);

4) 调用程序(program.c )非常简单,它包含库的头文件并且调用库中的一个函数。

#include "shilib.h"

int main()

{

    bill("hello,sxz");

    exit(0);

}

5) 现在,我们来编译并测试这个程序,我们暂时为编译器显示指定目标文件,然后要求编译器编译我们的文件并将其预先编译好的目标模块 bill.o 链接.

# gcc - c program.c

# gcc -o program program.o bill.o

# ./program

bill: you passed hello,sxz

6) 现在,创建并使用一个库文件。 我们用 ar 程序创建一个归档文件并将目标文件添加进去。这个程序之所以称为 ar,是因为它将若干个单独的文档归并到一个

大的文件中以创建归档文档或集合。注意,我们也可以用 ar 程序来创建任何类型文件的归档文件 (请注意,ar 只是一个通用工具.)

# ar crv libfoo.a bill.o fred.o

a - bill.o

a - fred.o

7) 库文件创建好了,两个目标文件也已添加。现在函数库可以使用了。我们可以在编译器命令行的文件列表中添加该库文件以创建我们的程序.

a) --> 

  # gcc -o program program.o libfoo.a

  # ./program

也可以用 -l 选项来访问我们的函数库,但是因为其未保存在标准位置,所以我们必须用 -L 选项来指示编译器在何处可以找到它。如下所示:

b) -->

  # gcc -o program program.o -L. -lfoo

说明一下: 

-L. 选项指示编译器在当前目录(.)中查找函数库。 -lfoo 选项指示编译器使用 libfoo.a 的函数库 (或者 名为 libfoo.so 的共享库,如果存在的话)

posted on 2011-04-28 15:29  shixinzhu  阅读(2756)  评论(0编辑  收藏  举报