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

简介: Linux操作系统实验十二 Linux编程技术应用

1.实验目的与要求

  1. 使用Makefile来管理编译源码,掌握Makefile的基本语法。
  2. 学习Makefile中的变量的定义和使用,以及常用的特殊变量使用。
  3. 学习makefile的自动推导功能。
  4. 学习使用makefile的伪目标。

2.实验平台

实验室安装的实验环境(Linux操作系统)和头歌(www.educoder.net)实验平台(课程实验)

3.实验内容

  1. Makefile的基本语法。
  2. Makefile中的变量的定义和使用
  3. makefile的自动推导功能
  4. makefile的伪目标

4.实验详细内容、步骤

任务描述

本关任务:使用Makefile来管理编译源码,掌握Makefile的基本语法。

相关知识

什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些WindowsIDE都为你做了这个工作,但是要作一个专业的程序员,makefile还是要懂的。makefile其实就是描述了整个工程中所有文件的编译顺序,编译规则,并且由make命令来读取makefile文件,然后根据makefile文件中定义的规则对其进行解析,完成对整个项目的编译操作。

makefilelinux操作系统中是比较常见的,例如,我们在使用源码安装一个软件的时候,通常只需执行make命令即可完成对软件的编译,正是因为软件开发者已经编写了makefile文件,所以只需执行make命令就会完成对整个工程的自动编译。

本关将介绍makefile的语法,使用makefile来完成对软件的编译。

Makefile规则

makefile文件中包含了一组用来编译应用程序的规则,一项规则可分成三个部分组成:

  1. 工作目标(target)
  2. 依赖条件(prerequisite)
  3. 所要执行的命令(command)

格式为:

  1. target : prereq1 prereq2
  2.    commands

以上格式就是一个文件的依赖关系,也就是说,target这个目标文件依赖于多个prerequisites文件,其生成规则定义在commands中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,commands所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。

注意

  1. commands前面使用的是TAB键,而不是空格,使用空格会出现错误;
  2. commands可以是任意的shell命令;
  3. 在执行make命令时,make会解析第一项规则;

案例演示1:

存在一个源码文件main.c文件,编译一个makefile规则来编译该文件,并生成一个名为HelloWorld的可执行文件,具体操作如下:

  1. vim makefile
  2. make
  • 使用vim编写如下代码
  1. #include <stdio.h>

  2. int main()
  3. {
  4.    printf("Hello world\n");
  5.    return 0;
  6. }
  • 使用vim编写makefile
  1. HelloWorld : main.c
  2.    gcc -o HelloWorld main.c

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

通过以上案例可以看到,编写好makefile后,只需要输入make命令即自动只需定义好的规则。

注意:gcc -o HelloWorld main.c命令前是TAB键而不是空格。

案例演示2:

假设一个项目中包含5个源码文件,分别是Add.cSub.cMul.cDiv.cmain.c和一个头文件def.h,编译一个makefile规则来编译该项目,并生成一个名为exe的可执行文件,具体操作如下:

  1. vim makefile
  2. make
  • vim Add.c
  1. #include <stdio.h>
  2. int Add(int a, int b)
  3. {
  4.    return a + b;
  5. }
  • vim Sub.c
  1. #include <stdio.h>
  2. int Sub(int a, int b)
  3. {
  4.    return a - b;
  5. }
  • vim Mul.c
  1. #include <stdio.h>
  2. int Mul(int a, int b)
  3. {
  4.    return a * b;
  5. }
  • vim Div.c
  1. #include <stdio.h>
  2. int Div(int a, int b)
  3. {
  4.    return a /  b;
  5. }
  • vim main.c
  1. #include <stdio.h>
  2. #include "def.h"
  3. int main()
  4. {
  5.    int add = Add(10, 5);
  6.    int sub = Sub(10, 5);
  7.    int mul = Mul(10, 5);
  8.    int div = Div(10, 5);
  9.    
  10.    printf("10 + 5 = %d\n", add);
  11.    printf("10 - 5 = %d\n", sub);
  12.    printf("10 * 5 = %d\n", mul);
  13.    printf("10 / 5 = %d\n", div);
  14.    
  15.    return 0;
  16. }
  • vim def.h
  1. #ifndef __DEF_H__
  2. #define __DEF_H__

  3. #include <stdio.h>

  4. int Add(int a, int b);
  5. int Sub(int a, int b);
  6. int Mul(int a, int b);
  7. int Div(int a, int b);
  8. #endif
  • vim makefile
  1. exe : main.o Add.o Sub.o Mul.o Div.o
  2.    gcc -o exe main.o Add.o Sub.o Mul.o Div.o

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

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

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

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

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

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

以上案例,当只需make命令时,首先解析目标为exe的规则,然后发现exe依赖于main.o、Add.o和Sub.o,然后分别对main.o、Add.o和Sub.o规则进行解析,即分别执行目标为main.o、Add.o和Sub.o的命令。当main.o、Add.o和Sub.o生成后,最后执行exe对应的命令。

编程要求

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

具体编程要求如下:

  • 编写5个源文件Add.c、Sub.c、Mul.c、Div.c和main.c和一个头文件def.h,文件内容同案例2
  • 使用makefile管理以上项目,并编译生成一个名为Calc的可执行文件;
  • vim Add.c
1. 1. #include <stdio.h>
2. 2. int Add(int a, int b)
3. 3. {
4. 4.     return a + b;
5. 5. }
  • vim Sub.c
1. 1. #include <stdio.h>
2. 2. int Sub(int a, int b)
3. 3. {
4. 4.     return a - b;
5. 5. }
  • vim Mul.c
1. 1. #include <stdio.h>
2. 2. int Mul(int a, int b)
3. 3. {
4. 4.     return a * b;
5. 5. }
  • vim Div.c
1. 1. #include <stdio.h>
2. 2. int Div(int a, int b)
3. 3. {
4. 4.     return a /  b;
5. 5. }
  • vim main.c
1. 1. #include <stdio.h>
2. 2. #include "def.h"
3. 3. int main()
4. 4. {
5. 5.     int add = Add(10, 5);
6. 6.     int sub = Sub(10, 5);
7. 7.     int mul = Mul(10, 5);
8. 8.     int div = Div(10, 5);
9. 9. 
10. 10.     printf("10 + 5 = %d\n", add);
11. 11.     printf("10 - 5 = %d\n", sub);
12. 12.     printf("10 * 5 = %d\n", mul);
13. 13.     printf("10 / 5 = %d\n", div);
14. 14. 
15. 15.     return 0;
16. 16. }

相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
目录
相关文章
|
14天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
39 1
|
2天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
35 13
|
14天前
|
移动开发 前端开发 Android开发
探索移动开发之旅:从应用构思到操作系统的深度理解
在数字时代的浪潮中,移动应用与系统是连接用户与技术的桥梁。本文将带领读者踏上一场移动开发的探险旅程,从应用的构思和设计出发,深入到移动操作系统的核心原理。我们将通过实际代码示例,展示如何将创意转化为现实,并解析背后的技术机制。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和知识,帮助你更好地理解和掌握移动应用开发的艺术。
|
14天前
|
存储 缓存 网络协议
Linux操作系统的内核优化与性能调优####
本文深入探讨了Linux操作系统内核的优化策略与性能调优方法,旨在为系统管理员和高级用户提供一套实用的指南。通过分析内核参数调整、文件系统选择、内存管理及网络配置等关键方面,本文揭示了如何有效提升Linux系统的稳定性和运行效率。不同于常规摘要仅概述内容的做法,本摘要直接指出文章的核心价值——提供具体可行的优化措施,助力读者实现系统性能的飞跃。 ####
|
15天前
|
缓存 监控 网络协议
Linux操作系统的内核优化与实践####
本文旨在探讨Linux操作系统内核的优化策略与实际应用案例,深入分析内核参数调优、编译选项配置及实时性能监控的方法。通过具体实例讲解如何根据不同应用场景调整内核设置,以提升系统性能和稳定性,为系统管理员和技术爱好者提供实用的优化指南。 ####
|
1月前
|
Linux 网络安全 数据安全/隐私保护
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
92 8
|
1月前
|
监控 Linux
如何检查 Linux 内存使用量是否耗尽?这 5 个命令堪称绝了!
本文介绍了在Linux系统中检查内存使用情况的5个常用命令:`free`、`top`、`vmstat`、`pidstat` 和 `/proc/meminfo` 文件,帮助用户准确监控内存状态,确保系统稳定运行。
251 6
|
1月前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
80 3
|
1月前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
71 2