来源:互联网 发布:常见网络拓扑结构图 编辑:程序博客网 时间:2024/04/28 21:23

库,二进制形式代码,可以被系统载入内存执行。在一定的许可协议下可以复用,实现资源的共享。常见的库格式如StaticCai.libdllCai.lib dllCai.dll  libcai.solibcai.a

  不同系统库的格式可能不同,甚至也是不兼容的。如 linuxwindows

linux下有静态和动态两种库,两者的区别主要在于代码载入的时刻不同。

 一 静态库

  1命名:静态库文件名的命名规范以lib为前缀,紧跟静态库名,扩展名为.alibhello.a 

  2创建:

#gcc -c test.c

#ar crs libtest.a test.o

3使用:

#gcc -o test main.c -L. -ltest (~libtest)

静态库对函数库的链接是放在编译时期完成,这意味着程序在运行和函数库无关,有利于移植但空间按体积较大。


gcc

1常用命令

gcctest.c         : 缺省在当前目录生成可执行文件a.out

gcc-o test test.c   : 生成可执行文件test(-o后面必须跟可执行文件名)

gcc-c test.c        : 生成目标文件test.o

--------------------------------------------------------------------------------
注意:当你使用-o选项时,-o后面必须跟一个文件名.  
--------------------------------------------------------------------------------

2gcc编译器常用选项如下

-shared   :

-static :

-Idirectory : 为include文件的搜索指定目录*

-g : 显示排错信息供gdb使用*

-Llibpath    :  添加库文件的搜索路径

-llibrary: 用来指定所使用的库文件 *

-Wall:  显示附加的警告信息      

-w : 禁止显示警告信息

v,指定个区间y -fPIC:编译为位置独立代码,用于共享库。可加载到可执行程序内存的任何地方

-pedantic      : 严格要求符合ANSI标准

-O : 对编译出的代码进行优化

-O: 进行比-O更好的优化

-O3:进行比-O2更好的优化

-p: 产生prof 所需的信息

-pg :  产生gprof所需的信息

注意:-p-g与 -pg 不同


  三 动态库

  1命名:静态库文件名的命名规范以lib为前缀,紧跟静态库名,扩展名为.solibhello.so 

  2创建:用v,指定个区间y

#gcc -fPIC -Wall -c test.c

#gcc -shared -o libtest.so test.o

3加载:

系统加载时依赖库名+绝对路径加载过程由动态载入器(dynamiclinker/loader) DL 处理

4链接路径:

ubuntu对动态库的管理在/etc/ld.so.conf*相关文件中配置路径 默认的检索路径一般包含

(1)/usr/lib

(2)/lib

可以根据实际环境决定是否将安装目录写入配置文件或者在LD_LIBRARY_PATH环境变量中新增路径。若需写好后还要执行ldconfig来启用新配置。

设置LD_LIBRARY_PATH


etc/profile或者/~.bashrc(区别)
#
找到动态链接库的路径
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/MyLib 
exportLD_LIBRARY_PATH

#
找到静态库的路径
LIBRARY_PATH=$LIBRARY_PATH:/MyLib
exportLIBRARY_PATH

下面是在gcc命令中手动设置搜索路径:(具体gcc–help先差下支持命令)

#添加头文件搜索路径

# gcc foo.c -I /home/xiaowp/include -o foo 

#添加动态库搜索路径

# gcc foo.c -L /home/xiaowp/lib -lfoo -o foo 

#添加静态库搜索路径

#gcc foo.c -L /home/xiaowp/lib -static -lfoo -o fo

5.

android中硬件模块动态库检出如下:

inthw_get_module_by_class(const char *class_id, const char *inst,

conststruct hw_module_t **module)

{

intstatus;

inti;

conststruct hw_module_t *hmi = NULL;

charprop[PATH_MAX];

charpath[PATH_MAX];

charname[PATH_MAX];

if(inst)

snprintf(name,PATH_MAX, "%s.%s", class_id, inst);

else

strlcpy(name,class_id, PATH_MAX);

/*

*Here we rely on the fact that calling dlopen multiple times on

*the same .so will simply increment a refcount (and not load

*a new copy of the library).

*We also assume that dlopen() is thread-safe.

*/

/*Loop through the configuration variants looking for a module */

for(i=0 ; i<HAL_VARIANT_KEYS_COUNT+1 ; i++) {

if(i < HAL_VARIANT_KEYS_COUNT) {

if(property_get(variant_keys[i], prop, NULL) == 0) {

continue;

}

snprintf(path,sizeof(path), "%s/%s.%s.so",

HAL_LIBRARY_PATH2,name, prop);

if(access(path, R_OK) == 0) break;

snprintf(path,sizeof(path), "%s/%s.%s.so",

HAL_LIBRARY_PATH1,name, prop);

if(access(path, R_OK) == 0) break;

}else {

snprintf(path,sizeof(path), "%s/%s.default.so",

HAL_LIBRARY_PATH1,name);

if(access(path, R_OK) == 0) break;

}

}

status= -ENOENT;

if(i < HAL_VARIANT_KEYS_COUNT+1) {

/*load the module, if this fails, we're doomed, and we should not try

*to load a different variant. */

status= load(class_id, path, module);

}

returnstatus;

}



 动态库把库函数的链接载入推迟到程序运行期,有利用资源的共享,利于程序的升级。