2015新年第一篇博客,哈哈,这个2月还没写过博客呢,从现在开始继续!


一、创建静态库

在本例中将创建一个小型静态函数库libfoo,包含两个函数bill()、fred()

1、编辑两个文件bill.c和fred.c

bill.c

#include <stdio.h>

void bill()
{
printf("bill:we passed\n");
}

fred.c

#include <stdio.h>

void fred()
{
printf("fred:we passed\n");
}

2、将两个文件生成.o目标文件

gcc -c bill.c fred.c


3、通过.o目标文件生成库文件

ar crv libfoo.a bill.o fred.o


4、为函数库生成一个内容表(当你使用GNU的软件开发工具时,这一步骤不是必须的)

ranlib libfoo.a


5、为libfoo.a库创建对应的头文件foo.h(头文件名最好和库文件一个名,除去lib前缀)

void fred();
void bill();


好了,以上已经创建好库文件libfoo.a和对应的头文件foo.h,现在要使用这个库文件里面的函数。

编写应用程序program.c来调用库文件libfoo.a中的bill函数

#include <stdio.h>
#include "foo.h"

int main()
{
bill();

return 0;
}

编译程序:gcc -o program program.c -I. -L. -lfoo

说明:

-I表示头文件的路径

-L表示库文件的路径

-lfoo表示库文件路径下的库文件


二、创建动态库

1、创建文件test.c和对应的头文件test.h

test.c

#include <stdio.h>

void fun()
{
printf("you call shared lib\n");
}

test.h

void fun();

2、编译生成动态库文件

gcc -o libtest.so -fpic -shared test.c

生成libtest.so动态库文件,最好库文件名只在源文件名前加lib前缀


现在要去引用这个动态库

program.c

#include <stdio.h>
#include "test.h"

int main()
{
fun();

return 0;
}

编译生成可执行程序program

gcc -o program program.c -I. -L. -ltest

要注意一点是,编译静态库文件的时候要引用静态库文件和对应头文件的位置,


另外在使用program的程序的时候也要指定静态库文件存放的位置。有几种方法:

1)可以直接把*.so文件放在/usr/lib等公共目录下

2)export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/** (保存.so文件的位置)