现在的位置: 首页 > 综合 > 正文

库是什么以及如何使用

2019年05月14日 ⁄ 综合 ⁄ 共 1641字 ⁄ 字号 评论关闭

Q1: 什么是静态库?

Q2: 什么是共享库?

Plus: GUN/LINUX中操作库的一些工具

 

库是目标文件的一个集合。如果一些目标文件针对某个给定的问题有相互关联的行为, 那么可以把这些目标文件整合到一个库当中。

 

当开发人员编译并且与静态库链接后, 库中被需要的部分会被整合到可执行印象中。 从应用程序的视点看, 应用程序映像已经包含了库中自己所需要的部分,与外部的库不存在有什么联系。

 

现在看静态库如何构建

假设有如下代码

 

=====randapi.h======

#ifndef __RANDAPI_H_
#define __RANDAPI_H_

extern void initRand(void);

extern float getSRand(void);

extern int getRand(int max);

#endif

 

======randapi.c ======

#include<stdlib.h>

float getSRand()

{  //  }

int getRand( int max)
{ // }

 

======initapi.c=======

#include<stdlib.h>
#include<time.h>

void initRand()
{ // }

 

以及测试驱动

====== test.c =======

#include "randapi.h"
#define ITERATIONS 100L

int main()
{
    initRand(); 
    isum = 0L;
    for( i =0; i < ITERATIONS; i++){
        isum += getRand(100);
    }
    printf("getRand() Average %d/n", (int)(isum / ITERATIONS) );
    return;
}

 

有了上述四个函数,现在可以开始说明如何去构建静态库了。

撇开静态库来测试驱动,常见的是:

gcc initapi.c randapi.c test.c -o test

 

-------注

编译时是不需要头文件指定的,那么gcc命令是如何去查找到相应的头文件的呢?

//end of 注

 

回到库的话题,可以不一次性生成所有原文件,而是为这些随机函数生成一个库。

gcc -c -Wall initapi.c

gcc -c -Wall randapi.c

ar -cru libmyrand.a initapi.o randapi.o

这用到了ar工具,生成库 libmyrand.a, 是一个包含了两个目标文件的静态库。

 

如何来使用静态库生成应用程序呢?

gcc test.c -L. -l myrand -o test

-L.选项告诉  gcc 哪些库可以在当前子目录中找到。

-l 选项比较特别, 会在动在文件名前加lib, 文件名后加.a

 

ar -t  libmyrand.a

显示库libmyrand.a中有哪些目标文件

----------------------------静态库讨论终止--------------------

 

Q:如何用共享库来生成这个同样功能的程序?

A:由于动态库和应用程序不像静态库那样整合在一起,故共享库并不知道应用程序的任何信息。

   为了生成地址无关的源文件, 使用gcc -PIC 选项

   gcc -fPIC -c initapi.c

   gcc -fPIC -c ramdapi.c

得到的目标文件中,包含了地址无关的代码。此时利用 -shared 可以创建共享库。

 gcc -shared initapi.o randapi.o -o libmyrand.so

利用共享目标来生成可执行文件方法与使用静态库的方法相同

 gcc test.c -L. -lmyrand -o test

 

可以设置一下环境变量

export LD_LIBRARY_PATH =./

显式的告知linux 动态库.so的位置。

此时

ldd test

可以打印出正确找到动态库依赖。

--------------------动态库讨论 ---------------

 

动态加载库,可以实现的强大功能是 提供了灵活空间,节省内存操作,后继将会提到。

 

 

 

 

 

 

 

 

 

抱歉!评论已关闭.