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

news2024/12/23 8:43:41

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

(一)应用软件设计

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

具体c源码文件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.新建share_lib的文件夹,并将上述systime.c和systime.h两个文件拷贝到share_lib目录,如下所示:

图1 拷贝源码到动态库目录

 

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

图2 新建Makefile文件

 

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

图3 生成软件的动态库文件libapp_systimer.so

 

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

(三)动态库调用

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

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

 

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

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

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

图6 Makefile文件内容

 

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

图7 新建编译脚本

 

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

图8 编译生成可执行程序

6.export动态库的目录,保证运行可执行程序能够找到动态库,获得当前时间,如下图所示,说明动态库的调用成功。

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

 

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

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

相关文章

测试思想-集成测试 关于接口测试 Part 2

5. 用例设计思想(举例说明) 如上表&#xff0c;是某个接口说明文档中的一个接口&#xff0c;课程检索&#xff0c;其中“v1/Lesson/testsrch/?” 为接口调用地址&#xff0c;此外&#xff0c;还给出了接口函数输出(即Server Response)及返回值。 问&#xff1a;怎么设计&…

如何免费在线把Figma转成Sketch

我相信所有的设计师都非常熟悉新的设计工具。Figma以其在线合作的特点受到设计师的欢迎。然而&#xff0c;对于设计师来说&#xff0c;在实际工作中&#xff0c;有时需要使用Sketch编辑Figma文件。 今天推荐一款Figma转换Sketch文件格式的免费工具。 下面具体介绍如何通过即时…

chatgpt赋能python:Python内置函数表

Python内置函数表 Python是一种高级编程语言&#xff0c;具有许多内置函数&#xff0c;可用于各种用途&#xff0c;例如处理字符串、操作文件、执行数学计算等等。在本文中&#xff0c;我们将介绍Python内置函数表并讨论其中的一些常见用途。 什么是Python内置函数&#xff1…

JavaFX 树视图TreeView

JavaFX 树视图TreeView 1、TreeView基础查看2、显示案例 1、TreeView基础查看 javafx.scene.control.TreeView<T> javafx.scene.control.TreeItem<T> w3cschool&#xff1a;JavaFX 树视图 DOC-03-14 树视图(Tree View) JavaFX视频教程第101课&#xff0c;TreeView…

List 的使用

1. List 列表视图实现增删改操作 /// 列表视图 struct ListBootcamp: View {/// 水果State var fruits: [String] ["apple", "orange", "banana", "peach"]/// 蔬菜State var veggies: [String] ["tomato", "potato…

【笔试强训编程题】Day4.(计算糖果 46579 ) 和(进制转换 58541)

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训编程题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目录…

如何在Moonbeam DAPP质押GLMR

Moonbeam自上线以来一直稳步成长&#xff0c;并致力于为以太坊生态的项目提供一个进入波卡生态的入口。Moonbeam的官方质押Dapp于今年3月迎来一次大改版&#xff0c;旨在为用户提供更直观的质押操作体验。了解升级版Dapp详情&#xff0c;请阅读此文章。 当然大家最关心也是如何…

JavaEE 简单前后端分离小项目 - 表白墙

plus版表白墙&#xff01;✿✿ヽ(▽)ノ✿ 文章目录 JavaEE & 简单前后端分离小项目 - 表白墙1. body格式约定 - 应用层协议2. 后端处理请求2.1 模板2.2 doGet方法2.3 doPost方法 3. 前端制作请求并解析响应3.1 原前端页面的代码3.2 刷新时发送GET请求3.3 点击发送时构造Pos…

Photoshop 2023 v24.5/24.6beta版「支持M1、支持神经滤镜、FireflyAI 新功能」

24.6beta试用FireflyAI 新功能&#xff0c;需要外网ID, 并且要先试用&#xff0c;后激活 psv24.5支持神经滤镜&#xff0c;激活前需要登录Adobe账号试用&#xff0c;退出后再去运行激活补丁&#xff01; Photoshop 2023 v24.5/24.6beta版「支持M1、支持神经滤镜、FireflyAI 新…

【开源项目】ChatGPT智能聊天系统后台管理解析

ChatGPT是likeshop近期新研发出来的一款AI智能聊天对话的产品&#xff0c;此系统是基于likeadmin-PHP开发的智能对话系统&#xff0c;ChatGPT是一种基于人工智能技术的聊天机器人&#xff0c;它可以与用户进行自然语言对话&#xff0c;提供各种服务和答案。ChatGPT的核心技术是…

海绵城市智慧监测系统功能、适用范围有哪些?

一、海绵城市在线监测系统拓扑图 海绵城市在线监测系统是通过RTU使用3G/4G信号进行无线传输等方式&#xff0c;将温度、水位、风速、风向、雨量、色度、浊度等数据传输到在线监测平台。经过软件平台的系统性处理后再通过LED显示屏直观、快捷的展现给用户。用户也可以通过电脑、…

【Unity Optimize】Unity中的优化工具和优化方法介绍

目录 1 Unity项目优化的必要性2 Unity自带的优化工具2.1 Profiler窗口Profile Analyzer 2.2 Stats窗口2.3 Frame Debugger窗口 3 其他优化方法3.1 批处理&#xff08;Batching&#xff09;3.2 内存管理&#xff08;Memory Handling&#xff09;3.3 对象池&#xff08;Object Po…

linux部署mysql服务

记录阿里云服务器linux上部署mysql服务。 文章目录 1. 下载rpm包2. 上传解压rpm包3. 安装rpm包4. 启动mysql服务5. 修改root的密码6. 创建远程连接用户7. 检查防火墙8. 阿里云安全组开放3306端口9. 远程连接10. 停止数据库服务 1. 下载rpm包 mysql下载rpm包&#xff0c;链接&…

性能测试如何入门?熬夜7天整理出这一份3000字超全学习指南

赶鸭子上架要我搞性能测试&#xff0c;怎么办&#xff1f; 我第一次真正意义上搞性能测试是在2014年。项目组要求搞性能测试&#xff0c;我之前也没搞过&#xff0c;对服务端也不熟悉。就那么一脸懵逼地开始搞性能。当时我连linux上有哪些能看系统资源的命令都不知道。稀里糊涂…

是否应该学习Qt作为主要编程语言C/C++的补充?

如果您以C/C作为主要编程语言&#xff0c;学习Qt是一个不错的选择。主要还是学习Qt的思想。 在初期阶段&#xff0c;您可以学习如何使用Qt设计界面。您可以使用Qt Designer拖拽控件&#xff0c;这样做比较直观。当然&#xff0c;您也可以手写代码实现界面。 Qt目前主要提供了…

第十八篇、基于Arduino uno,获取手势识别传感器的信号——结果导向

0、结果 说明&#xff1a;该传感器模块集手势识别和触摸检测功能于一体&#xff0c;提供0~30cm以内的可调检测范围。它可以检测 5 向触摸信号和 7 种手势&#xff1a;向左移动、向右移动、向前移动、向后移动、向上拉、向下拉、拉和移除。 1、外观 说明&#xff1a;虽然手势…

Web安全:拿到 Web 服务器 最高权限.(vulntarget 靶场 1)

Web安全&#xff1a;拿到 Web 服务器 最高权限. Web 服务器一般指网站服务器&#xff0c;是指驻留于因特网上某种类型计算机的程序&#xff0c;可以处理浏览器等Web客户端的请求并返回相应响应&#xff0c;也可以放置网站文件&#xff0c;让全世界浏览&#xff1b;可以放置数据…

软考A计划-网络规划设计师-学习笔记-下

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

从零开始Vue3+Element Plus后台管理系统(18)——权限路由实现

一开始打算做两种模式的路由权限&#xff0c;最后还是分成了3种&#xff0c;分别是&#xff1a; 前端固定路由&#xff0c;所有路由是固定的&#xff0c;通过权限过滤菜单和显示前端动态路由&#xff0c;通过权限过滤路由表和菜单后端动态路由&#xff0c;获取接口返回数据&am…

什么工程项目管理软件好用?

工程项目比较多&#xff0c;经常忘记项目的进度&#xff0c;想要可以查看项目进展的项目管理软件&#xff1f; 大多数时候&#xff0c;面对项目进度没有头绪&#xff0c;看不懂&#xff0c;无法把握&#xff1b;根本原因不在于题主所说的&#xff0c;是否缺少一张合适的项目进…