二、静态库的制作和使用

一、静态库的制作

什么是库

  • 库文件是计算机上的一类文件,可以简单的把库文件看成一种代码仓库,它提供给使用者一些可以直接拿来用的变量、函数或类。
  • 库是特殊的一种程序,编写库的程序和编写一般的程序区别不大,只是库不能单独运行。
  • 库文件有两种,静态库和动态库(共享库),区别是:静态库在程序的链接阶段被复制到了程序中;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加
    载到内存中供程序调用。
  • 库的好处:1.代码保密 2.方便部署和分发

静态库的制作

(1) 命名规则

  • Linux:libxxx.a
    • lib:前缀 (固定,library 的缩写:库)
    • xxx:库的名字,自己起
    • .a:后缀 (固定)

(2) 制作步骤

  • gcc 获得 .o 文件
  • 将 .o 文件打包,使用 ar 工具 (archive)
    ar rcs libxxx.a xxx.o xxx.o
    • r - 将文件插入备存文件 (replace的缩写)
    • c - 建立备存文件 (create的缩写)
    • s - 建立索引,让链接器更快找到函数 (index的缩写)

开始制作

这里先给出测试代码,非 vip 用户可以私聊我。

1.将测试代码拖入 lesson04 文件夹中。

2.树形显示当前目录的所有文件和子文件夹

bash 复制代码
tree

如果没有安装需要执行以下代码进行安装:

bash 复制代码
sudo apt install tree

3.使用 -c 指令将 add.c,div.c,mult.c,sub.c 汇编成 .o 文件 (不链接)

bash 复制代码
gcc -c add.c div.c mult.c sub.c

这里不汇编 head.h 是因为在预处理的时候会把头文件复制到源文件内。

3.制作静态库

bash 复制代码
ar rcs libcalc.a add.o div.o mult.o sub.o

二、静态库的使用

准备静态库

将 lesson04 下的测试代码文件复制进 lesson05 文件夹:

bash 复制代码
cp -r calc library ../lesson05
  • cp
    • 是 copy 的缩写
    • 功能:复制文件/复制目录
  • -r
    • 是 recursive 的缩写,递归的
    • 功能:递归复制,遇到目录时,不光复制目录本身,连目录里所有的文件、子目录、子子目录... 全部一起复制过去。

拷贝静态库文件 libcalc.a 到当前目录的 ./lib 下:

编译使用静态库的程序

当前项目目录:

1.直接编译 main.c 文件:

bash 复制代码
gcc main.c -o app

2.这里提示缺少头文件,是因为编译器只会在 main.c 所在目录下寻找头文件,因此需要 -I 指定 include 包含文件的搜索目录:

这次没有说找不到头文件了,但是 main.c 里有函数未定义,也就是说函数定义的库没有指出。

3.利用 -l 指定所用的库名 ( 对于静态库 libcalc 来说,库名是 calc ),利用 -L指定所用库的路径:

bash 复制代码
gcc main.c -o app -I ./include -L ./lib -l calc

可以看到可执行文件 app 运行成功!

相关推荐
道剑剑非道1 小时前
FFmpeg 6.0 实战:用 C++ 封装摄像头采集与 RTSP 推流
开发语言·c++·ffmpeg
mzhan0172 小时前
Linux: coredump产生对程序退出的影响
linux·运维·服务器
天天进步20152 小时前
Python全栈项目实战:基于深度学习的语音合成(TTS)系统
开发语言·python·深度学习
OctShop大型商城源码2 小时前
.NET线上商城源码_C#商城源码_技术赋能下的电商新生态
开发语言·c#·.net·商城系统源码
光电笑映2 小时前
从环境变量到进程虚拟地址空间——Linux 内存管理的底层脉络
linux·服务器·c++·c
源远流长jerry2 小时前
Linux 网络收包机制:从网卡到 Socket 的完整路径
linux·运维·服务器·网络·网络协议·tcp/ip
IT猿手2 小时前
光伏模型参数估计:基于山羊优化算法(GOA )的光伏模型参数辨识问题求解研究,免费提供完整MATLAB代码链接
开发语言·算法·matlab·群智能优化算法·智能优化算法·光伏模型参数估计·光伏模型参数辨识
xrgs_shz2 小时前
【高光谱数据处理实战】基于Python的ENVI图像交互式裁剪与光谱数据预处理
开发语言·图像处理·python
MATLAB代码顾问3 小时前
麻雀搜索算法(SSA)原理详解与Python实现
开发语言·python