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

linux下静态库和动态库的创建和使用

2014-01-17 10:01 399 查看
Linux通常把库文件存放在/usr/lib或/lib目录下。
Linux库文件名由:前缀lib、库名和后缀3部分组成,其中动态链接库以.so最为后缀,静态链接库通常以.a作为后缀。
下面通过一个例子来说明:mytestlib.h种存放的是静态库(或者动态库)提供给用户使用的函数的声明,mytestlib.c实现了mytestlib.h种声明的函数。

头文件:mytestlib.h
#ifndef _MYTESTLIB_H_
#define _MYTESTLIB_H_

int Add(int a,int b);
int Sub(int a,int b);

#endif
源文件:mytestlib.c

#include "mytestlib.h"

int Add(int a ,int b)

{

return a+b;

}

int Sub(int a,int b)

{

return a-b;

}

1.静态库的创建和使用

a.编译mytestlib.c生成目标文件:gcc -o mytestlib.o -c mytestlib.c

b.将目标文件加入到静态库中:ar rcs libmytestlib.a mytestlib.o
c.将静态库copy到Linux的库目录(/usr/lib或者/lib)下:cp libmytestlib.a /usr/lib/libtestmylib.a
d.编写一个调用库函数的测试程序mytest.c:
#include "mytestlib.h"
int main()
{
int a=5;
int b=3;
printf("hello ,welcome to mytest!\n");
printf("%d+%d=%d\n",a,b,Add(a,b));
printf("%d-%d=%d\n",a,b,Sub(a,b));
return 0;
}
e.使用静态库编译:gcc -o mytest mytest.c -lmytestlib

f.运行可执行程序mytest: ./mytest

hello ,welcome to mytest!

5+3=8

5-3=2

2.创建生成动态库

a.编译生成动态库

gcc mytestlib.c –fPIC –shared –o libmytestlib.so

由以上命令生成动态库libmytestlib.so

–fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,

而不能达到真正代码段共享的目的。

–shared:指明编译成动态库。

b.使用动态库编译命令:

gcc mytest.c –L . –l mytestlib –o mytest

–L:指明动态库所在的目录

-l:指明动态库的名称,该名称是处在头lib和后缀.so中的名称,如上动态库libtest.so的l参数为-l test。

c. 查看程序使用动态库情况:

ldd mytest

注: ldd 测试可执行文件所使用的动态库

d.将动态库copy到Linux的库目录(/usr/lib或者/lib)下:cp libmytestlib.so /usr/lib/libtestmylib.so

e.运行可执行程序mytest: ./mytest

hello ,welcome to mytest!

5+3=8

5-3=2
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: