本周操作系统课的实验是用c语言实现10个进程调度算法。这个项目中有多个.h头文件和.c源文件,利用makefile可以很轻松地找到所有项目文件之间的关系并实现编译。

虽然makefile的基本框架学校已经提供的,但身为c语言小白,连如何利用make指令来使用这份makefile都不知道,更别说要往这里面增加自己添加的文件。就记录下这篇笔记给自己以及需要的朋友参考。

Makefile解读

先贴上这份makefile,注释是自己后来添加的:

# 变量BIN: 给定的是我们想要生成的可执行文件的名称

BIN = scheduler

# 变量SRC中给的是所有的想要编译的.c源文件,与makefile在同一目录下可直接写(如这里的main.c),否则需要写明相对路径(如这里的其余源文件都在目录src下)。

# 多文件时,选择用"\"进行分行处理

SRC = \

main.c \

src/colors.c \

src/FCFS.c \

src/HRRN.c \

src/LCFS.c \

src/PRIOP.c \

src/queue.c \

src/RR.c \

src/MLF.c \

src/SRTNP.c

# 变量CC:给定编译器名gcc

# 变量CFLAGS:传给编译器的某些编译参数,看需求添加

CC = gcc

CFLAGS = -g -Wall -Wextra -std=c99 -Wno-unused-parameter

# 变量GDB:给定debugger名gdb

# 变量RM:给定删除文件方式,用于后面删除所有编译所得的.o文件

GDB = gdb

RM = rm -f

# 变量OBJS:将变量SRC中所有的.c文件替换成以.o结尾,即将.c源文件编译成.o文件

OBJS = $(SRC:%.c=%.o)

# all:可实现编译

# 用最简单的helloworld编译指令来解释下面代码(只是每一部分都用上面定义的变量来替代了):

# gcc -g -o helloworld helloworld.c

all: $(BIN)

$(BIN): $(OBJS)

$(CC) $(CFLAGS) $^ -o $@

# pull in dependencies for .o files

-include $(OBJS:.o=.d)

%.o: %.c

$(CC) $(CFLAGS) -c $< -o $@

# debug:定义debug指令

debug: $(BIN)

$(GDB) ./$(BIN)

# run:定义编译+执行指令

run: $(BIN)

./$(BIN)

# clean:定义删除所有编译生成的.o文件

clean:

$(RM) $(BIN) $(OBJS) *.d

# 如果当前目录中,正好有一个文件叫做clean,那么这个命令不会执行。因为Make发现clean文件已经存在,就认为没有必要重新构建了,就不会执行指定的rm -f命令。

# .PHONY:声明上面的clean、debug、run都是“伪目标”而非文件名,这样就不会发生上述情况

# 比如对于命令clean,make就不会去检查是否存在一个叫做clean的文件,而是每次运行都执行对应的命令

.PHONY: clean debug run

make指令

在终端进入makefile所在的目录,使用make,就可以使用我们在makefile中申明的指令,如debug、run和clean。

all 实现编译,但不建议使用没在.PHONY中声明过的指令(对比可见,下面的run指令更好)

$ make all

gcc -g -Wall -Wextra -std=c99 -Wno-unused-parameter -c main.c -o main.o

gcc -g -Wall -Wextra -std=c99 -Wno-unused-parameter -c src/colors.c -o src/colors.o

gcc -g -Wall -Wextra -std=c99 -Wno-unused-parameter -c src/FCFS.c -o src/FCFS.o

gcc -g -Wall -Wextra -std=c99 -Wno-unused-parameter -c src/HRRN.c -o src/HRRN.o

gcc -g -Wall -Wextra -std=c99 -Wno-unused-parameter -c src/LCFS.c -o src/LCFS.o

gcc -g -Wall -Wextra -std=c99 -Wno-unused-parameter -c src/PRIOP.c -o src/PRIOP.o

gcc -g -Wall -Wextra -std=c99 -Wno-unused-parameter -c src/queue.c -o src/queue.o

gcc -g -Wall -Wextra -std=c99 -Wno-unused-parameter -c src/RR.c -o src/RR.o

gcc -g -Wall -Wextra -std=c99 -Wno-unused-parameter -c src/MLF.c -o src/MLF.o

gcc -g -Wall -Wextra -std=c99 -Wno-unused-parameter -c src/SRTNP.c -o src/SRTNP.o

gcc -g -Wall -Wextra -std=c99 -Wno-unused-parameter main.o src/colors.o src/FCFS.o src/HRRN.o src/LCFS.o src/PRIOP.o src/queue.o src/RR.o src/MLF.o src/SRTNP.o -o scheduler

此时makefile同目录中多生成了一个scheduler可执行文件,后续利用./scheduler即可执行

run 实现编译并执行

$ make run

gcc -g -Wall -Wextra -std=c99 -Wno-unused-parameter -c main.c -o main.o

gcc -g -Wall -Wextra -std=c99 -Wno-unused-parameter -c src/colors.c -o src/colors.o

gcc -g -Wall -Wextra -std=c99 -Wno-unused-parameter -c src/FCFS.c -o src/FCFS.o

gcc -g -Wall -Wextra -std=c99 -Wno-unused-parameter -c src/HRRN.c -o src/HRRN.o

gcc -g -Wall -Wextra -std=c99 -Wno-unused-parameter -c src/LCFS.c -o src/LCFS.o

gcc -g -Wall -Wextra -std=c99 -Wno-unused-parameter -c src/PRIOP.c -o src/PRIOP.o

gcc -g -Wall -Wextra -std=c99 -Wno-unused-parameter -c src/queue.c -o src/queue.o

gcc -g -Wall -Wextra -std=c99 -Wno-unused-parameter -c src/RR.c -o src/RR.o

gcc -g -Wall -Wextra -std=c99 -Wno-unused-parameter -c src/MLF.c -o src/MLF.o

gcc -g -Wall -Wextra -std=c99 -Wno-unused-parameter -c src/SRTNP.c -o src/SRTNP.o

gcc -g -Wall -Wextra -std=c99 -Wno-unused-parameter main.o src/colors.o src/FCFS.o src/HRRN.o src/LCFS.o src/PRIOP.o src/queue.o src/RR.o src/MLF.o src/SRTNP.o -o scheduler

./scheduler

Usage: ./scheduler [SCHEDULING STRATEGY] [P1 arrival] [P1 duration] [P1 Priority] [P2 arrival]... [round robin quantum (Optional)] [(flags)]

Use flag '-help' for further information

$ ./scheduler RR 0 5 4 3 3 1 4 8 2 8 4 3 2

Starting RR scheduler

| A | A | A | A | B | B | C | C | A | B | D | D | C | C | D | D | C | C | C | C |

14行 Usage信息是在main.c源文件中编写的关于CFLAGS的内容,提示用户如何使用scheduler

15行 最后执行./scheduler,测试的是时间片轮转(RoundRobin)调度算法。给了4个进程,其中达到时间,进程长度和进程优先级分别为A:0 5 4,B :3 3 1,C: 4 8 2, D:8 4 3(见下表),时间片长度为最末的数字 2

进程

A

B

C

D

到达时间

0

3

4

8

进程长度

5

3

8

4

优先级

4

1

2

3

debug 实现用gdb来debug

$ make debug

gdb ./scheduler

GNU gdb (GDB) 9.1

Copyright (C) 2020 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law.

Type "show copying" and "show warranty" for details.

This GDB was configured as "x86_64-apple-darwin19.3.0".

Type "show configuration" for configuration details.

For bug reporting instructions, please see:

.

Find the GDB manual and other documentation resources online at:

.

For help, type "help".

Type "apropos word" to search for commands related to "word"...

Reading symbols from ./scheduler...

(gdb)

clean 实现删除所有编译生成的.o文件和scheduler这个可执行文件

$ make clean

rm -f scheduler main.o src/colors.o src/FCFS.o src/HRRN.o src/LCFS.o src/PRIOP.o src/queue.o src/RR.o src/MLF.o src/SRTNP.o *.d

参考

如何用c语言编写工程文件夹,利用makefile实现c语言项目编译相关推荐

  1. Unity工程文件夹里的目录结构

    M 1.特殊文件夹 Assets Library ProjectSettings Editor Editor Default Resources Gizmos Plugins Resources St ...

  2. r指引到文件夹_R语言中进行文件夹及文件夹内文件操作范例

    rm(list=ls()) path = 'J:/lab/EX29 –在R语言中进行文件(夹)操作' setwd(path) cat("file A\n", file=" ...

  3. Python语言学习之文件夹那些事:python和文件夹的使用方法之详细攻略

    Python语言学习之文件夹那些事:python和文件夹的使用方法之详细攻略 目录 Python与文件夹那些事 1.创建/删除文件/文件夹 1.创建文件夹

  4. Xcode 物理文件夹与工程文件夹

    在Xcode 工程中分两种文件夹:物理文件夹(如下图蓝色文件夹),工程文件夹(如下图黄色文件夹) 物理文件夹添加方法如下: 使用 pathForResource:ofType:取出物理文件夹里面的文件 ...

  5. 用C语言输出当前文件夹中所有的文件名opendir

    用C语言输出当前文件夹中所有的文件名 使用opendir() #include <stdio.h> #include <dirent.h> #include <sys/t ...

  6. mex文件生成c语言,用C语言编写MEX文件.doc

    用C语言编写MEX文件用C语言编写MEX文件 用C语言编写MEX文件1.1 为什么要用C语言编写MEX文件MATLAB是矩阵语言,是为向量和矩阵操作设计的,一般来说,如果运算可以用向量或矩阵实现,其运 ...

  7. 如何用excel表格批量生成文件夹,并命名?

    如何用excel表格批量生成文件夹,并命名?假设一个excel表格里面整理了500个名称,现在需要利用这些名称生成对应名称的文件夹,你会如何处理呢?我想很多人会挨个复制名称然后再新建文件名,再对文件夹 ...

  8. Linux下使用C语言查找一个文件夹下指定扩展名的所有文件

    最近在linux下要干点和c语言相关的任务,其中涉及使用C语言查找一个文件夹下指定扩展名的所有文件,我去开始在网上查找后粘贴后不能用,最后发现是windows下才能使用.最后找到了一篇不错的文章,ht ...

  9. DSP程序定制 F28335 F2812 简易变频器svpwm源码 简易变频器C语言源代码工程文件,直接用ccs3.3以上软件打开

    DSP程序定制 F28335 F2812 简易变频器svpwm源码 简易变频器C语言源代码工程文件,直接用ccs3.3以上软件打开. 包括SVPWM核心代码,有运行频率设置.载波频率(2.5K~20K ...

最新文章

  1. 【iOS】通讯录分组方式展示数据
  2. 《Pro ASP.NET MVC 3 Framework》学习笔记之十七【示例项目SportsStore】
  3. postDelayed总结
  4. 【PHP】多线程请求 curl_multi_init()
  5. 树和二叉树的转换代码python_python数据结构之二叉树的统计与转换实例
  6. qlabel文本改变信号_周明:NLP进步将如何改变搜索体验
  7. hdu 4284 floyd+暴搜
  8. Vue 脚手架中的.eslintrc.js代码规范 的解决
  9. 李洪强iOS开发之- 实现简单的弹窗
  10. nib和xib的区别
  11. iPhone 12系列重新上架苹果天猫旗舰店,5499元的iPhone 12今晚开订!
  12. 机器学习:监督学习和无监督学习
  13. 【转】高性能服务器架构(High-Performance Server Architecture)
  14. 硬改intel网卡MAC地址
  15. 阿里巴巴前端实习面经总结(可内推)
  16. javascript 逻辑运算符 和 或 非
  17. 流利阅读 2019.1.30 China’s Baidu pledges to improve search service after complaint
  18. python软件是免费的吗-python免费吗
  19. OpenLDAP配置坎坷路
  20. Arduino宿舍门禁,实现刷卡(NFC)开门

热门文章

  1. 【作者面对面问答】包邮送《Redis 5设计与源码分析》5本
  2. SimpleDateFormat类的线程安全问题和解决方案
  3. C++语言中std::array的神奇用法总结,你需要知道!
  4. 从需求到交付——论敏捷过程中的需求管理
  5. 【华为云技术分享】云小课 | SAP扩容实战
  6. 【Python3网络爬虫开发实战】 1.5.4-RedisDump的安装
  7. mysql可以创建多少条数据类型_mysql支持的数据类型
  8. 数据库创建联合主键(MySql)
  9. R语言学习笔记(三)多元数据的数据特征、相关分析与图形表示
  10. 【汇总】numpy函数合集