您的位置:首页 > 运维架构 > Linux

自己动手写linux静态库文件

2012-07-24 20:22 309 查看
一、概述

1、库文件分为动态库和静态库,在linux下动态库以.so结尾,静态库以.a结尾,但二者都是以lib开头。

2、动态库与静态库的区别在于:如果程序是在编译时加载库文件的,就是使用了静态库。如果是在运行时加载目标代码,就成为动态库。换句话说,如果是使用静态库,则静态库代码在编译时就拷贝到了程序的代码段,程序的体积会膨胀。如果使用动态库,则程序中只保留库文件的名字和函数名,在运行时去查找库文件和函数体,程序的体积基本变化不大。

二、静态库的编写

静态库的编写有两种类型:

类型一:不带头文件的库

A.具体步骤:
a.编写函数代码
b.将A中所编写的函数编译生成目标文件,即.o文件。gcc编译命令为:gcc -c filename
c.利用ar命令对B所得的目标文件归档,生成静态库文件。注意:库文件的名字必须以lib开头,以.a结尾
B.示例程序文件
//mylib.c
#include<stdio.h>
void myLibFun()
{
printf("my static lib called\n");
}

//test.c
#Include<stdio.h>
int main()
{
myLibFun();
return 0;
}
C.静态库的生成与使用
1.生成目标文件
gcc -c mylib.c
得到一个mylib.o文件
2.用ar命令归档,格式为ar
-rc <生成的档案文件名> <.o文件名列表>
ar -rc libtest.a mylib.o
执行完后会生成一个libtest.a文件
3.静态库文件的调用
编译目标文件,注意将静态库的搜索路径加到-L参数里面,把库文件名(去掉打头的lib和结尾的.a)加到-l参数后面。

gcc test.c -o test -L /home/origin -ltest

此时就会生成一个名为test的可执行文件。
执行./test,输出:
my
static lib called
成功了!

三.带头文件的静态库
基本上与上面的一样,但是会有一些区别(红色标注部分)

//mylib.h

void test();

//mylib.c

#inlcude <stdio.h>

void myLibFun()
{
printf("my static lib called\n");
}

//test.c
#Include<stdio.h>
int main()
{
myLibFun();
return 0;
}
静态库的生成与使用:
gcc -c mylib.c

ar -rc libtest.a mylib.o

gcc test.c -o test
-l
/home/origin
-L /home/origin -ltest //静态库头文件的路径加到-I参数里面
./test
输出:my static lib
called
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: