基于linux的程序库文件打包和调用的实现(一)——静态库文件打包和调用

news2024/11/28 22:32:40

        随着技术的发展,基于linux项目的软件代码越发复杂,原来一个人可以完成的软件项目,现在可能需要多个人合作、多个部门合作、多个企业合作,每个人、每个部门、每个企业可能负责部分软件模块的开发。各个软件模块在调试过程由于涉及企业知识产权、源代码防止修改、安全性等多方面考虑,技术人员会将自己完成的软件生成库文件(含库文件和头文件(.h文件))、接口使用说明供其他模块调用,本文将从通过一个应用程序的例子,介绍linux环境下应用软件库文件的打包和调用过程。

(一)应用软件设计

1.设计一个获取系统时间和设置系统时间功能的软件,获取的时间转换为便于理解的bcd码格式,该软件由systime.c的源文件和systime.h的头文件两部分组成。

systime.c源码如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <sys/time.h>
#include "systime.h"

/******************************************************************************
*FUNCATION NAME  :	Uint8 dec_to_bcd(Uint8 dec)
*CREATE DATE     :	2023-05-31
*CREATE BY       :	LSL
*FUNCTION        :	十进制转bcd码
*MODIFY DATE     :
*INPUT           :
*OUTPUT          :
*RETURN          :
*OTHERS          :
******************************************************************************/
unsigned char dec_to_bcd(unsigned char dec)
{
	unsigned char temp;
	temp=(dec/10)*16+(dec%10);
	return(temp);
}
/******************************************************************************
*FUNCATION NAME  :	Uint8 bcd_to_dec(Uint8 bcd)
*CREATE DATE     :	2023-05-31
*CREATE BY       :	LSL
*FUNCTION        :	bcd转10进制
*MODIFY DATE     :
*INPUT           :
*OUTPUT          :
*RETURN          :
*OTHERS          :
******************************************************************************/
unsigned char bcd_to_dec(unsigned char bcd)
{
	unsigned char temp;
	temp=(bcd/16)*10+(bcd%16);
	return(temp);
}


/******************************************************************************
*FUNCATION NAME  :	void get_systimer(systimer_t *systimerstruct)
*CREATE DATE     :	2023-05-31
*CREATE BY       :	LSL
*FUNCTION        :	从系统获取时间函数(含年月日时分秒)
*MODIFY DATE     :
*INPUT           :
*OUTPUT          :
*RETURN          :
*OTHERS          :
******************************************************************************/
void get_Systimer(systimer_t *systimerstruct)
{
	unsigned char	date;		//日
	unsigned char	month;		//月
	unsigned int	year;		//年
	
	unsigned char	second;		//秒
	unsigned char	minute;		//分
	unsigned char	hour;		//时
	
	time_t current_time;
	struct tm *now_time;

	time(&current_time);//获得本地时间
	now_time = localtime(&current_time);//转换为tm格式的时间

	year=(now_time->tm_year + 1900);//获得年

	month= (now_time->tm_mon + 1);//获得月

	date=(now_time->tm_mday);//获得天

	hour=(now_time->tm_hour);//获得小时

	minute=(now_time->tm_min);//获得分钟

	second=(now_time->tm_sec);//获得秒

//	printf("the year is %d,the mon is %d,the day is %d,the hour is %d,the min is %d,the sec is %d,the dst is %d!\n",year,month,date,hour,minute,second,(now_time->tm_isdst));

	systimerstruct->uniondate_t.structdate.res1 =dec_to_bcd(year/100);	//BCD转换,获得年 高16位
	systimerstruct->uniondate_t.structdate.year=dec_to_bcd(year%100);	//BCD转换,获得年 低16位
	systimerstruct->uniondate_t.structdate.month=dec_to_bcd(month);	//BCD转换,获得月
	systimerstruct->uniondate_t.structdate.date=dec_to_bcd(date);		//BCD转换,获得天

	systimerstruct->uniontime_t.structtime.res1=dec_to_bcd(0);		//BCD转换
	systimerstruct->uniontime_t.structtime.hour=dec_to_bcd(hour);		//BCD转换,获得小时
	systimerstruct->uniontime_t.structtime.minute=dec_to_bcd(minute);	//BCD转换,获得分
	systimerstruct->uniontime_t.structtime.second=dec_to_bcd(second);	//BCD转换,获得秒
	
}


/******************************************************************************
*FUNCATION NAME  :	void set_systimer(systimer_t *systimerstruct)
*CREATE DATE     :	2023-05-31
*CREATE BY       :	LSL
*FUNCTION        :	向系统写入时间函数(含年月日时分秒)
*MODIFY DATE     :
*INPUT           :
*OUTPUT          :
*RETURN          :
*OTHERS          :
******************************************************************************/
void set_Systimer(systimer_t *systimerstruct)
{
	int ret = 0;

	unsigned char	date;		//日
	unsigned char	month;		//月
	unsigned int	year;		//年
	
	unsigned char	second;		//秒
	unsigned char	minute;		//分
	unsigned char	hour;		//时

	time_t current_time;
	struct tm now_time;
	struct timeval time_tv;

	year=bcd_to_dec(systimerstruct->uniondate_t.structdate.res1)*100;
	year+=bcd_to_dec(systimerstruct->uniondate_t.structdate.year);		//年

	month=bcd_to_dec(systimerstruct->uniondate_t.structdate.month);		//月

	date=bcd_to_dec(systimerstruct->uniondate_t.structdate.date);		//日

	hour=bcd_to_dec(systimerstruct->uniontime_t.structtime.hour);		//时

	minute=bcd_to_dec(systimerstruct->uniontime_t.structtime.minute);	//分

	second=bcd_to_dec(systimerstruct->uniontime_t.structtime.second);	//秒

	now_time.tm_year = (year - 1900);	//年

	now_time.tm_mon = (month - 1);		//月

	now_time.tm_mday = (date);			//天

	now_time.tm_hour = hour;			//时

	now_time.tm_min = minute;			//分

	now_time.tm_sec = second;			//秒

	//now_time.tm_isdst = 0;				//dst时区

	current_time = mktime(&now_time);	//完成时间转换
	
	time_tv.tv_sec = current_time;
	time_tv.tv_usec = 0;

	ret = settimeofday(&time_tv, NULL);		//将时间写给系统
	if(ret != 0)
	{
		printf("settimeofday failed\n"); 
	}
}

systime.h源码如下所示:

#ifndef SRC_SYSTIME_H_
#define SRC_SYSTIME_H_

#pragma pack(1)
typedef struct	systimer
{
	union
	{
		
		struct
		{
			unsigned char	date;		//日
			unsigned char	month;		//月
			unsigned char	year;		//年
			unsigned char	res1;		//年的高16位
		}structdate;
		unsigned	int		day;	//日期
	}uniondate_t;
	union
	{
		
		struct
		{
			unsigned char	second;		//秒
			unsigned char	minute;		//分
			unsigned char	hour;		//时
			unsigned char	res1;		//预留
		}structtime;
		unsigned	int		time;	//时间
	}uniontime_t;
}systimer_t;
#pragma pack(push)

void get_Systimer(systimer_t *systimerstruct);//获得系统时间
void set_Systimer(systimer_t *systimerstruct);//设置系统时间

#endif

2.其中源文件systime.c实现获取、设置系统时间,并转换systime.h定义的系统时间格式。

(二)静态库打包

1.新建static_lib的文件夹,并将上述systime.c和systime.h两个文件拷贝到static_lib目录,如下所示:

图1 新建静态库目录

 

2.为了提高编译打包方法的移植性,在静态库目录中新建Makefile文件,内容如下所示:

图2 新建Makefile文件

 

3.运行make指令,生成libapp_systimer.a的静态库文件,如下图所示。

图3 生成软件的静态库文件libapp_systimer.a

 

4.以上生成的libapp_systimer.a文件和systim.h文件,供后续静态库调用。

(三)静态库调用测试

1.新建测试目录static_test,并在static_test目录下新建libsystime的子文件夹,并拷贝上节生成的静态库文件libapp_systimer.a和头文件systime.h到静态库测试目录的系统时间库子目录static_test/libsystime。具体流程如下所示:

图4 新建测试目录,并拷贝库文件到库文件目录

 

2.在测试目录static_test中,新建测试程序main.c,获取系统时间,并打印输出:

图5 引用头文件,获得时间,并打印输出

 

3.新建Makefile文件,注意:包含头文件和lib库的路径,如下图所示:

图6 Makefile文件内容

 

4.新建编译脚本build.sh,编译脚本内容如下所示:

图7 新建编译脚本

 

5.给编译脚本添加可执行权限,并运行编译脚本,编译生成测试软件的可执行程序myapp,如下图所示:

图8 编译生成可执行程序

 

6.运行可执行程序,获得当前时间,如下图所示,说明静态库的调用成功。

图9 测试程序调用静态库成功

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/597646.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DeFi 发展沃土,Uniswap 成功“登陆” Moonbeam

作者&#xff1a;OneBlock 去年 3 月底&#xff0c;Uniswap 社区发布一项全新治理提案&#xff0c;旨在通过社区授权于 Polkadot 生态智能合约平台 Moonbeam 上部署 Uniswap V3&#xff0c;将 Uniswap 扩展至 Polkadot 生态。在这项提案中&#xff0c;Uniswap 计划除了提供流动…

极兔抢滩IPO,李杰不止缺一个丰网

&#xff08;图片来源于网络&#xff0c;侵删&#xff09; 来源 | 螳螂观察 文 | 叶小安 物流业打响了上市“抢滩战”。 5月&#xff0c;顺丰控股传出2023年在香港二次上市消息&#xff1b;紧接着极兔也传出将于下半年赴港上市消息&#xff1b;另一边&#xff0c;阿里主席张…

最新自助建站系统源码 一键建站系统源码 含700+精美网站模板和搭建教程

分享一款最新自助建站系统源码&#xff0c;一键建站系统源码&#xff0c;傻瓜式一键建站含700精美网站模板&#xff0c;网站全是自适应响应式&#xff0c;含完整代码程序包和详细搭建教程。 系统模板页面图&#xff1a; 系统功能特色一览&#xff1a; 1、一次性打包&#xff0…

chatgpt接口返回参数分析

接口请求使用二进制请求&#xff0c;数据流式返回&#xff0c;即分块&#xff08;分批次&#xff09;返回。 问题&#xff1a;一周有几天 请求头 参数详解 参数名称 说明 role 消息发送者的角色&#xff0c;这里为 "assistant"。 id 消息的唯一标识符。 pare…

图的基本概念和存储

基本概念 基本概念 图的定义&#xff1a;图&#xff08;Graph&#xff09;一般由两个集合共同构成&#xff0c;一个是非空但是有限的顶点集合V&#xff08;Vertex&#xff09;&#xff0c;另一个是描述顶点之间连接关系的边集合E&#xff08;Edge)&#xff0c;边集合可以为…

4.信息安全之数据恢复

1.数据容灾数据备份 RPO(recovery point object)数据恢复点目标 数据丢掉多少可接受 RTO(recovery time object)数据恢复时间目标 恢复数据需要多少时间 2.系统灾难原因 1.硬件 2.人为 3.软件 4.病毒 5.自然灾害 3.容灾级别 数据级别(数据出错)<应用(某个功能不能使用)<业…

运维小白必学篇之基础篇第二集:文件系统结构和目录管理

文件系统结构和目录管理实验 实验者&#xff1a;胡 阳 目录 一、将虚拟机主机名改为自己的名字 二、完成以下操作&#xff1a; 一、将虚拟机主机名改为自己的名字 例如&#xff1a;hostname liangyuntong 关闭该终端后&#xff0c;重新打开即可 二、完成以下操作&#…

【AIGC】CPM-BEE 开源大模型介绍、部署以及创建接口服务

终于! 中文基座模型CPM-Bee开源了 # CPM-Bee 百亿参数的开源中英文双语基座大模型 ✨ 模型介绍 CPM-Bee是一个完全开源、允许商用的百亿参数中英文基座模型&#xff0c;也是CPM-Live训练的第二个里程碑。它采用Transformer自回归架构&#xff08;auto-regressive&#xff0…

直播预告丨SaaS+CG?UE影视级场景渲染与科学制片全流程揭秘!

余热不减&#xff01;在第二届瑞云3D渲染动画创作大赛赛果公布 后&#xff0c;小瑞紧锣密鼓在安排获奖选手的系列专场直播。在上期的“ 泛CG 聚未来 ” 第四届实用技术线上分享会中,咱们邀请到大赛专业组冠亚军“3ds Max老法师”彼尔德和“Maya大神”Shuiguo 分享了自己的创作历…

cplex基础入门(一)

这边文章会以纯新手小白的视角&#xff0c;教会大家如何快速的搭建自己的cplex模型&#xff0c;做到求解模型不求人。 目录 一、引言 1、掌握数据类型及数据结构 2、常规Cplex编程方法 3、Cplex编程步骤 4、cplex 程序框架 5、创建模型 二、规划建模的入门求解案例 1、…

代码随想录训练营Day57| 647. 回文子串 516.最长回文子序列 动态规划总结篇

目录 学习目标 学习内容 647. 回文子串 516.最长回文子序列 学习目标 647. 回文子串 516.最长回文子序列 动态规划总结篇 学习内容 647. 回文子串 647. 回文子串 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/palindromic-substrings/ class S…

3.部署 Stable Diffusion(SD)

部署Stable Diffusion webui方式: 本地部署:在自己的电脑上安装(官方脚本部署、懒人包部署(文末自取)) 云端部署:在远程服务上运行(免费有时长限制、可付费租用GPU) 两种部署方式哪种都可以,看需选择。如果有性能比较不错的的显卡,那么可以考虑本地部署。如果是没…

java养老院老年人档案管理系统springboot+vue

本居家养老系统管理员和工作人员两个角色。管理员功能有个人中心&#xff0c;老人账号管理&#xff0c;工作人员管理&#xff0c;老人档案管理&#xff0c;订单申请管理&#xff0c;检查检验项目管理&#xff0c;维修服务管理&#xff0c;订单信息管理&#xff0c;转诊信息管理…

一文简述低代码到底是什么?

在进入正文之前&#xff0c;有必要给大家拨正一个误区&#xff1a; “开发≠写代码” 由于现在低代码&零代码产品在宣传过程中着重强调“公民开发”这一概念&#xff0c;我们随便点开一篇相关文章章&#xff0c;必定会有一句&#xff1a;“人人都是开发者&#xff0c;无需…

计算机中丢失MSVCP140.dll无法启动此程序怎么办

MSVCP140.dll是Microsoft Visual C Redistributable文件中的一个动态链接库文件&#xff0c;它是Microsoft Visual Studio 2015和2017中的一部分。它包含一组选项卡&#xff0c;其中包含C/C开发所需的库。该文件通常位于计算机的Windows/System32目录中&#xff0c;它提供了用于…

Vue2——入门(适合后端程序员看)

Vue组件 Vue 的组件文件以 .vue 结尾&#xff0c;每个组件由三部分组成 <template></template><script></script><style></style> template 模板部分&#xff0c;由它生成 html 代码 script 代码部分&#xff0c;控制模板的数据来源和行…

30天从入门到精通TensorFlow1.x 第二天,变量 tf.Variable()

文章目录 一&#xff0c;接前一天&#xff08;1&#xff09;.内容前先弄清楚 sess.run() 函数a. 该函数干嘛的b. 该函数有哪些参数c. 该函数的使用 &#xff08;2&#xff09;.由库函数创建张量&#xff08;3&#xff09;.由库函数创建张量 二、变量tf.Variable()&#xff08;1…

git在一台电脑上配置不同的仓库(多个gitee仓库、或者不同的github仓库)

前言 在开发过程中&#xff0c;我们工作的时候难免会使用到两个不同的仓库&#xff0c;但是正常来说一电脑默认一个参考&#xff0c;直接会用全局命令 git config --global user.name "yourName"但是这样只能配置一个仓库了&#xff0c;本文介绍在一台电脑上配置多…

跟着LearnOpenGL学习5--纹理

文章目录 一、前言二、纹理映射三、纹理环绕方式四、纹理过滤五、多级渐远纹理六、加载与创建纹理七、生成纹理八、应用纹理九、完整代码9.1、工程结构9.2、纹理图片9.3、stb_image.cpp9.4、顶点着色器9.5、片段着色器9.6、main.cpp 十、纹理颜色与顶点颜色混合十一、纹理单元 …

Python系列模块之pymysql操作MySQL 数据库

目录 一、安装pymysql 二、连接数据库 三、数据库操作 3.1 查询 3.2 更新 3.3 使用循环批量更新 Python 系列文章学习记录&#xff1a; Python系列之Windows环境安装配置_开着拖拉机回家的博客-CSDN博客 Python系列之变量和运算符_开着拖拉机回家的博客-CSDN博客 Pyt…