在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) |