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 8迁移Anolis OS 8
Anolis OS 8在做出差异性开发同时,在生态上和依赖管理上保持跟CentOS 8.x兼容,本文为您介绍如何通过AOMS迁移工具实现CentOS 8.x到Anolis OS 8的迁移。
目录
相关文章
|
2月前
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
1月前
|
存储 Linux iOS开发
【Linux】冯诺依曼体系与操作系统理解
本文深入浅出地讲解了计算机体系的两大核心概念:冯诺依曼体系结构与操作系统。冯诺依曼体系作为现代计算机的基础架构,通过中央处理器、存储器和输入输出设备协同工作,解决了硬件性能瓶颈问题。操作系统则是连接硬件与用户的桥梁,管理软硬件资源,提供运行环境。文章还详细解析了操作系统的分类、意义及管理方式,并重点阐述了系统调用的作用,为学习Linux系统编程打下坚实基础。适合希望深入了解计算机原理和技术内幕的读者。
67 1
|
1月前
|
JavaScript Ubuntu Linux
如何在阿里云的linux上搭建Node.js编程环境?
本指南介绍如何在阿里云Linux服务器(Ubuntu/CentOS)上搭建Node.js环境,包含两种安装方式:包管理器快速安装和NVM多版本管理。同时覆盖全局npm工具配置、应用部署示例(如Express服务)、PM2持久化运行、阿里云安全组设置及外部访问验证等步骤,助你完成开发与生产环境的搭建。
|
2月前
|
NoSQL Unix Linux
Linux 操作系统的诞生与发展历程
步探索与准备: 1991年初,林纳斯·托瓦兹开始在一台386sx兼容微机上学习minix操作系统。通过学习,他逐渐不能满足于minix系统的现有性能,并开始酝酿开发一个新的免费操作系统。
111 8
Linux 操作系统的诞生与发展历程
|
5月前
|
安全 Linux 数据安全/隐私保护
Vanilla OS:下一代安全 Linux 发行版
【10月更文挑战第30天】
216 0
Vanilla OS:下一代安全 Linux 发行版
|
2月前
|
运维 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot 是阿里云推出的一款操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行和系统运维调优等功能。通过简单的命令行操作,用户可以快速获取所需信息并执行任务,极大提升了Linux系统的使用效率。安装步骤简单,只需在阿里云服务器上运行几条命令即可完成部署。使用过程中,OS Copilot不仅能帮助查找命令,还能处理文件和复杂场景,显著节省了查找资料的时间。体验中发现,部分输出格式和偶尔出现的英文提示有待优化,但整体非常实用,特别适合Linux初学者。
266 10
|
3月前
|
弹性计算 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot是由阿里云推出的操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行等功能,极大提升了Linux系统的使用效率。用户只需通过简单的命令或自然语言描述问题,OS Copilot即可快速提供解决方案并执行相应操作。例如,查询磁盘使用量等常见任务变得轻松快捷。此外,它还支持从文件读取复杂任务定义,进一步简化了操作流程。虽然在某些模式下可能存在小问题,但总体上大大节省了学习和操作时间,提高了工作效率。
192 2
OS Copilot-操作系统智能助手-Linux新手小白的福音
|
3月前
|
弹性计算 运维 Ubuntu
os-copilot在Alibaba Cloud Linux镜像下的安装与功能测试
我顺利使用了OS Copilot的 -t -f 功能,我的疑惑是在换行的时候就直接进行提问了,每次只能写一个问题,没法连续换行更有逻辑的输入问题。 我认为 -t 管道 功能有用 ,能解决环境问题的连续性操作。 我认为 -f 管道 功能有用 ,可以单独创建可连续性提问的task问题。 我认为 | 对文件直接理解在新的服务器理解有很大的帮助。 此外,我还有建议 可以在非 co 的环境下也能进行连续性的提问。
107 7
|
3月前
|
存储 运维 安全
深入解析操作系统控制台:阿里云Alibaba Cloud Linux(Alinux)的运维利器
本文将详细介绍阿里云的Alibaba Cloud Linux操作系统控制台的功能和优势。
156 6
|
3月前
|
安全 大数据 Linux
云上体验最佳的服务器操作系统 - Alibaba Cloud Linux | 飞天技术沙龙-CentOS 迁移替换专场
本次方案的主题是云上体验最佳的服务器操作系统 - Alibaba Cloud Linux ,从 Alibaba Cloud Linux 的产生背景、产品优势以及云上用户使用它享受的技术红利等方面详细进行了介绍。同时,通过国内某社交平台、某快递企业、某手机客户大数据业务 3 大案例,成功助力客户实现弹性扩容能力提升、性能提升、降本增效。 1. 背景介绍 2. 产品介绍 3. 案例分享

热门文章

最新文章

下一篇
oss创建bucket