目录

1、什么是库文件?

2、静态库的生成与使用

2.1、生成 .o 文件

2.2、创建静态库

2.3、使用静态库

3、动态(共享)库的生成与使用

3.1、生成 .o 文件

3.2、生成动态库文件

3.3、使用动态库

4、静态库与动态库的区别


1、什么是库文件?

库是一组预先编译好的方法的集合,是计算机上的一类文件,提供给使用者一些开箱即用的变量、函数或类。库文件分为静态库动态库,静态库和动态库的区别体现在程序的链接阶段。
        一般来说,Windows静态库文件扩展名.lib动态库文件扩展名.dll (Dynamic-Link Libraries);Linux静态库扩展名.a动态库扩展名.so (Shared Object)。内容一样,都是将函数封装,编译后生成.o文件,将所有 .o 文件合并生成库文件,再将供自己或他人调用。好处在于编译后的库文件的源代码被加密,使用者看不到,可保密。
        Linux系统存储的库的位置一般在:/lib 和 /usr/lib。 在 64 位的系统上有些库也可能被存储在/usr/lib64 下。库的头文件一般会被存储在 /usr/include 下或其子目录下。
        Linux库有两种,一种是静态库,其命令规则为 libxxx.a;一种是共享库,其命令规则为 libxxx.so

2、静态库的生成与使用

静态库是.o 文件打包的结果,.o文件的数量可以是1个,也可以是多个。生成的过程需要使用 ar 工具来操作。

测试文件:

add.c:

max.c:

foo.h:

main.c:

2.1、生成 .o 文件

使用命令gcc  -c  源文件序列

命令的用法是多种多样的,可以分步经 预处理编译汇编 生成 .o 文件,也可以直接使用 gcc  -c  源文件名,一步生成 .o 文件。

例如,使用命令 gcc  -c  add.c  max.c  ,一步生成两个文件的 .o 文件。

2.2、创建静态库

  使用命令ar  crv  lib库名.a  add.o  max.o

例如,使用 ar  crv  libfoo.a  add.o  max.o,生成库名为libfoo.a,包含addmax两种方法的静态库。

c 参数是创建库;r 参数是将方法添加到库中;v 参数显示详细过程。

2.3、使用静态库

使用命令gcc  -o  main  main.c  -L  库文件所在路径  -l  库名

在当前程序中使用静态库的方法,就是使用 gcc  -o  生成的可执行程序名  当前程序  -L  库文件所在路径  -l  库名

-L  指定库文件所在路径 

-l  指定库名(库名是libxxx.a中的xxx,无lib.a)

例如,gcc  -o  main  main.c  -L  .  -l  foo,目标库文件就在当前目录下,所以路径为 . ,库文件名在去除lib.a后为 foo。

此时,成功生成了可执行程序。

执行程序后,发现程序结果符合预期,所以使用的库文件是正确的,并且成功使用了。

3、动态(共享)库的生成与使用

动态库的测试文件除main程序外与静态库的测试文件相同:add.c、max.c、foo.h。

main.c:

3.1、生成 .o 文件

gcc  -c  add.c  max.c

3.2、生成动态库文件

使用命令gcc  -shared  -fPIC  -o  libfoo.so  add.o  max.o

使用如上命令,就可以根据add.o和max.o文件,生成名为 libfoo.so 的动态库文件。

3.3、使用动态库

使用命令gcc  -o  main  main.c  -L  .  -l  foo

-L还是指定库文件所在路径,-l 指定库文件名。但是在命令使用前,我们需要了解一件事情,就是系统对动态库的链接,默认是在 /usr/lib 目录下的,意思就是就算此时我们指定了库文件所在路径,系统还是会去 /usr/lib 目录下寻找动态库文件。此时,有两种解决方案:

1、将自制的动态库文件移动到 /usr/lib 目录下。

此时,在使用动态库时就不用指定库文件所在路径了,但需要注意不能库文件名与 /usr/lib 目录下原有动态库文件重名

此时,使用 gcc  -o  main  main.c  -l  foo 命令后,成功生成可执行文件。

在执行文件后,程序结果正确,所以动态库生成与使用成功。

        2、修改环境变量,使可在当前目录下链接动态库。

命令export  LD_LIBRARY_PATH=.

设置该环境变量之后,系统在发现程序想要链接动态库时,就会默认先从当前路径寻找该动态库,找到后就链接;若没有找到就会返回到 /usr/lib 路径下寻找该动态库,找到后链接。若找遍所有位置都没找到,则报错。

此时,设置环境变量后,先将动态库文件从 /usr/lib 目录下移动回来。

再使用 gcc  -o  main  main.c  -L  .  -l  foo 命令,使用动态库。

新生成的main可执行程序将原main程序覆盖。

./main程序执行正确,libfoo.so动态库文件使用成功。

两个额外命令:删除指定环境变量:unset LD_LIBRARY_PATH;查看环境变量的值:echo $LD_LIBRARY_PATH。

3.4、查看可执行程序依赖的动态库

命令:ldd  可执行程序名。

4、静态库与动态库的区别

每一个程序在使用静态库时,都会将静态库文件拷贝一份添加到自身。如果有多个程序都要使用该静态库文件时,都会给自身添加一份拷贝,这就导致会产生空间浪费。在源文件较少时不明显,但如果在一个项目中,静态库文件本身就比较大,并且使用该静态库文件的源程序很多,这就会造成大量内存浪费。

而动态库文件在被使用时,会对所有想使用该动态库的源程序添加一个标记,在程序执行时再链接动态库文件使用。这就是动态库的优点,也是动态库被称为共享库的原因。

Linux系统上库文件的生成与使用(静态库和动态库)相关推荐

  1. Linux系统上的文件类型

    Linux系统上的文件类型 -: 常规文件 d: directory,目录文件 b: block device,块设备文件,支持以"block"为单位进行随机访问 c: chara ...

  2. Linux系统上传文件与下载文件命令

    我们用的服务器都是Linux系统的,如果用的是远程服务器,就需要将我们的代码推送过去,这里可以用到PSCP命令. (一)上传 pscp 本机文件的路径以及文件名 远程主机的用户名@远程主机IP:想要存 ...

  3. xshell怎么往linux系统上传文件,xshell怎么连接linux xshell上传文件的方法

    匿名用户 1级 2016-04-29 回答 1.保证linux下ssh开启(默认开启) # netstat -tupln |grep ssh tcp 0 0 0.0.0.0:22 0.0.0.0:* ...

  4. linux文件夹加密访问,技术|Linux系统上用encfs创建和管理加密文件夹

    如果你想使你计算机上的某些信息免于被窥视的话,可以看看这篇文字.保护信息的一种方法就是加密你的home目录,但是一旦你登录系统后,你的home目录下的信息将暴露于外.过去,我已经写过关于怎样在你的系统 ...

  5. 怎么复制window上的内容到linux,怎样将文件从window系统复制到远程linux系统上

    怎样将文件从window系统复制到远程linux系统上 怎样将文件从window系统复制到linux系统上,其实有几种方法,好比,将windows上的文件共享出来,经过cifs协议mount到linu ...

  6. linux文件向磁带备份,如何在Linux系统上进行快速磁带备份

    如何在Linux系统上进行快速磁带备份 发布时间:2006-09-08 00:28:08来源:红联作者:Myiozzdoc 使用mt-st 工具,在Linux系统上进行快速文件备份. 在CD.DVD以 ...

  7. linux安装文件多大空间,你的Linux系统上安装了多少内存?又使用了多少?

    [51CTO.com快译]几个命令可报告Linux系统上安装和使用了多少内存.你可能淹没于细节,也可能获得快速简易的答案,这看你使用哪个命令. 有好多方法可以获取Linux系统上已安装内存方面的信息, ...

  8. linux 显示目录文件数,如何在Linux系统上显示当前及子目录中的文件数量

    在本指南中,我们将介绍如何在 Linux 系统上显示当前工作目录或任何目录及其子目录中的文件数量. 我们将使用 find 命令,它用于搜索目录层次结构中的文件,以及 wc 命令,它会打印每个文件或来自 ...

  9. linux系统上传本地文件或文件夹

    linux系统上传本地文件或文件夹 一般将文件上传到linux服务器都会用一些shell工具,但是有些情况下还是需要掌握一下使用命令上传文件. 从服务器上下载文件 scp username@serve ...

最新文章

  1. 【自然框架 NatureFW】里的两种“映射”方式
  2. Zookeeper服务器集群的搭建与操作
  3. CNN目标检测(一):Faster RCNN详解
  4. react招聘项目——使用cookie实现项目自动登录功能
  5. 【tensorFlow】——图像数据增强、读取图像、保存图像
  6. Tr A HDU1575
  7. Win10系统电脑查看无线密码的方法
  8. Dom-to-image
  9. Oracle常用导出导出命令及性能效率对比
  10. pytorch gather_【CV】10分钟理解Focal loss数学原理与Pytorch代码
  11. FIREDAC(DELPHI10 or 10.1)提交数据给ORACLE数据库的一个不是BUG的BUG
  12. Android -- 无线网络配置信息的管理者WifiConfigStore简介
  13. MySQL-第十二篇管理结果集
  14. CSS安全字体的写法
  15. 计算机显示无法打开打印机添加,win10电脑提示无法打开添加打印机怎么办
  16. k8s免fq下载镜像
  17. 搭建react项目教程(二)
  18. 一年三轮融资3亿 深睿医疗领跑AI医疗行业
  19. GAN综述及其在图像生成领域的应用(含原理、代码详解)
  20. VR+电击,禁毒新方式

热门文章

  1. 隐语义模型( LFM )
  2. IDEA使用code with me来进行多人远程编程
  3. 椰子水「Vita Coco」赴美IPO,能否撑起20亿美元估值?
  4. 夜那么长 何时的黎明 续捌
  5. 长数字正常导入Excel
  6. pycharm安装Open3D库失败解决小全笔记--Could not find a version that satisfies the requirement
  7. jquery跳转页面
  8. 刚刚:《游戏王》“20周年纪念版青眼白龙” 金卡再现法拍平台
  9. python3软件怎么使用_Python 3.x入门到应用实践
  10. MySQL递归查询组织架构