Linux下的“库”和“链接”

  1. 库是计算机上的一类文件,可以简单地把库当作代码仓库,提供给使用者一些可以直接使用的变量、函数或者类。

  1. 库是一种特殊的一种程序,编写库的程序和编写普通程序的差别不大,只是库不能单独运行。

  1. 库分为:静态库动态库。区别在于静态库在程序的链接阶段被复制到程序中,动态库则没有被复制,儿时在程序每次运行的时候由系统动态加载到内存中供程序使用。

  1. 库的好处:①.库里面的代码比较保密,不容易被看到

②.方便程序的部署和分发

静态库

    • 命名规则

  • 在Linux下,静态库一般写为:libxxx.a

(lib:前缀,是固定的,每个静态库都有;xxx:静态库的名称;.a:固定后缀)

  • 在Window下,静态库一般为:libxxx.lib,与上面的相比,只有后缀是不同的

    • 静态库的制作

  1. 首先需要将写好的程序编译成.o文件,也就是上图中倒数第二步形成的文件

  1. 使用ar工具,将.o文件打包

g++/gcc -c xxx -o xxx.o
ar rcs libxxx.a xxx.o
(r:将文件插入备存文件中   c:建立备存文件   s:索引)
    • 静态库的使用

g++/gcc xxx -o xxx.out -L 库的路径 -l 库的名称(libxxx.a中的xxx就是库的名称) [-I 头文件的路径](在同个目录下就不需要这一项)
    • 做个简单的测试

head.h

#include <iostream>
using namespace std;

int add(int& a,int &b);
int sub(int &a,int &b);

add.cpp

#include "head.h"

int add(int &a,int &b)
{
    return a+b;
}

sub.cpp

#include "head.h"

int sub(int &a,int &b)
{
    return a-b;
}

main.cpp

#include "head.h"

int main()
{
    int a=10,b=10;
    cout<<add(a,b)<<endl;
    cout<<sub(a,b)<<endl;
}
  1. 将add.cpp 和sub.cpp 封装成静态库

g++ -c add.cpp -o add.o
g++ -c sub.cpp -o sub.o

ar rcs libadd.a add.o
ar rcs libsub.a sub.o
  1. 将main.cpp编译成可执行文件(此时main.cpp里面使用到了add.cpp和sub.cpp,所以需要用到libadd.a和libsub.a)

g++ main.cpp -o main.out -L ./ -l add -l sub -I ./
./main.out
输出:20
      0

动态库

    • 命名规则

  • 在Linux下,动态库一般为libxxx.so,除了后缀不同,其他是一样的

  • 在Window下,一般为libxxx.dll

    • 动态库的制作

  1. gcc得到.o文件,与静态库不同的是,这个过程需要得到的是与位置无关的代码

gcc/g++ -c -fpic/-fPIC a.c b.c -o a.o b.o 
  1. gcc得到动态库

gcc/g++ -shared a.o b.o -o libxxx.so
    • 动态库的使用

g++/gcc xxx -o xxx.out -L 库的路径 -l 库的名称(libxxx.so中的xxx就是库的名称) [-I 头文件的路径](在同个目录下就不需要这一项)

与静态库不同的是,想要使用动态库,就必须配置环境变量!

如何配置环境变量?

方法一:临时添加
在终端输入:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库的绝对路径
缺点就是每次关闭终端后,临时环境变量就会生效
方法二:永久添加
在home目录下,打开.bashrc文件,在最后一行添加:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库的绝对路径
然后把保存退出,输入..bashrc启用

可以用(ldd 可执行文件名)命令查看可执行文件名的依赖关系,需要在可执行文件的目录下使用

动态库与静态库的对比

    • 程序编译成可执行文件的过程

共同点:都是在链接阶段与目标代码等链接成可执行文件

不同点:静态库在链接阶段的时候,会把库中的代码打包到可执行文件中,相当于把库中的代码复制到可执行文件中;动态库则是当可执行文件代码运行到含动态库代码时,加载动态库。

    • 创建过程

创建方法不同,具体看上面

    • 库的使用

使用命令是一样的,但是动态库使用前需要预先设置环境变量

    • 静态库的优缺点

优点:
  1. 静态库链接时打包到可执行程序中的加载速度较快

  1. 发布程序时不需要提供静态库,移植方便

缺点:
  1. 消耗系统资源,浪费内存

  1. 更新,部署,发布程序时较麻烦

    • 动态库的优缺点

优点:
  1. 可以实现进程间资源共享(共享库)

  1. 更新,部署,发布程序时简单

  1. 可以控制何时加载动态库

缺点:
  1. 加载速度比静态库慢

  1. 发布程序时需要提供依赖的动态库

链接

链接分为:软链接和硬链接

软链接

解释:

软链接又叫做“符号链接“(symbolic Link),它包含了到原文件的路径信息。

(通俗来讲,其作用相当于Window系统下的桌面快捷)

特性:

  1. 软链接有自己的文件属性以及权限

  1. 可以对不存在的目录和文件创建软链接

  1. 软链接可以交叉文件系统

  1. 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)

创建语法:

ln -s 源文件 目标文件

硬链接

解释:

对源文件起了一个别名。

(通俗来讲,就是复制了一个源文件,但是他们是同步更新的,因为inode号相同)

特性:

  1. 只能对已存在的文件进行创建

  1. 不能对目录进行创建,只能对文件进行创建

  1. 文件有相同的inode号和data block

  1. 删除一个硬链接文件并不会影响到其他拥有相同inode号的文件

创建语句:

ln 源文件 目标文件

今天的笔记就到这里啦,对于库有疑惑的不如自己去创建一个库试一下,对链接有疑惑的可以去去看这篇更通俗易懂的文章:http://t.csdn.cn/IYMWT

2023.1.14

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值