Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1613059
  • 博文数量: 441
  • 博客积分: 20087
  • 博客等级: 上将
  • 技术积分: 3562
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-19 15:35
文章分类

全部博文(441)

文章存档

2014年(1)

2012年(1)

2011年(8)

2010年(16)

2009年(15)

2008年(152)

2007年(178)

2006年(70)

分类: C/C++

2008-01-03 11:08:40

在linux的c语言编程中,我们经常会使用系统定义的静态库(.a)和动态库(.so),比如我们要使用数学函数sin,那么就需要在连接的时候用-lm来指名要使用的库,比如

$gcc -o fact fact.c -lm

这里,我们用-lm来表示要链接库函数/usr/lib/libm.a这个静态库。系统库一般在/lib, /usr/lib目录下面。如果使用的是系统库函数,那么就不需要指定路径,但是如果是我们自己的库函数就需要用-L参数指名路径。

下面我们用一个例子来说明:

/*fred.c*/
#include

void fred(int arg)
{
    printf("fred: you passed %d\n", arg);
}

/*bill.c*/
void bill(char* arg)
{
    printf("bill: you passed %s\n", arg);
}

我们分别写一个答应字符串和整形数的函数在两个文件中,然后为它们写一个头文件以方便我们使用:
/*lib.h*/
void fred(int);
void bill(char*);

用gcc将这两个文件分别编译出来:

$gcc -c fred.c bill.c

-c 参数表示编译(compile),只生成对应的.o文件。

下面我们应用这两个函数:

/*program.c */
#include "lib.h"

int main()
{
      fred(7);
      bill("Hello, linux c.");
      exit(0);
}

好, 我们现在编译并连接它:

$gcc -c program.c
$gcc -o program program.o fred.o bill.o
$./program

你就会看到输出:
fred: you passed 7
bill: you passed Hello, linux c.

当然,这里我们是直接编译的,没有使用库。我们可以用 ar 命令来把fred.o 和 bill.o 制作成 .a 静态库。
$ ar crv libfoo.a bill.o fred.o

为了在不同版本的linux下兼容, 我们还需要为它制作一个入口表,当然这不是必须的,因为现在的许多linux并不需要这一步,
但是我们加上去也并无害处:
$ranlib libfoo.a

下面我们就可以使用自己制作的静态链接库了:
$gcc -o program program.o -L. -lfoo
$./program

这里面 -L. 表示我们链接的时候要用到本地目录(.)下的库函数, -lfoo 表示库函数是 libfoo.a 或者是libfoo.so

注:以上例子来自于linux程序设计第三版,如果想了解更多的内容,你可以参考这本书。
阅读(2727) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~