Linux 环境下的静态库生成与使用

article/2025/10/31 2:46:56

目录

一,简介

二,如何生成静态链接库

1.准备测试程序

三,如何使用静态链接库 

 1.生成静态链接库

  2.使用静态链接库


一,简介

这里我们只讲 Linux 环境下的静态库与动态库的生成与使用, Windows直接用VS直接就能生成。

在项目中使用库一般有两个目的,一个是为了使程序更加简洁不需要在项目中维护太多的源文件,另一方面是为了源代码保密,毕竟不是所有人都想把自己编写的程序开源出来。

当我们拿到了库文件(动态库、静态库)之后要想使用还必须有这些库中提供的 API 函数的声明,也就是头文件,把这些都添加到项目中,就可以快乐的写代码了。

二,如何生成静态链接库

 在 Linux 中静态库由程序 ar 生成。

在 Linux 中静态库以 lib 作为前缀,以.a 作为后缀,中间是库的名字自己指定即可,即: libxxx.a
在 Windows 中静态库一般以 lib 作为前缀,以 lib 作为后缀,中间是库的名字需要自己指定,即: libxxx.lib

1.准备测试程序

加法计算源文件 add.c:

#include <stdio.h>
#include "head.h"int add(int a, int b)
{return a+b;
}

 减法计算源文件 sub.c:

#include <stdio.h>
#include "head.h"int subtract(int a, int b)
{return a-b;
}

乘法计算源文件 mult.c:

#include <stdio.h>
#include "head.h"int multiply(int a, int b)
{return a*b;
}

 除法计算的源文件 div.c

#include <stdio.h>
#include "head.h"double divide(int a, int b)
{return (double)a/b;
}

 头文件

#ifndef _HEAD_H
#define _HEAD_H
// 加法
int add(int a, int b);
// 减法
int subtract(int a, int b);
// 乘法
int multiply(int a, int b);
// 除法
double divide(int a, int b);
#endif

 测试程序

#include <stdio.h>
#include "head.h"int main()
{int a = 20;int b = 12;printf("a = %d, b = %d\n", a, b);printf("a + b = %d\n", add(a, b));printf("a - b = %d\n", subtract(a, b));printf("a * b = %d\n", multiply(a, b));printf("a / b = %f\n", divide(a, b));return 0;
}

 代码结构

三,如何使用静态链接库 

 1.生成静态链接库

生成静态库,需要先对源文件进行汇编操作 (使用参数 -c) 得到二进制格式的目标文件 (.o 格式), 然后在通过 ar 工具将目标文件打包就可以得到静态库文件了 (libxxx.a)。

使用 ar 工具创建静态库的时候需要三个参数:

参数c:创建一个库,不管库是否存在,都将创建。
参数s:创建目标文件索引,这在创建较大的库时能加快时间。
参数r:在库中插入模块 (替换)。默认新的成员添加在库的结尾处,如果模块名已经在库中存在,则替换同名的模块。

 # 1.:将源文件 add.c, div.c, mult.c, sub.c 进行汇编,得到二进制目标文件 add.o, div.o, mult.o, sub.o

# -I :重新指定要搜索的文件目录。
gcc -c add.c sub.c div.c muli.c -I ./include/

# 2. 将生成的目标文件 .o 打包成静态库 (采用gcc内部的ac进行生成静态链接库)

参数c:创建一个库,不管库是否存在,都将创建。
参数s:创建目标文件索引,这在创建较大的库时能加快时间。
参数r:在库中插入模块 (替换)。默认新的成员添加在库的结尾处,如果模块名已经在库中存在,则替换同名的模块。

ar rcs libCalc.a *.o

 

  2.使用静态链接库

 #3. 得到了一个可用的静态库之后,将其与相应的头文件放到一个目录中(就相当于发布了),然后根据得到的头文件编写测试代码,对静态库中的函数进行调用。

这里我把生成的静态库和相应的头文件放到temp文件夹中进行测试。
这里我们会用到gcc的两个参数

-l :在程序编译的时候,指定使用的库。(静态库的名字一定要掐头去尾。如:libCalc.a变为Calc)
-L :在程序编译的时候,指定使用的库的路径。
​​​​​​​

gcc main.c -o Calc -L ./ -l Calc

 

最后测试结果 

 完成啦。


http://chatgpt.dhexx.cn/article/9L19JRjw.shtml

相关文章

Linux 下libusb编译与生成动态链接库

一、前言 上一篇文章提到了怎样使用Ubuntu 安装libusb&#xff0c;忘了如何将如何编译。 二、libusb使用GCC 编译 正常来讲&#xff0c;使用 gccc xxx.c -o xxx -I/usr/include -lusb-1.0 就可以了&#xff0c;如下图&#xff1a; 但是&#xff0c;当使用Ubuntu 12.04 使用…

关于libusb开源库的使用

关于libusb开源库的使用 文章目录 关于libusb开源库的使用1. 概述1.1 介绍1.2 用法 2. API接口2.1 分类2.2 初始化/反初始化2.3 获取设备2.4 打开/关闭设备2.5 根据ID打开设备2.6 描述符相关函数2.6.1 获得设备描述符2.6.2 获得/释放配置描述符 2.7 detach/attach驱动2.7.1 两种…

【Linux】 自动化编译工具make

目录 一&#xff1a;make工具 二&#xff1a;Makefile 三&#xff1a;Makefile基本规则 四&#xff1a;make是如何工作的 五&#xff1a;示例(五个阶段的Makefile) 5.1 第一阶段Makefile 5.2 第二阶段Makefile 5.3 第三阶段Makefile 5.4 第四阶段Makefile 5.5 第五阶…

【Linux操作系统】动态库,静态库的制作和使用,软链接、硬链接简介

目录 软硬链接咋创建一个软链接&#xff1f;咋创建一个软链接&#xff1f; 文件的三个时间动静态库制作静态库静态库的使用制作动态库动态库的使用 秃头侠们好呀&#xff0c;今天来说 软硬连接&#xff0c;动静态库 软硬链接 咋创建一个软链接&#xff1f; ln -s log.txt log…

【Linux】零基础学习动静态库打包

文章目录 一、软硬链接二、动静态库理解动静态库静态库的打包使用静态库打包Makefile编写动态库的打包使用动态库打包Makefile编写对于小版本的理解 总结 一、软硬链接 站在先前的讲过的文件系统的角度来看&#xff0c;下图test这个文件有自己独立的inode&#xff0c;在他的ino…

Linux | 动静态库 | 动静态链接 | makefile库打包 | 第三方库使用

文章目录 何为动静态库库文件的链接静态链接静态库打包动态链接动态库打包 第三方库的使用静态库的使用动态库的使用 在系统层面上的动态链接理解 何为动静态库 静态库(.a)&#xff1a;在程序编译链接时将静态库二进制码拷贝到程序代码中&#xff0c;程序运行时不再需要外部的静…

覆盖libc.so.6的惨痛教训

覆盖libc.so.6的惨痛教训 背景问题原因解决1、当前session未断开2、OS崩溃重启&#xff0c;所有ssh session断开 惨痛教训1、对于上产环境的内核依赖库文件不能随意覆盖、删除。2、 scp 文件覆盖问题 总结参考 背景 发生时间: 2022年11月28日08:55:20 偷了个懒&#xff0c;在安…

【Linux】自动生成makefile(ubuntu)

文章目录 前言一、Automake工具二、具体步骤1.下载Automake2.autoscan3.重命名configure.scan为configure.ac4.修改重命名后的configure.ac5.执行aclocal命令6.autoheader7.autoconf8.创建Makefile.am9.automake10.执行configure11.执行make12.执行Makefile编译完生成的可执行文…

【Linux】基础IO —— 下(实现动静态库)

&#x1f387;Linux&#xff1a;基础IO 博客主页&#xff1a;一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 看似不起波澜的日复一日&#xff0c;一定会在某一天让你看…

【Linux】第九章 动态库和静态库(生成原理+生成和使用+动态链接)

&#x1f3c6;个人主页&#xff1a;企鹅不叫的博客 ​ &#x1f308;专栏 C语言初阶和进阶C项目Leetcode刷题初阶数据结构与算法C初阶和进阶《深入理解计算机操作系统》《高质量C/C编程》Linux ⭐️ 博主码云gitee链接&#xff1a;代码仓库地址 ⚡若有帮助可以【关注点赞收藏】…

Linux——自动化编译(make的使用)、库文件(静态库和共享库的使用)

一、make的使用&#xff08;自动化编译&#xff09; make是Linux上的工程管理工具&#xff0c;可以实现自动化编译&#xff1b;make可以提高我们的编译效率。 1.安装make 命令&#xff1a;sudo apt install make 2.make的用法 &#xff08;1&#xff09;创建makefile文件&am…

rpc系列-ZooKeeper

一.简介 Zookeeper是一个分布式协调服务&#xff0c;就是为用户的分布式应用程序提供协调服务。 Zookeeper本身就是一个分布式程序&#xff08;只要有半数以上节点存活&#xff0c;zk就能正常服务&#xff09;。 Zookeeper所提供的服务涵盖&#xff1a;主从协调、服务器节点…

HBase 一文读懂

本文基于《尚硅谷大数据技术之HBase》编写。 HBase 简介 HBase定义 HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库。 HBase数据模型 HBase的数据模型同关系型数据库&#xff08;RDMS&#xff09;很类似&#xff0c;数据存储在一张表中&#xff0c;有行有列。但从H…

Zookeeper学习

文章目录 今日目标apache zookeeperzookeeper的概念分布式和集群的理解zookeeper的集群架构和角色zookeeper的5大特性部署zookeeper集群环境计算机集群的安装部署三台节点&#xff08;克隆两台&#xff09;配置节点内存和CPUzookeeper安装 zookeeper的数据模型zookeeper的节点类…

Redission和Zookeeper分别实现分布式锁

Redission和Zookeeper分别实现分布式锁&#xff08;windows&#xff09; 1、Redission实现分布式事务 1.1 前提准备 下载好nginx&#xff08;windows版本&#xff09;下载好Jmeter&#xff08;模仿高并发&#xff09;下载好redis&#xff08;windows版&#xff09; 1.2 代码…

Zookeeper 客户端之基本操作指令

ZooKeeper命令行工具类似于Linux的shell环境&#xff0c;不过功能肯定不及shell啦&#xff0c;但是使用它我们可以简单的对ZooKeeper进行访问&#xff0c;数据创建&#xff0c;数据修改等操作. 命令行工具的一些简单操作如下&#xff1a; zkCli.sh客户端连接命令 ls 与 ls2 命…

kafka内置zookeeper启动失败报错INFO ZooKeeper audit is disabled. (org.apache.zookeeper.audit.ZKAuditProvider)

kafka内置zookeeper启动失败报错INFO ZooKeeper audit is disabled.(org.apache.zookeeper.audit.ZKAuditProvider)2022年新版win10安装kafka 安装配置kafka&#xff0c;在启动zookeeper时报错ZooKeeper audit is disabled 原因分析&#xff1a; 寻找资料发现是zookeeper设置参…

zookeeper日志及快照清理操作

事务日志可视化转换 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #!/bin/sh # scriptname: zkLog2txt.sh # zookeeper事务日志为二进制格式&#xff0c;使用LogFormatter方法转换为可阅读的日志 if [ -z "$1" -o "$1" "-h&quo…

【RPC】注册中心实现方案之ZooKeeper

文章目录 ZooKeeper一致性协议&#xff1a;ZAB ZooKeeper ZooKeeper是一个开源的分布式协调服务&#xff0c;它可以用来协调和同步多服务器之间的状态。 ZooKeeper 可以作为微服务架构中注册中心的选型&#xff0c;它最需要被关心的也是数据模型和一致性协议。数据模型关乎服…

Linux 搭建zookpeer集群和配置

zookpeer和JDK1.8下载地址 下载地址&#xff1a;zookpeer和jdk1.8 提取码&#xff1a;w189 解压以及配置zookpeer tar -zxvf zookeeper-3.4.6.tar.gz tar -zxvf jdk-8u144-linux-x64.tar.gz 基本参数配置 参数描述clientPort主要定义客户端连接zookeeper server的端口&…