当前位置: > Linux教程 >

Linux下静态链接库的制作和使用

时间:2014-02-20 05:02来源:www.it.net.cn 作者:IT网
网上找了很多资料,感觉都有不对的地方,总结了几个资料,成功运行。

一.制作静态链接库

两个c文件:bar.c,foo.c以及一个头文件foobar.h

// bar.c
#include "foobar.h"
char * bar(void)
{
printf("This is bar! library1 is called\n");
return ("bar");
}


//foo.c
#include "foobar.h"
char * foo(void)
{
printf("This is foo!library2 is called!\n");
return ("foo");
}


//foobar.h
#ifndef _FOOBAR_H_
#define _FOOBAR_H_
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
extern char *foo(void);
extern char *bar(void);
#endif


#gcc -c -o foo.o foo.c

#gcc -c -o bar.o bar.c

#ar rcs libfoobar.a foo.o bar.o

生成库文件libfoobar.a


这基于PC平台的,如果是对于嵌入式平台的构建静态链接库而言,过程也是完全一样,唯一

需要改变的可能是所用的工具名称。比如,如果要是为ARM-Linux构建静态库,那么可能需

要使用arm-linux-ar。这里还有一个工具是nm,它可以用来取得目标文件的符号(symbol)信

息。这里,nm打印出了libfoobar.a中的两个符号:foo和bar。这两个符号表示的都是函数

,因此它们的符号值为0,符号类型为T(text,即表示该符号位于代码段)。最后一列给出

的是符号的名称。

#nm libfoobar.a

foo.o:
0000000000000000 T foo
   U puts
bar.o:
0000000000000000 T bar
   U puts


二.使用静态链接库

编辑main.c

//main.c
#include <stdio.h>
#include "foobar.h"

int main()
{
    bar();
    foo();
    return 0;
}


编译生成对应的目标文件:
#>gcc -c -I/home/simple/libtest/test main.c
生成可执行文件:
#>gcc -o main -L/home/simple/libtest/test main.o libfoobar.a

其中-I/home/simple/libtest/test和-L/home/simple/libtest/test是通过-I和-L指定对应的头文件和库文件的路径。libstr.a是对应的静态库的名称。这样对应的静态库已经编译到对应的可执行程序中。执行对应的可执行文件便可以对应得函数调用的结果。

最后,运行

./main

结果:

This is bar!Library1 is called
This is foo!Library2 is called
  (责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容