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的迁移。
目录
相关文章
|
5天前
|
缓存 资源调度 安全
深入探索Linux操作系统的心脏——内核配置与优化####
本文作为一篇技术性深度解析文章,旨在引领读者踏上一场揭秘Linux内核配置与优化的奇妙之旅。不同于传统的摘要概述,本文将以实战为导向,直接跳入核心内容,探讨如何通过精细调整内核参数来提升系统性能、增强安全性及实现资源高效利用。从基础概念到高级技巧,逐步揭示那些隐藏在命令行背后的强大功能,为系统管理员和高级用户打开一扇通往极致性能与定制化体验的大门。 --- ###
26 9
|
5天前
|
缓存 Linux 开发者
Linux内核中的并发控制机制:深入理解与应用####
【10月更文挑战第21天】 本文旨在为读者提供一个全面的指南,探讨Linux操作系统中用于实现多线程和进程间同步的关键技术——并发控制机制。通过剖析互斥锁、自旋锁、读写锁等核心概念及其在实际场景中的应用,本文将帮助开发者更好地理解和运用这些工具来构建高效且稳定的应用程序。 ####
21 5
|
5天前
|
缓存 运维 网络协议
深入Linux内核架构:操作系统的核心奥秘
深入Linux内核架构:操作系统的核心奥秘
22 2
|
9天前
|
缓存 网络协议 Linux
Linux操作系统内核
Linux操作系统内核 1、进程管理: 进程调度 进程创建与销毁 进程间通信 2、内存管理: 内存分配与回收 虚拟内存管理 缓存管理 3、驱动管理: 设备驱动程序接口 硬件抽象层 中断处理 4、文件和网络管理: 文件系统管理 网络协议栈 网络安全及防火墙管理
30 4
|
8天前
|
安全 网络协议 Linux
Linux操作系统的内核升级与优化策略####
【10月更文挑战第29天】 本文深入探讨了Linux操作系统内核升级的重要性,并详细阐述了一系列优化策略,旨在帮助系统管理员和高级用户提升系统的稳定性、安全性和性能。通过实际案例分析,我们展示了如何安全有效地进行内核升级,以及如何利用调优技术充分发挥Linux系统的潜力。 ####
27 1
|
3天前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
18 3
|
3天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
16 2
|
11天前
|
缓存 监控 Linux
|
14天前
|
Linux Shell 数据安全/隐私保护