0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux开发_动态静态库创建与Makefile规则

DS小龙哥-嵌入式技术 2022-09-17 15:41 次阅读

【摘要】 介绍Linux下静态库、动态库创建方式、完成静态库、动态库调用,贴出字符串处理、时间管理两个例子代码。

​查找文件:

[root@wbyq /]# find / -name stdio.h

​文本搜索工具:

# grep -q "12345" /123.c || echo "12345" >> /123.c

​文本修改工具:sed

​ 练习:

1.​制作动态库与静态库

2.​ (扩展) 编写一个find功能的程序:可以查找指定目录下指定的文件。(关心多层目录)

3.​编写一个文本修改程序:可以修改指定文件中的内容。

(1)​将指定一行的内容全部替换为空格

(2)​将指定一个字符串替换为传入指定的字符串。 ./a.out /123.c 888 666

​安装软件的命令:

[root@wbyq Packages]# rpm -ivh tree-1.5.3-2.el6.i686.rpm

任务1:静态库与动态库

[root@wbyq test]# arm-linux-gcc 123.c -o app_1

[root@wbyq test]# arm-linux-gcc -static 123.c -o app_2

Linux下库文件存放的位置: /lib (存放的是动态库)

.so属于动态库, .a属于静态库

动态库称为共享库:gcc 123.c -o app

共享库:程序在运行的时候去调用函数(载入函数)。

静态库:相关的函数在编译的时候就已经拷贝到目标中。

[root@wbyq test]# file app_1

app_1: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.27, not stripped

[root@wbyq test]# file app_2

app_2: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.27, not stripped

[root@wbyq test]# gcc 123.c -o app_3

[root@wbyq test]# file app_3

app_3: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped

​GCC编译器的选项参数

-o :指定生成的目标文件名称

-c :指定生成.o文件(编译好的二进制文件)。

-g :在生成的目标文件中加入调试参数。适用于GDB调试。

-I :指定头文件的路径 。 gcc 123.c -I/work

-L :指定库文件的路径。gcc 123.c -L/work

-l :指定库文件的名称。gcc 123.c -L/work -labc

(实际上: libabc.so)

​生成动态库的指令

gcc -fPIC -shared -o <库文件名称>.so 源文件名称.c

库文件名称的命名规则: libxxx.so

调用动态库出现的错误:

[root@wbyq test]# ./a.out

./a.out: error while loading shared libraries: libsum.so: cannot open shared object file: No such file or directory

1.​将xxx.so直接放到/lib目录下。

2.​设置环境变量:LD_LIBRARY_PATH (存放系统库文件的搜索路径)

​生成静态库。 xxx.a

如果在相同的目录下有静态库和动态库,优先使用动态库

# ar crv libsum.a sum.o

任务2:Makefile

Makefile :用于编写程序的编译规则。 make命令用于执行Makefile文件。

make常用的选项参数:

-n :输出命令的执行过程,不执行名称

-s :隐藏命令本身。 在命令前面加上@符号,可以隐藏命令本身。

$(shell pwd)

CC :特殊变量,用于存放编译器。

​ 练习:

1.​Makefile自动化编译

只是创建3个目录,每个目录下各有一个.c一个.h,一个Makefile文件

在顶层目录下创建一个Makefile文件,,实现自动化编译。

2.​Makefile自动化编译

只是创建3个目录,每个目录下各有一个.c一个.h

在顶层目录下创建一个Makefile文件,实现自动化编译。


查找字符串并替换为其他字符串:

查找字符串并替换为其他字符串。
  比如: 
“123dfjdfv123”  将123替换为888  结果: “888dfjdfv888”
“123dfjdfv123”  将123替换为8888  结果: “8888dfjdfv8888”
“123dfjdfv123”  将123替换为88  结果: “88dfjdfv88”
#include 
int main()
{
	char src_str[100];  //源字符串
	char new_str[50];   //替换后的字符串
	char find_str[50];  //查找的字符串
	int src_len=0,new_len=0,find_len=0; //存放字符串的长度
	int i,j,n;
	int seek_len=0; //记录移动的长度
	
	/*1. 录入字符串*/
	printf("输入源字符串:");
	scanf("%s",src_str);
	printf("输入查找的字符串:");
	scanf("%s",find_str);
	printf("输入替换后的字符串:");
	scanf("%s",new_str);
	
	/*2. 计算字符串的长度*/
	while(src_str[src_len]!='\0')
	{
		src_len++;
	}
	while(find_str[find_len]!='\0')
	{
		find_len++;
	}
	while(new_str[new_len]!='\0')
	{
		new_len++;
	}
	/*3. 查找字符串*/
	for(i=0;i=i+find_len;n--)
				{
					src_str[n+seek_len]=src_str[n];
				}
				//开始替换
				for(n=0;nnew_len)//第三种情况:查找的长度大于替换的长度,向前移动
			{
				//计算向前移动的长度
				seek_len=find_len-new_len;
				//开始移动
				for(n=i+find_len-seek_len;n;n++)>;n++)>;i++)>

模拟电子时钟

#include 
#include 

int year=0,month=0,day=0,hour=0,minute=0,sec=0,week=0;
void Get_RTC_Timer(int RTC_CNT);
void GET_Week(int sec_cnt);
int Get_year(int year);
int main()
{
	while(1)
	{
		int data=time(NULL);
		Get_RTC_Timer(data);
		printf("当前时间为: %d年%d月%d日  %d时%d分%d秒  星期%d\n",year,month,day,hour,minute,sec,week);
		sleep(1);
	}
	return 0;
}

const char month_r[12]={31,29,31,30,31,30,31,31,30,31,30,31}; //闰年月份表
const char month_p[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //平年月份表
/*
将秒为单位的时间转换为:年月日时分秒
*/
void Get_RTC_Timer(int RTC_CNT)
{
	int i=0;
	int year_n=1970; //基准年份
	GET_Week(RTC_CNT);    //获取星期
	
	/*根据基准年份,减去过去年份*/
	while(RTC_CNT>=31536000)  //31536000是平年的秒数, 31622400是闰年的秒数
	{
		if(Get_year(year_n)) //闰年
		{
			if(RTC_CNT>=31622400)
			{
				RTC_CNT-=31622400; //减去闰年一年的秒数
			}
			else
			{
				break;    //退出循环
			}
		}
		else
		{
			RTC_CNT-=31536000; //减去平年一年的秒数
		}
		year_n++; //年份累加
	}
	year=year_n;    //年份
	
	/*减去过去的月份*/
	if(Get_year(year_n))     //减去闰年的月份
	{
		while(RTC_CNT>=month_r[i]*86400) //29*24*60*60
		{
		  RTC_CNT-=month_r[i]*86400;     //减去过去的月份
		  i++; //累加每一个月的秒数
		}
	}
	else               //减去平年的月份
	{
		while(RTC_CNT>=month_p[i]*86400) //86400=24*60*60
		{
		  RTC_CNT-=month_p[i]*86400;     //减去过去的月份
		  i++; //累加每一个月的秒数
		}
	}
	month=i+1; //因为月份是1月份开始,i是从0开始,这里的实际月份是i+1
	
	day=1;    //清空结构体成员--天数,用来存放新数据,天数是从1开始算
	/*减去过去的天数*/
	while(RTC_CNT>=86400)  //86400=24*60*60 一天的秒数
	{
		RTC_CNT-=86400;      //减去一天的秒
		day++;     //天自增
	}
	
	hour=0;  //清空结构体成员--小时数,用来存放新数据,小时数是从0开始算
	/*减去过去的小时*/
	while(RTC_CNT>=3600)  //3600=60*60
	{
		RTC_CNT-=3600;      //减去一小时的秒
		hour++;   //小时自增
	}
	hour+=8; //时区相差8
	
	minute=0;//清空结构体成员--分钟数,用来存放新数据,分钟数是从0开始算
	/*减去过去的分钟*/
	while(RTC_CNT>=60)
	{
		RTC_CNT-=60;
		minute++;
	}
	sec=RTC_CNT;  //秒赋值,减到最后,剩下就是秒数
}
/*
获取星期
*/
void GET_Week(int sec_cnt)
{
	int day_cnt=0;//天数
	day_cnt=sec_cnt/86400; //得到总天数
	switch(day_cnt%7)
	{
		case 0:week=4;break;
		case 1:week=5;break;
		case 2:week=6;break;
		case 3:week=7;break;
		case 4:week=1;break;
		case 5:week=2;break;
		case 6:week=3;break;
	}
}
/*
判断闰年
闰年返回1
平年返回0
*/
int Get_year(int year)
{
	if((year%400==0)||((year%4==0)&&(year%100!=0)))//判断闰年的条件
	{
		return 1;  //闰年
	}	
	return 0;    //平年
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 静态库
    +关注

    关注

    0

    文章

    21

    浏览量

    7386
  • Makefile
    +关注

    关注

    1

    文章

    121

    浏览量

    19094
  • 动态库
    +关注

    关注

    0

    文章

    16

    浏览量

    6193
收藏 人收藏

    评论

    相关推荐

    cubeide创建静态工程,如何使用cubeMX生成配置代码?

    创建工程可执行程序的话会生成一个.ioc文件,然后可以使用MX配置生成代码, 但创建静态工程的话并没有生成.ioc文件,请教一下如何使用。 感谢!!!!!!!!!!
    发表于 03-12 08:04

    Visual Develop开发STM8S207MBT6时需要提供一个静态,如何实现?

    我在使用ST Visual Develop开发STM8S207MBT6时需要提供一个静态(例如MDK中创建的.lib文件)给客户调取接口
    发表于 03-12 07:54

    Makefile可以做什么?Makefile的基本格式

    Makefile可以根据指定的依赖规则和文件是否有修改来执行命令。常用来编译软件源代码,只需要重新编译修改过的文件,使得编译速度大大加快。
    的头像 发表于 01-25 11:18 232次阅读

    静态电流什么意思 静态电流和动态电流的区别

    静态电流什么意思 静态电流和动态电流的区别  静态电流是指电荷在不发生移动的情况下所产生的电流。在静电场中,电荷通过金属导线或其他连续的导电体产生
    的头像 发表于 12-19 14:02 1115次阅读

    网络静态ip和动态区别

    网络静态IP和动态IP是指在网络中分配给设备的唯一标识符,下面将详细探讨网络静态IP和动态IP的区别。 一、定义 静态IP地址: 网络
    的头像 发表于 11-27 14:46 494次阅读

    静态线性度的动态效应

    电子发烧友网站提供《静态线性度的动态效应.pdf》资料免费下载
    发表于 11-27 11:03 0次下载
    <b class='flag-5'>静态</b>线性度的<b class='flag-5'>动态</b>效应

    Linux动态库相关知识

    Linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名。二者都使用广泛。本文主要讲
    的头像 发表于 11-07 09:23 291次阅读
    <b class='flag-5'>Linux</b>下<b class='flag-5'>动态</b>库相关知识

    浅谈Linux内核源码的Makefile、Kconfig和.config文件

    Linux内核源码文件繁多,搞不清Makefile、Kconfig、.config间的关系,不了解内核编译体系,编译修改内核有问题无从下手,自己写的驱动不知道怎么编进内核,不知道怎么配置内核,这些
    发表于 10-17 16:19 1472次阅读
    浅谈<b class='flag-5'>Linux</b>内核源码的<b class='flag-5'>Makefile</b>、Kconfig和.config文件

    使用cubeide创建静态工程没有生成.ioc文件怎么办?

    创建工程可执行程序的话会生成一个.ioc文件,然后可以使用MX配置生成代码, 但创建静态工程的话并没有生成.ioc文件,请教一下如何使用。 感谢!!!!!!!!!!
    发表于 08-09 07:37

    动态库和静态库的制作步骤

    库是一种可执行的二进制文件,是编译好的代码。使用库可以提高开发效率。在 Linux 下有静态库和动态库。 静态库在程序编译的时候会被链接到目
    的头像 发表于 07-27 11:00 555次阅读

    三个Makefile模板分享

        本文分享三个Makefile模板:编译可执行程序、编译静态库、编译动态库。 1 写在前面     对于Windows下开发,很多IDE都集成了编译器,如Visual Studi
    的头像 发表于 07-10 09:07 556次阅读
    三个<b class='flag-5'>Makefile</b>模板分享

    Linux 下的make 工具和 Makefile

    单点的文章过度一下,上一篇讲到了 Linux 下的 C 编程,本文就要引出 Make 以及 Makefile 了。 嵌入式 Linux 入门系列博文: 嵌入式 Linux 入门(一、
    的头像 发表于 06-22 10:45 558次阅读
    <b class='flag-5'>Linux</b> 下的make 工具和 <b class='flag-5'>Makefile</b>

    无法使用esp8266webserver.h在给esp8266的静态IP中创建服务器怎么解决?

    我无法使用 esp8266webserver.h 在给我的 esp8266 的静态 IP 中创建服务器。esp8266 采用给定的静态 IP,但它没有为
    发表于 06-05 13:07

    如何从现有项目MCUXpresso创建静态 (.a)?

    我在 MCUXpresso 中有一个现有项目,我想从中创建一个静态 (.a) 文件,以便我可以在未来的项目中使用这些函数和。我不确定这样做的最佳方式。我见过人们制作
    发表于 06-02 07:30

    Makefile文件的编写规则及实例

    Makefile带来直接好处就是——“自动化编译”。一旦写好,只需要一个make命令,整个工程完全自动编译,所以十分方便。而Makefile文件就是告诉make命令怎么样地去编译和链接程序。但是想要比较灵活的运用它,还是先要熟悉一些关于系统对程序编译和链接的知识。
    的头像 发表于 05-19 14:52 2831次阅读