静态库和动态库

静态库的制作与使用

什么是库

  • 库文件是计算机上的一类文件,可以简单的理解为是一种代码仓库,提供给使用者一些可以直接拿来用的变量、函数或类。
  • 库文件有两种,静态库和动态库
    • 静态库:在程序的链接阶段被复制到了程序中。
    • 动态库:在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。通过ldd命令可以检查动态库依赖关系。

静态库

命名规则

  • Linux:libxxx.a
    • lib:前缀(固定)
    • xxx:库的名字
    • .a:后缀(固定)
  • Windows:libxxx.lib

静态库的制作

1、gcc获得.o文件
2、将.o文件打包,使用ar工具(archive)

ar rcs libxxx.a xxx.o xxx.o 
//r:将文件插入备存文件中
//c:建立备存文件
//s:索引

栗子

lesson2目录的结构
在这里插入图片描述
CAL.h

#ifndef CA_H
#define CA_H
 
int add();
int sub();
#endif

add.cpp

#include "CAL.h"
#include<iostream>

int add()
{
    printf("a + b\n");
}

sub.cpp

#include "CAL.h"
#include<iostream>

int sub()
{
    printf("a - b\n");
}

main.cpp

#include<iostream>
#include "CAL.h"
using namespace std;

int main()
{
    add();
    sub();
    return 0;
}

1、 将src中的.cpp文件编译成.o文件

gcc -c add.cpp sub.cpp -I ../include/
// -I应用include文件夹中的.h文件

在这里插入图片描述
2. 制作静态库

ar rcs libcal.a add.o sub.o

在这里插入图片描述
将生成的libcal.a文件mv到lib文件夹下面,结构如下:
在这里插入图片描述

3、 链接,生成可执行文件

g++ main.cpp -o app -I ./include/ -L ./lib/ -l cal

动态库的制作和使用

动态库

命名规则

  • Linux:libxxx.so(在Linux下是一个可执行文件)
    • lib:前缀(固定)
    • xxx:库的名字
    • .so:后缀(固定)
  • Windows:libxxx.dll

动态库的制作

1、gcc得到.o文件,得到和位置无关的代码

gcc -c -fpic/fPIC a.c b.c

2、得到动态库

gcc -shared a.o b.o -o libxxx.so

栗子

1、lesson3文件夹中包含的文件如下:
在这里插入图片描述
2、将.cpp文件编译得到.o文件:
在这里插入图片描述

gcc -c -fpic add.cpp sub.cpp

3、生成动态库文件:
在这里插入图片描述

gcc -shared add.o sub.o -o libcalc.so

4、链接生成可执行文件:
在这里插入图片描述

g++ main.cpp -o main -I include/ -L lib/ -l calc

将动态库文件cp至library/lib文件夹下,此时library文件夹中包含的文件如下:
在这里插入图片描述
5、运行,但是无法直接运行,报错如下:
在这里插入图片描述
通过ldd查看库的依赖关系:
在这里插入图片描述

如何定位共享库文件

当系统加载可执行代码时,能够知道其所依赖的库的名字,但是还需要知道绝对路径。此时就需要系统的动态载入器来获取该绝对路径。对于elf格式的可执行程序,是由ld-linux.so来完成的,它先后搜索elf文件的DT_RPATH段–>环境变量LD_LIBRARY_PATH–>/etc/ld.so.cache文件列表–>/lib/,/usr/lib目录找到库文件后将其载入内存。

解决动态库加载失败问题

  • 方式一: 直接在终端进行配置。这种配置方式只在当前终端有效。
    在这里插入图片描述
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/shisi/linux/lesson3/library/lib

“:”后面的路径可以通过如下方式查看:
在这里插入图片描述

  • 方式二: 用户级别的
    在这里插入图片描述
vim .bashrc

在文件的最后一行加上方式一的配置语句,保存并退出。
在这里插入图片描述
使刚刚编辑的文件生效(第一个”.“是source的意思)

  • 方式三: 系统级别的
    在这里插入图片描述
sudo vim /etc/profile

同样在最后一行加上方式一的配置语句,保存并退出。并且使刚刚编辑的文件生效。

  • 方式四: 修改/etc/ld.so.cache文件(该文件是一个二进制文件,无法直接修改),但是可以间接修改。
    在这里插入图片描述
sudo vim /etc/ld.so.conf

在这个文件的最后一行加上路径
在这里插入图片描述
更新编辑的文件
在这里插入图片描述

新了解的操作

env命令:不带参数,查看环境变量
pwd命令 :不带参数,目前所在的工作目录的绝对路径名称
cd 命令:不带参数,可以直接进入home目录下
shift+g:用vim打开的一个文件,可以直接跳到最后一行,然后按o,可以往下插入一行

说明: 参考视频https://www.nowcoder.com/study/live/504

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值