红联Linux门户
Linux帮助

linux下使用自定义库函数 [linux c]

发布时间:2008-01-04 00:34:08来源:红联作者:Yutie
在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程序设计第三版,如果想了解更多的内容,你可以参考这本书。
文章评论

共有 1 条评论

  1. 于 2012-10-04 21:53:35发表:

    好!!!!!!!