静态库的制作与使用
什么是库
- 库文件是计算机上的一类文件,可以简单的理解为是一种代码仓库,提供给使用者一些可以直接拿来用的变量、函数或类。
- 库文件有两种,静态库和动态库
- 静态库:在程序的链接阶段被复制到了程序中。
- 动态库:在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。通过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