LINUX 中的库的问题

1.    头文件:用C语言及其他语言进行程序设计时,你需要头文件来提供对常量的定义和对系统函数及库函数调用的声明。对于C语言来说,这些头文件几乎总是位于/usr/include 目录及其子目录中。那些依赖于特定Linux版本的头文件通常可在目录/usr/include/sys  和/usr/include/linux中找到。

在调用C语言编译器时,你可以使用 -I 标志来包含保存在子目录或者非标准位置中的头文件。即指定编译程序的头文件的查找位置。如

$ gcc -I/usr/openwin/include fred.c   

$   gcc test.c –I../inc -o test

$   gcc test.c –I../inc –I../../inc2 -o test  (查找多个位置)

它指示编译器不仅在标准位置,也在/usr/openwin/include目录中查找程序fred.c  中包含的头文件

头文件中一般都是函数(包括库函数)的声明,而函数的定义则在 .c文件中实现

用grep 命令来搜寻包含某些特定定义和函数原型的头文件是很方便的。假设想知道用于从程序中返回退出状态的#define 定义的名字,你只需要切换到/usr/include 目录下,然后用grep 命令搜索可能的名字部分,如

$ grep EXIT_  *.h

即可找到含有 EXIT_的头文件

库是一组预先编译好的函数的集合,这些函数都是按照可重用的原则编写的。它们通常由一组相互关联的函数组成以执行某项常见的任务。

标准库文件一般存储在/lib 和/usr/lib目录中。默认情况下C语言编译器只搜索标准C语言库,即上面的2个目录。

2. 库文件必须遵循特定的命名规范并且需要在命令行中明确指定

库文件的名字总是以lib 开头,随后的部分指明这是什么库,然后给出库文件的类型:

.a  传统的静态文件库

.so  共享的动态文件库

$ gcc -o fred fred.c /usr/lib/libm.a

这条 命令要求编译器编译文件fres.c,将编译产生的程序文件命名为fred.并且除了搜索标准的C语言函数库外,还搜索数学库以解决函数引用的问题,下面的命令也产生同样的效果

$ gcc -o fred fred.c -lm

-lm是简写,代表标准目录(/usr/lib)中名为libm.a的函数库。

当然你也可以用 L 命令来改变搜索库的路径。见下面

3.  静态库:函数库最简单的形式是一组处于“准备好使用”状态的目标文件,当程序需要使用函数库中的某个函数时,它包含一个声明该函数的头文件。编译器和链接器负责将程序代码和函数库组合在一起以组成一个单独的可执行文件。你必须使用 -L 选项指明除标准C语言运行库外还需要使用的库。你应尽可能把函数分别保存到不同的源文件中。如果函数需要访问公共数据,你可以把它们放在同一个源文件中,并使用在该文件中声明的静态变量。

  建立静态库

在本例中,你将创建一个小型的函数库。它包含两个函数,然后你将在一个示例程序中调用其中一个函数。这两个函数分别是fred和bill,它们只打印欢迎信息。

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

 1
 2
 3
 4
 5
      
      
#include <stdio.h>
void fred(int arg)
{
printf("fred: we passed %d\n",arg);
}
下面是第二个源文件

 1
 2
 3
 4
 5
      
      
#include <stdio.h>
void bill(char *arg)
{
printf("bill: we passed %s\n",arg);
}
(2) 你可以分别编译这些函数以产生要包含在库文件中的目标文件。这可以通过调用带有 -C选项的C语言编译器来完成,-C 选项的作用是阻止编译器创建一个完整的程序。如果此时试图创建一个完整的程序将不会成功,因为你还未定义main函数。

$ gcc -c  bill.c  fred.c

$ ls *.o

bill.o  fred.o   (此时已经生成目标文件)

(3) 为你的库文件创建一个头文件,这个头文件将声明你的库文件中的函数,它应该被所以希望使用你的库文件的应用程序所包含。把这个头文件包含在源文件fred.c 和bill.c 中是个好主意,它将帮助编译器发现所有错误。

 
 1
 2
 3
 3
      
      
void bill(char *);
void fred (int );
保存文件为  lib.h 这时就创建了库文件的头文件。

(4)编译一个调用bill 函数的程序   program.c   它包含库的头文件,并且调用库中的一个函数

 1
 2
 3
 4
 5
      
      
#include <stdio.h>
#include "lib.h"
int main()
bill("hello word");
exit(0);

(5)现在你可以编译并测试这个程序了。你暂时为编译器显示指定目标文件,然后要求编译器编译你的文件并将其与先前编译好的目标模块bill.o 链接

$ gcc -c program.c 

$ gcc -o program program.o bill.o

$ ./program

        bill : we passed hello world 

(6) 现在你将创建并使用一个库文件。你使用ar创建一个归档文件并将你的目标文件添加进去。注意你可以用ar程序来创建任何类型文件的归档文件。ar是一个通用的工具。

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

         a - bill.o

         b - fred.o

你的函数库现在就可以使用了,你可以在编译器使用的文件列表中添加库文件以创建你的程序如下所示。

$ gcc -o program program.o libfoo.a 

$ ./program

bill : we passed hello world 

你也可以使用 - l 选项来访问函数库,但因其未保存在标准位置,所以你必须使用 -L 来告诉编译器在何处找到它

$ gcc -o program program.o -L. -lfoo   -L. 选项告诉编译器在当前目录(.)中查找函数库。

  

详见  http://blog.csdn.net/olinxi1234567/article/details/41478113

 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值