说到这个LIB文件,先从一个小故障说起。

某日开发说,一台测试用虚机可以PING通SSH不能连了。运维同学就赶紧去查,SSHD_CONFIG配置文件都正确啊,一点错误都没有,那为什么呢?

测试下,不管连自己还是其他机,都是报错

这里注意看,提示你有个libcom_err.so.2共享库文件找不到。

询问开发,才了解他们测试一个软件,意外删除了某个库文件。

那么在正常的相同虚机的机器查看下,再和出错的虚机比对下,发现少了2个库文件

挂载系统光盘或从正常的虚机上把这个两个文件拷贝过来,放到lib64下就可以了

再试正常了

这个小故障很容易解决,那么你怎么理解linux中的库文件呢?学习下也不误工作。

Linux下的库文件分为共享库和静态库两大类,它们两者的差别仅在程序执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的。

Linux的库一般在/lib 或/usr/lib 目 录下,如果是64位的系统则会有lib64目录。lib是库(Library)的英文缩写,它主要存放系统的链接库文件,没有该目录则系统就无法正常运行。/lib目录中存储着程序运行时使用的共享库。通过共享库,许多程序可以重复使用相同的代码,并且这些库可以存储在一个公共的位置上,因此能减小运行程序的大小。这个目录包含程序在链接时使用的 各种库。

库的知识

1.库的命名

库的命名比较简单,第一个特点是所有的库以lib开头,GCC命令在在-l选项所指定的文件名前会自动加入lib。

第二个特点文件名以.a结尾的库是静态库。

第三个特点文件名是.so的库为共享库(共享库是在运行的时候动态加载的 )。默认情况下,GCC在链接时优先使用共享库,只有当共享库不存在时才考虑使用静态库。

2、库的编号

库的编号格式如下:

library_name .major.num .minor_.min .pathch_num

例如,笔者Red Hat Linux 9.0的GUN数据库是libgdbm.so.0.0.2,详细表述如下:

◆library_name是libc.so(标准C库);

◆major_num是2(主版本号);

◆minor_.min是0(次版本号);

◆pathch_num是0(补丁级别号又称发行号)。

3、库的操作命令

Linux库操作可以使用命令完成,目前常用的命令是ldd和ldconfig。ldd是Library Dependency Display缩写,它的作用是显示一个可执行程序必须使用的共享库。(1)命令格式ldd [选项] 文件名(2)主要参数-d 执行重定位并报告丢失的函数。-r 执行对函数和数据对象的重定位,并报告丢失的函数和数据对象。

(3)应用举例

比如查询Perl语言有哪些共享库,则可以首先使用find命令查询这个程序的绝对路径,然后使用ldd命令:#find -name perlldd /usr/bin/perl

$ ldd test执行test,可以看到它是如何调用动态库中的函数的。

2.ldconfigldconfig 命令的作用是决定位于目录/usr/lib和/lib下的共享库所需的运行链接。这些链接保存在的Libs保存在/et/ld.so.conf文件中。搜 索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的链接和缓存文件。缓存文件默认为/etc /ld.so.cache,此文件保存已排好序的动态链接库名字列表。(1)命令格式ldconfig [选项] [libs](2)主要选项-v或--verbose ldconfig将显示正在扫描的目录、搜索到的动态链接库,以及它所创建的连接的名字。-f CONF 指定动态链接库的配置文件为CONF,系统默认为/etc/ld.so.conf。-C CACHE 指定生成的缓存文件为CACHE,系统默认的是/etc/ld.so.cache,文件存放已排好序的可共享的动态链接库的列表。-p或--print-cache 让ldconfig打印出当前缓存文件所保存的所有共享库的名字。-r ROOT 改变应用程序的根目录为ROOT。-n ldconfig仅扫描命令行指定的目录,不扫描默认目录(/lib、/usr/lib),也不扫描配置文件/etc/ld.so.conf所列的目录。运行没有选项的ldconfig命令时,用于更新高速缓冲文件。这个命令主要用于高速缓冲DNS服务器(Caching DNS Server)。高速缓冲DNS服务器的原理是提供查询的历史记录,并且利用这些记录来提高查询的效率。当某个查询是第一次被发送到高速缓冲DNS服务器时,高速缓冲DNS服务器就将此查询的整个过程记录下来,在一定的时期内用它来回答所有相同的查询,从而减少整个DNS系统的负担并且提高查询速度。(3)应用实例如果用户想知道系统中有哪些动态链接库,或者想知道系统中有没有某个动态链接库时,可用-p选项让ldconfig输出缓存文件中的动态链接库列表,从而查询得到。 例如:

ldconfig -p998 libs found in cache `/etc/ld.so.cache'libzvt.so.2 (libc6) => /usr/lib/libzvt.so.2libzvt.so (libc6) => /usr/lib/libzvt.so……

补充:

静态链接库*.a的编译和使用

创建.a库文件和.o库文件:

[yufei@localhost perl_c2]$ pwd

/home/yufei/perl_c2

[yufei@localhost perl_c2]$ cat mylib.c

#include

#include

void hello(){

printf("success call from perl to c library\n");

}

[yufei@localhost perl_c2]$ cat mylib.h

extern void hello();

[yufei@localhost perl_c2]$ gcc -c mylib.c

[yufei@localhost perl_c2]$ dir

mylib.c  mylib.h  mylib.o

[yufei@localhost perl_c2]$ ar -r mylib.a mylib.o

ar: 正在创建 mylib.a

[yufei@localhost perl_c2]$ dir

mylib.a  mylib.c mylib.h  mylib.o

*.a的使用方法

最简单的是直接把.a当成一个普通源代码编译进来.

gcc   main.cpp   ./lib/libInfo.a   -o   exec

动态链接库*.so的编译与使用- -

动态库*.so在linux下用c和c++编程时经常会碰到,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助。

1、动态库的编译

下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:so_test.h,三个.c文件:test_a.c、test_b.c、test_c.c,我们将这几个文件编译成一个动态库:libtest.so。

so_test.h:

#include

#include

void test_a();

void test_b();

void test_c();

test_a.c:

#include "so_test.h"

void test_a()

{

printf("this is intest_a...\n");

}

test_b.c:

#include "so_test.h"

void test_b()

{

printf("this is intest_b...\n");

}

test_c.c:

#include "so_test.h"

void test_c()

{

printf("this is intest_c...\n");

}

将这几个文件编译成一个动态库:libtest.so

$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so

2、动态库的链接

在1、中,我们已经成功生成了一个自己的动态链接库libtest.so,下面我们通过一个程序来调用这个库里的函数。程序的源文件为:test.c。

test.c:

#include "so_test.h"

int main()

{

test_a();

test_b();

test_c();

return 0;

}

l       将test.c与动态库libtest.so链接生成执行文件test:

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

l       测试是否动态连接,如果列出libtest.so,那么应该是连接正常了

$ ldd test

l       执行test,可以看到它是如何调用动态库中的函数的。

总结:1、共享库特别适合多个程序共享代码,升级程序部分功能模块,实现程序“插件”功能的情况;

而静态库是一劳永逸,编译后不需要带一堆库文件跑,而且不管放置到哪里都可正常运行。

2、当搜索的库文件目录下同时存在该库的静态版本和共享版本时,链接器优先使用共享版本.so,此时你可以使用-static链接选项指定链接静态版本.a。

3、动态库可以导出两个特殊的函数:_init和_fini,前者在动态库被加载后调用,后者在动态库被卸载前调用,

我们可以使用这两个函数做些特别的工作。需要注意的是:在定义这两个函数后编译时,需要使用

-nostartfiles选项,否则编译器报重复定义错误。

4、ldd命令用来查看程序所依赖的共享库,同时也方便我们判断共享库是否被找到;

nm命令查看obj文件(.so也是一个obj)中的标识(函数、变量)。

linux查看lib文件,linux下的 lib文件的学习思考相关推荐

  1. Linux:centos释放缓存,查看磁盘空间大小,xxx文件夹, 查看文件夹大小,查看剩余内存,查看xxx软件位置,统计某文件夹,统计某文件夹下目录数量,查看文件夹大小,给文件夹下所有的文件赋值权限

    一台老的PHP后台服务器,今天用 free -m 查看,发现内存跑满了. 再 top,然后按下shift+m,也就是按内存占用百分比排序,发现排在第一的进程,才占用0.9%,那是什么占用的呢?谷歌了一 ...

  2. 怎么查看linux文件夹下有多少个文件(mac同样)

    查看目录下有多少个文件及文件夹,在终端输入 ls | wc -w 查看目录下有多少个文件,在终端输入 ls | wc -c 查看文件夹下有多少个文件,多少个子目录,在终端输入 ls -l |wc -l ...

  3. linux查看显示器名称命令,linux 查看显示器信息Linux下查看硬件信息命令大全

    /proc 虚拟的目录,是系统内存的映射.可直接访问这个目录来获取系统信息.其中也包含下面的信息: 主机CPU信息:cpuinfo 主机DMA通道信息:dma 文件系统信息:filesystems 主 ...

  4. linux按照更改时间查看文件,Linux查看特定时间段内修改过的文件

    Linux查看特定时间段内修改过的文件 一.Linux系统日志的一些信息,日志配置文件syslog.conf 系统日志一般都存在/var/log下 常用的系统日志如下: 核心启动日志:/var/log ...

  5. linux怎么复制文件夹全部内容,linux局域网怎么复制文件夹下的全部文件到另外文件夹...

    在Linux系统局域网中复制或拷贝文件我们可以用cp或者copy命令,但要对一个文件夹中的全部文件复制到另外一个文件夹中去,如何进行操作呢?linux局域网复制文件夹下的全部文件到另外文件夹的方法其实 ...

  6. 深入探讨:linux中遍历文件夹下的所有文件

    深入探讨:linux中遍历文件夹下的所有文件 http://www.jb51.net/article/37664.htm

  7. Linux下 删除文件夹下的所有文件

    Linux下  删除文件夹下的所有文件,而不删除文件夹本身 的命令: 1.先进入要删除的文件夹 切记 不管用什么命令: cd /app/www/test 2.删除此文件下的文件 rm -f /app/ ...

  8. linux清楚指定文件夹下的空文件夹

    要在 Linux 系统中清除指定文件夹下的空文件夹,可以使用 rmdir 命令. 例如,如果要清除 ~/documents 文件夹下的所有空文件夹,可以使用以下命令: find ~/documents ...

  9. 误操作删除了/var/lib/docker/overlay2/ 下的所有文件,导致docker 起不来

    /var/lib/docker/overlay2 占用很大,手贱 删除了/var/lib/docker/overlay2/ 下的所有文件,重启docker,卸载重新安装还是报错 docker: Err ...

  10. Linux环境下移动一个文件夹下的所有文件到另一个文件夹

    Linux环境下移动一个文件夹下的所有文件到另一个文件夹 研究命令 最近需要把一个环境里的文件,迁移到另一个环境里去,但是两个环境里的数据会有一些同名的子目录,要求不能覆盖数据而是合并,迁移之前我先做 ...

最新文章

  1. linux命令wc解读
  2. selenium search
  3. linux xampp nginx,nginx配置教程_如何配置nginx_nginx安装与配置详解
  4. 系统ghost后变成一个盘了别的分区的文件怎么找回
  5. linux是数据库软件么,什么是适用于Linux的良好数据库ERD工具?
  6. java读取codetable_解析Java对象的equals()和hashCode()的使用
  7. asp不同编码下 UTF-8 GB2312转换收集
  8. elasticsearch高级查询进阶
  9. UEditor工具栏上自定义按钮、图标、事件、窗口页面
  10. 使用动态优先权的进程调度算法的模拟_我爱OS第12讲:系统调度
  11. [面试] 算法(七)—— 逆序输出链表
  12. $bzoj1046-HAOI2007$ 上升子序列 $dp$ 贪心
  13. 码支付源码最新版_码支付源码,云端已本地化,ck协议本地化,完全脱离云端控制
  14. 为什么使用Python保存的视频特别大!!(数据速率/总比特率)
  15. 蓝牙耳机能链接计算机,蓝牙耳机,小编教你蓝牙耳机怎么连接电脑
  16. com组件 的劫持_IE首页被劫持跳转问题的解决方案
  17. Lamber表达式 List,Map,Set 互相转换
  18. 想知道CAD怎么转图片格式?跟我学会这几招就足够了
  19. 不知道买啥绘本?适合3-6岁儿童的绘本书单,建议父母收藏
  20. CVE-2021-22205 Gitlab exiftool远程命令执行 复现

热门文章

  1. 快速删除Word中的空行
  2. 【推荐】华为顶级认证HCIE-RS培训教材全套合集
  3. Scala编程基础——集合高阶函数
  4. 使用ExpandableListView实现一个时光轴
  5. 项目开发计划书_【创业先锋班】创业计划书撰写——第七期创业先锋班晚自习...
  6. 如何通过绩效考核对互联网人精准打击条条致命?
  7. GPS信号捕获基本原理
  8. 机器学习概论 SMO算法实现(实验三)
  9. python中 “”和“and”的区别
  10. [转]基于Video4Linux的USB摄像头图…