库
来源:互联网 发布:常见网络拓扑结构图 编辑:程序博客网 时间:2024/04/28 21:23
库
库,二进制形式代码,可以被系统载入内存执行。在一定的许可协议下可以复用,实现资源的共享。常见的库格式如StaticCai.libdllCai.lib dllCai.dll libcai.solibcai.a等
不同系统库的格式可能不同,甚至也是不兼容的。如 linux和windows
linux下有静态和动态两种库,两者的区别主要在于代码载入的时刻不同。
一 静态库
1命名:静态库文件名的命名规范以lib为前缀,紧跟静态库名,扩展名为.a如libhello.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为前缀,紧跟静态库名,扩展名为.so如libhello.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;
}
动态库把库函数的链接载入推迟到程序运行期,有利用资源的共享,利于程序的升级。
- 库
- 库
- 库
- 库
- 库
- 库
- 库
- 库
- 库
- 库
- 库
- 库
- 库
- 库
- 库
- 库
- 库
- 库?
- php 循环table,让内容一行两列显示
- ipad 中获取相册中图片名称
- hibernate二级缓存配置文件ehcache.xml属性意义
- 迷宫。。。
- windows 下vim taglist插件的安装,真实可用
- 库
- try to use recycled bitmap
- 关于Excel操作编写的一个软件设计构思案例[连载] --保存条件设定的另一种方式:更新与插入方法
- JNI 的 local reference table overflowed 问题
- Nginx的epoll模块
- android 滚动条 相关属性
- Rcp应用在启动时出现找不到org.eclipse.equinox.launcher.Main类错误
- 不安装oracle、3分钟直接用pl/sql连接oracle server
- vlc源代码分析详解