静态库的制作
静态库是一组对象文件的集合,它们在编译时被链接到可执行文件中。这意味着,静态库中的代码会被复制到每个使用它的程序中,因此静态库不需要在程序运行时被单独加载。制作静态库可以帮助你将常用的代码模块化、重用,简化开发过程。
以下是创建静态库的详细步骤:
步骤1:编写源代码
首先,创建几个C/C++源文件,它们将组成静态库。例如,创建两个c文件math_functions.c和string_functions.c,并为其编写相应的功能。
math_functions.c(数学函数)
#include <math_functions.h>int add(int a, int b) {return a + b;
}int subtract(int a, int b){return a - b;
}
math_functions.h (数学函数头文件)
#ifndef MATH_FUNCTIONS_H
#define MATH_FUNCTIONS_Hint add(int a, int b);
int subtract(int a, int b);#endif
string_functions.c (字符串处理函数)
#include "string_functions.h"
#include <string.h>int string_length(const char* str) {return strlen(str);
}int string_compare(const char* str1, const char* str2) {return strcmp(str1, str2);
}
string_functions.h (字符串处理函数头文件)
#ifndef STRING_FUNCTIONS_H
#define STRING_FUNCTIONS_Hint string_length(const char* str);int string_compare(const char* str1, const char* str2);#endif
步骤2:编译源文件
将每个.c源文件编译为.o对象文件。这些对象将被包含在静态库中。你可以使用gcc或g++编译器完成此步骤。
gcc -c math_functions.c -o math_functions.o
gcc -c string_functions.c -o string_functions.o
解释:
-c表示编译源文件但不链接,生成.o对象文件。-o指定输出文件的名称。
现在你应该有两个对象文件:math_functions.o 和 string_functions.o。
步骤3:创建静态库
接下来,使用ar(archive utility)工具将这些.o文件打包成一个静态库。静态库的扩展名通常是.a。
ar rcs libmylibrary.a math_functions.o string_functions.o
解释:
ar是创建静态库的工具。r表示插入文件到库(如果库不存在则创建)。c表示创建库。s表示索引库,创建符号表,使得在链接时可以快速找到库中的符号。libmylibrary.a是创建的静态库的名称,通常库名以lib开头。- 后面的
.o文件是要打包进库中的对象文件。
运行完这个命令后,当前目录下会生成一个名为 libmylibrary.a 的静态库。
步骤4:使用静态库
接下来,演示如何使用这个静态库。首先,编写一个C程序来调用库中的函数。
main.c(测试程序)
#include "math_functions.h"
#include "string_functions.h"
#include <stdio.h>int main() {int a = 10, b = 5;printf("Add: %d\n", add(a, b));printf("Subtract: %d\n", subtract(a, b));const char* str1 = "Hello";const char* str2 = "World";printf("Length of str1: %d\n", string_length(str1));printf("Comparison of str1 and str2: %d\n", string_compare(str1, str2));return 0;
}
步骤5:链接静态库
要使用你创建的静态库,编译和链接你的测试程序时,必须指定库的路径和名称。
gcc main.c -L. -lmylibrary -o myprogram
解释:
-L.指定库的搜索路径为当前目录(.表示当前目录)。-lmylibrary告诉链接器使用libmylibrary.a静态库(省略lib和.a后缀)。-o myprogram指定输出的可执行文件名为myprogram。
编译成功后,myprogram 会是可执行文件,运行它将会输出结果:
./myprogram
输出可能如下:
Add: 15
Subtract: 5
Length of str1: 5
Comparison of str1 and str2: -1
步骤 6: 查看静态库内容
你可以使用 ar 工具查看静态库的内容,看看其中包含了哪些对象文件:
ar t libmylibrary.a
输出可能为:
math_functions.o
string_functions.o
静态库的特点
- 静态链接:在编译时,静态库中的代码会被复制到目标程序中,程序不依赖外部库运行。
- 独立性:使用静态库的可执行程序在运行时不需要静态库文件的存在,因为代码已经被嵌入到可执行文件中。
- 性能:由于代码在编译时被直接链接到程序,运行时不需要动态加载库,因此静态库可能比动态库运行时略快。
- 缺点:可执行文件会变得更大,因为每个使用库的程序都包含了库的副本。而且,如果库有更新,所有依赖该库的程序都需要重新编译。
相关文章:
静态库的制作
静态库是一组对象文件的集合,它们在编译时被链接到可执行文件中。这意味着,静态库中的代码会被复制到每个使用它的程序中,因此静态库不需要在程序运行时被单独加载。制作静态库可以帮助你将常用的代码模块化、重用,简化开发过程。…...
PHP在现代Web开发中的高效应用与最佳实践
PHP在现代Web开发中的高效应用与最佳实践 在快速迭代的Web开发领域,PHP作为一门历史悠久且广泛应用的服务器端脚本语言,始终保持着其独特的魅力和强大的生命力。从简单的动态网页到复杂的企业级应用,PHP凭借其易学性、丰富的库支持和广泛的社…...
大数据-134 - ClickHouse 集群三节点 安装配置启动
点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...
2024网络安全人才实战能力白皮书安全测试评估篇
9月10日,国内首个聚焦“安全测试评估”的白皮书——《网络安全人才实战能力白皮书-安全测试评估篇》(以下简称“白皮书”)在国家网络安全宣传周正式发布。 作为《网络安全人才实战能力白皮书》的第三篇章,本次白皮书聚焦“安全测…...
[项目][WebServer][解析错误处理]详细讲解
可为每种情况都确实对应一个状态码,当发生错误时,跳转到对应的html页面即可但是为了代码的复用性,可以将所有的错误情况都归置处理 #define SEP ": " #define LINE_END "\r\n" #define WEB_ROOT "wwwroot" #…...
51单片机应用开发---数码管的控制应用
实现目标 1、掌握数码管结构、驱动原理; 2、 一、什么是数码管? 1.数码管定义 数码管,也称为LED数码管,基本单元是发光二极管(LED)。分为七段数码管和八段数码管(多一个小数点DP)。数码管在我们生活中无处不在,比如…...
Vue3+Django5+REST Framework开发电脑管理系统
前端:Vue3TypeScript 后端:Django5REST Framework 功能介绍 用户管理角色管理菜单管理配件管理仓库管理类型管理电脑管理入库管理出库管理库存管理收发明细管理 界面预览 源码地址:managesystem: 电脑管理系统...
Java8函数式接口全攻略
一、接口大白话 1.四大基础接口 Consumer<T> 核心方法:void accept(T t);消费者。接受一个输入参数,不返回任何结果的操作。望文生义:你给我啥,我就执行啥,没有结果。 Supplier<T> 核心方法: T get();供…...
英文软件汉化中文软件教程asi exe dll 等汉化教程
相信大家在使用国际软件的时候,会经常碰到英文类型的软件 或者玩一些游戏使用一些工具,也基本都是外网的,那么对于用户来讲 就会非常的不方便! 小编为大家整理了一些国内大佬出的的英文软件汉化中文软件的视频教程 教程分为EX…...
HTTP 请求方式`application/x-www-form-urlencoded` 与 `application/json` 怎么用?有什么区别?
HTTP 请求方式总结:application/x-www-form-urlencoded 与 application/json 在前后端交互中,客户端发送数据到服务器的常见方式有两种:application/x-www-form-urlencoded 和 application/json。本文将详细介绍这两种请求方式的特点、使用方…...
prometheus 集成 grafana 保姆级别安装部署
前言 本文 grafana 展示效果只需要 prometheus node_exporter grafana 其他的选择安装 环境和版本号 系统: CentOS 7.9 prometheus: 2.54.1 pushgateway: 1.9.0 node_exporter: 1.8.2 alertmanager: 0.27.0 grafana:11.2.0 官网:https://prometheus.io/ 下载地址:h…...
Apache SeaTunnel Committer 进阶指南
Apache SeaTunnel 作为一个开源的数据集成工具,旨在简化和加速海量数据的采集和传输。 社区的 Committer 是指拥有项目存储库的写权限的社区成员,即 Committer 可以自行修改代码、文档和网站,也可以合并其他成员的贡献。成为 Apache SeaTunn…...
组件上的v-model(数据传递),props验证,自定义事件,计算属性
一.props验证 在封装组件时对外界传递过来的props数据进行合法性校验,从而防止数据不合法问题。 1.基础类型检查 String,Number,Boolean,Array,Object,Date,Function,Symbol 2.多个可能的类型 3.必须项校验 4.属性默认值 5.自定义验证函数 <template>&…...
mfc140u.dll文件错误的相关修复方法,4种方法修复mfc140u.dll
当面对基于Microsoft Visual C开发的应用程序出现启动或运行失败时,mfc140u.dll文件错误往往是罪魁祸首之一。这个动态链接库(DLL)文件对于许多Windows软件来说是必不可少的,因为它包含了重要的编程代码和数据。如果发现此文件损坏…...
Redis中使用布隆过滤器解决缓存穿透问题
一、缓存穿透(失效)问题 缓存穿透是指查询一个一定不存在的数据,由于缓存中没有命中,会去数据库中查询,而数据库中也没有该数据,并且每次查询都不会命中缓存,从而每次请求都直接打到了数据库上,这会给数据…...
css百分比布局中height:100%不起作用
百分比布局时,我们有时候会遇到给高度 height 设置百分比后无效的情况,而宽度设置百分比却是正常的。 当为一个元素的高度设定为百分比高度时,是相对于父元素的高度来计算的。当没有给父元素设置高度(height)时或设置…...
java程序员入行科目一之CRUD轻松入门教程(二)
封装工具类 封装获取连接&释放资源操作 在实际使用JDBC的时候,很多操作都是固定的,没有必要每次都去注册驱动,获取链接对象等等。 同样,释放资源的close操作也可以封装一下 下面是封装好的具体工具类 package com.jimihua.u…...
(不用互三)解密AI创作:提升Prompt提示词的提问技巧
文章目录 🍊AI创作的核心:提示词 Prompt 的重要性1. 什么是提示词工程?1.1 提示词的工作原理1.2 高薪提示词工程师的现实1.3 谁能胜任提示词工程师? 2. 提示词编写技巧3. 常见的提示词框架3.1 CO-STAR 框架3.2 BORKE 框架 4. 提示…...
Python 错误 ValueError 解析,实际错误实例详解 (二)
文章目录 前言Python 中错误 ValueError: Not Enough Values to UnpackPython 中的 ValueError 是什么修复Python字典中 ValueError:ValueError: not enough values to unpack修复Python中 ValueError:not enough values to unpackPython 中错误 ValueError: Setting an Arra…...
会员计次卡渲染技术-—SAAS本地化及未来之窗行业应用跨平台架构
一、计次卡应用 1. 健身中心:会员购买一定次数的健身课程或使用健身房设施的权限。 2. 美容美发店:提供一定次数的理发、美容护理等服务。 3. 洗车店:车主购买若干次的洗车服务。 4. 儿童游乐场:家长为孩子购买固定次数的入场游…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
