Linux操作系统实验十二 Linux编程技术应用(下)

简介: Linux操作系统实验十二 Linux编程技术应用
  • vim def.h
1. 1. #ifndef __DEF_H__
2. 2. #define __DEF_H__
3. 3. 
4. 4. #include <stdio.h>
5. 5. 
6. 6. int Add(int a, int b);
7. 7. int Sub(int a, int b);
8. 8. int Mul(int a, int b);
9. 9. int Div(int a, int b);
10. 10. #endif
  • vim makefile
1. 1. Calc : main.o Add.o Sub.o Mul.o Div.o
2. 2.     gcc -o Calc main.o Add.o Sub.o Mul.o Div.o
3. 3. 
4. 4. main.o : main.c def.h
5. 5.     gcc -c main.c -o main.o
6. 6. 
7. 7. Add.o : Add.c
8. 8.     gcc -c Add.c -o Add.o
9. 9. 
10. 10. Sub.o : Sub.c
11. 11.     gcc -c Sub.c -o Sub.o
12. 12. 
13. 13. Mul.o : Mul.c
14. 14.     gcc -c Mul.c -o Mul.o
15. 15. 
16. 16. Div.o : Div.c
17. 17.     gcc -c Div.c -o Div.o

任务描述

本关任务:学习Makefile中的变量的定义和使用,以及常用的特殊变量使用。

相关知识

变量的使用可以方便我们编写makefile文件,我们可以使用一个简短的变量来替换一个比较长的字符串,这样我们在使用这个字符串的时候就可以方便的使用变量来替换。除此之外,当我们修改某一个字符串时,如果我们没有使用变量,则我们需要修改使用该字符串的每个地方,如果使用了变量,我们只需要修改变量定义处即可。

makefile 变量的命令可以包含字符、数字、下划线(可以是数字开头),并且大小写敏感。

makefile变量在声明时需要对其进行赋值,而在使用该变量时需要在变量名前加上**$符号 例如$(VARNAME),如果用户需要在makefile文件中使用真实的$字符,则使用$$**表示。

makefile中对变量的赋值方式有三种,分别是:

  1. 递归赋值(=):递归赋值,即赋值后并不马上生效,等到使用时才真正的赋值,此时通递归找出当前的值;
  2. 直接赋值(:=):是将":="右边中包含的变量直接展开给左边的变量赋值;
  3. 条件赋值(?=):只有此变量在之前没有赋值的情况下才会对这个变量进行赋值,所有一般用在第一次赋值;

makefile除了可以自定义变量外,还存在一些系统默认的特殊变量,这些特殊变量可以方便帮助我们快速的编写makefile文件,例如:$@、$<和$^等等。

本关将介绍makefile的变量的定义和使用方法,以及使用特殊变量来编写makefile文件。

Makefile 自定义变量

自定义变量格式:

  • 递归赋值 变量名 = 变量内容
  • 直接赋值 变量名 := 变量内容
  • 条件赋值 变量名 ?= 变量内容

变量的使用格式为: $变量名或者${变量名}或者$(变量名)

案例演示1:

在上一关中案例2中的项包含了5个源码文件和一个头文件,如果使用变量来编写makefile则会显示出比较简洁的格式,具体操作如下:

  1. vim makefile
  2. make
  • vim makefile
  1. object=main.o Add.o Sub.o Mul.o Div.o
  2. exe : $(object)
  3.    gcc -o exe $(object)

  4. main.o : main.c def.h
  5.    gcc -c main.c -o main.o

  6. Add.o : Add.c
  7.    gcc -c Add.c -o Add.o

  8. Sub.o : Sub.c
  9.    gcc -c Sub.c -o Sub.o

  10. Mul.o : Mul.c
  11.    gcc -c Mul.c -o Mul.o

  12. Div.o : Div.c
  13.    gcc -c Div.c -o Div.o

[makefile内容]

[请在右侧“命令行”里直接体验]

可以看到,我们使用object来表示main.o Add.o Sub.o Mul.o Div.o,这样我们就可以使用$(object)来表示以上目标文件,而不是每次输入这5个目标文件。

Makefile 特殊变量

makefile常用的特殊变量有:

  1. $@:表示所有目标;
  2. $^:表示所有依赖目标的集合,以空格分隔;
  3. $<:表示依赖目标中第一个目标的名子;

案例演示1:

接着上一个案例中的项目,如果使用特殊变量来编写makefile则会显示出更加简洁的格式,具体操作如下:

  1. vim makefile
  2. make
  • vim makefile
  1. object=main.o Add.o Sub.o Mul.o Div.o
  2. exe : $(object)
  3.    gcc -o @@ (object)

  4. main.o : main.c def.h
  5.    gcc -c <o< -o @

  6. Add.o : Add.c
  7.    gcc -c <o< -o @

  8. Sub.o : Sub.c
  9.    gcc -c <o< -o @

  10. Mul.o : Mul.c
  11.    gcc -c <o< -o @

  12. Div.o : Div.c
  13.    gcc -c <o< -o @

[请在右侧“命令行”里直接体验]

编程要求

本关任务是学会使用makefile来编译项目。

具体编程要求如下:

  • 编写5个源文件Add.c、Sub.c、Mul.c、Div.c和main.c和一个头文件def.h,文件内容同第一关案例2
  • 使用makefile的变量来编译生成一个名为VarCalc的可执行文件;

•    vim makefile

1. 1. object=main.o Add.o Sub.o Mul.o Div.o
2. 2. VarCalc : $(object)
3. 3.     gcc -o VarCalc $(object)
4. 4. 
5. 5. main.o : main.c def.h
6. 6.     gcc -c $< -o $@
7. 7. 
8. 8. Add.o : Add.c
9. 9.     gcc -c $< -o $@
10. 10. 
11. 11. Sub.o : Sub.c
12. 12.     gcc -c $< -o $@
13. 13. 
14. 14. Mul.o : Mul.c
15. 15.     gcc -c $< -o $@
16. 16. 
17. 17. Div.o : Div.c
18. 18.     gcc -c $< -o $@

任务描述

本关任务:学习makefile的自动推导功能。

相关知识

make很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个.o文件后都写上类似的命令。因为,我们的make会自动识别,并自己推导命令。

只要make看到一个.o文件,它就会自动的把.c文件加在依赖关系中,如果make找到一个main.o,那么main.c就会是main.o的依赖文件。并且 gcc -c main.c 也会被推导出来,于是,我们的makefile再也不用写得这么复杂。

本关将介绍makefile的自动推导功能。

Makefile 自动推导

自动推导格式: 目标 : 其它依赖

案例演示1:

如果使用自动推导模式来编写上一关卡案例中的makefile,则会有更简洁的格式,具体操作如下:

  1. vim makefile
  2. make
  • vim makefile
  1. object=main.o Add.o Sub.o Mul.o Div.o
  2. exe : $(object)
  3.    gcc -o @@ (object)

  4. main.o : def.h

[请在右侧“命令行”里直接体验]

可以看到,我们只需要为main.o创建一个编译规则,其4个目标文件则不需要为其创建编译规则,因为make会自动的为其构造出编译规则。

编程要求

本关任务是学会makefile中的自动推导。 具体编程要求如下:

  • 修改上一关的makefile,使用自动推导来编译项目,并生成一个名为AutoCalc的可执行文件;

•    vim makefile

1. 1. object=main.o Add.o Sub.o Mul.o Div.o
2. 2. AutoCalc : $(object)
3. 3.     gcc -o AutoCalc $(object)
4. 4. 
5. 5. main.o : def.h

任务描述

本关任务:学习使用makefile的伪目标。

相关知识

每个Makefile中都应该写一个清空目标文件(.o和执行文件)的规则,这不仅便于重编译,也很利于保持文件的清洁。

通常,我们在使用源码安装软件的时候,都会在编译完软件后,执行make install这个命令来安装软件,或者执行make clean这个命令清空临时生成的目标文件。以上操作就是利用了makefile的伪目标。

本关将介绍makefile的伪目标。

Makefile 伪目标

makefile使用.PHONY关键字来定义一个伪目标,具体格式为: .PHONY : 伪目标名称

案例演示1:

为上一关卡案例中的makefile添加清空临时目标文件标签clean,具体操作如下:

  1. vim makefile
  2. make
  • vim makefile
  1. object=main.o Add.o Sub.o Mul.o Div.o
  2. exe : $(object)
  3.    gcc -o @@ (object)

  4. main.o : def.h

  5. .PHONY : clean

  6. clean :
  7.    rm $(object)

[请在右侧“命令行”里直接体验]

可以看到,当我们执行完make命令后会生成多个临时文件,然后我们执行make clean命令后,则会将生成的临时文件删除掉,其实执行make clean命令就是在执行rm main.o Add.o Sub.o Mul.o Div.o

案例演示2:

使用另一个格式来清除临时产生的目录文件和不显示删除命令,具体操作如下:

  1. vim makefile
  2. make
  • vim makefile
  1. object=main.o Add.o Sub.o Mul.o Div.o
  2. exe : $(object)
  3.    gcc -o @@ (object)

  4. main.o : def.h

  5. clean :
  6.    @echo "clean object files"
  7.    @rm $(object)

[请在右侧“命令行”里直接体验]

可以看到,当我们执行make clean命令后,将不会在终端中显示rm main.o Add.o Sub.o Mul.o Div.o命令。

注意:在命令前加了**@**符号,则不会把命令原样输出在终端。

编程要求

本关任务是学会makefile中的伪目标。 具体编程要求如下:

  • 为上一关的makefile添加自动清理临时文件的伪目标clean,并生成一个名为AutoCleanCalc的可执行文件;

•    vim makefile

1. 1. object=main.o Add.o Sub.o Mul.o Div.o
2. 2. AutoCleanCalc : $(object)
3. 3.     gcc -o AutoCleanCalc $(object)
4. 4. 
5. 5. main.o : def.h
6. 6. 
7. 7. .PHONY : clean
8. 8. 
9. 9. clean :
10. 10.     rm $(object)
相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
目录
相关文章
|
5天前
|
移动开发 Android开发 数据安全/隐私保护
移动应用与系统的技术演进:从开发到操作系统的全景解析随着智能手机和平板电脑的普及,移动应用(App)已成为人们日常生活中不可或缺的一部分。无论是社交、娱乐、购物还是办公,移动应用都扮演着重要的角色。而支撑这些应用运行的,正是功能强大且复杂的移动操作系统。本文将深入探讨移动应用的开发过程及其背后的操作系统机制,揭示这一领域的技术演进。
本文旨在提供关于移动应用与系统技术的全面概述,涵盖移动应用的开发生命周期、主要移动操作系统的特点以及它们之间的竞争关系。我们将探讨如何高效地开发移动应用,并分析iOS和Android两大主流操作系统的技术优势与局限。同时,本文还将讨论跨平台解决方案的兴起及其对移动开发领域的影响。通过这篇技术性文章,读者将获得对移动应用开发及操作系统深层理解的钥匙。
|
1月前
|
Java 开发工具 Android开发
移动应用开发之旅:探索移动操作系统与应用构建的奥秘
【8月更文挑战第33天】在数字时代的浪潮中,移动应用已成为我们日常生活的一部分。本文将带您深入理解移动操作系统的工作原理,并揭示如何在这个多姿多彩的平台上开发出引人入胜的应用。我们将从基础概念出发,逐步深入到高级编程技巧,最终通过一个实际的代码示例,展示如何将理论应用于实践。无论您是初学者还是有经验的开发者,这篇文章都将为您提供宝贵的见解和灵感。让我们一起踏上这场激动人心的移动应用开发之旅吧!
|
1月前
|
安全 Linux Android开发
Linux CFI (Control-flow integrity)技术相关资料汇总
Linux CFI (Control-flow integrity)技术相关资料汇总
|
2月前
|
Rust 安全 编译器
【颠覆传统】Rust跨平台开发秘籍:如何轻松驾驭多操作系统,打造无缝兼容应用?
【8月更文挑战第31天】Rust语言凭借其内存安全、卓越性能及丰富的标准库支持,正逐渐成为跨平台开发的新宠。本文通过具体代码示例,展示如何用Rust编写可在多种操作系统上无缝运行的应用程序。Rust通过所有权、借用和生命周期等机制提升代码安全性,并在编译时检测潜在错误。其编译器支持广泛平台,包括Windows、macOS和Linux等,非常适合跨平台开发。此外,Rust还可用于开发复杂的GUI应用,利用GTK、Qt等成熟框架实现跨平台图形界面。无论开发命令行工具还是图形界面应用,Rust均能提供高效稳定的解决方案。
80 1
|
2月前
|
Unix Linux Ruby
在windows和linux上高效快捷地发布Dash应用
在windows和linux上高效快捷地发布Dash应用
|
18天前
|
消息中间件 程序员 数据处理
探究操作系统中的进程间通信(IPC)机制及其在现代软件开发中的应用
本文深入探讨了操作系统中的核心概念——进程间通信(IPC),揭示了其在现代软件开发中的关键作用。通过对各种IPC机制如管道、消息队列、共享内存等的详细分析,本文旨在为读者提供一个清晰的理解框架,帮助他们掌握如何在实际应用中有效利用这些技术以实现进程间的协同工作。此外,文章还将探讨IPC在高并发环境下的性能优化策略,以及如何避免常见的IPC编程错误。通过结合理论与实践,本文不仅适合希望深入了解操作系统原理的技术人员阅读,也对那些致力于提升软件质量和开发效率的程序员具有重要参考价值。
20 0
|
24天前
|
人工智能 物联网 5G
未来编程之钥:移动应用开发与操作系统的融合趋势
本文将探索移动应用开发和移动操作系统之间的紧密联系,并分析它们如何共同塑造了我们的数字生活。我们将从移动应用的开发环境谈起,探讨不同操作系统对开发者的影响,以及这些系统是如何促进创新和提升用户体验的。文章还将展望移动技术的未来,包括人工智能、物联网和5G网络如何进一步整合进移动应用生态中。
|
1月前
|
存储 自然语言处理 搜索推荐
探索OS Copilot——那款让你瞬间变身超级用户、编程如呼吸般自然、文件管理如同魔法般的神奇操作系统辅助神器!
【9月更文挑战第4天】“OS Copilot”是一款高效的操作系统辅助软件,通过智能化手段简化电脑使用,涵盖智能命令建议、代码片段生成、文件管理及任务自动化等强大功能。其简洁的界面与友好的用户体验使其成为提升生产力的理想选择,无论是专业人士还是普通用户都能从中受益。从安装到实际应用都非常流畅,能显著提升工作效率,是优化数字生活的得力助手。
34 0
|
2月前
|
机器学习/深度学习 网络安全 TensorFlow
探索操作系统的心脏:内核与用户空间的奥秘云计算与网络安全:技术挑战与未来趋势深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【8月更文挑战第29天】在数字世界的每一次点击与滑动背后,都隐藏着一个不为人知的故事。这个故事关于操作系统——计算机的灵魂,它如何协调硬件与软件,管理资源,并确保一切运行得井井有条。本文将带你走进操作系统的核心,揭示内核与用户空间的秘密,展现它们如何共同编织出我们日常数字生活的底层结构。通过深入浅出的讲解和代码示例,我们将一同解锁操作系统的神秘面纱,理解其对现代计算的重要性。 【8月更文挑战第29天】本文将深入探讨卷积神经网络(CNN)的基本原理和结构,以及它们如何被广泛应用于图像识别任务中。我们将通过代码示例来展示如何使用Python和TensorFlow库构建一个简单的CNN模型,并训练
|
2月前
|
编解码 安全 Linux
基于arm64架构国产操作系统|Linux下的RTMP|RTSP低延时直播播放器开发探究
这段内容讲述了国产操作系统背景下,大牛直播SDK针对国产操作系统与Linux平台发布的RTMP/RTSP直播播放SDK。此SDK支持arm64架构,基于X协议输出视频,采用PulseAudio和Alsa Lib处理音频,具备实时静音、快照、缓冲时间设定等功能,并支持H.265编码格式。此外,提供了示例代码展示如何实现多实例播放器的创建与管理,包括窗口布局调整、事件监听、视频分辨率变化和实时快照回调等关键功能。这一技术实现有助于提高直播服务的稳定性和响应速度,适应国产操作系统在各行业中的应用需求。
下一篇
无影云桌面