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
可以打印出正确找到动态库依赖。
--------------------动态库讨论 ---------------
动态加载库,可以实现的强大功能是 提供了灵活空间,节省内存操作,后继将会提到。