700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 如何用c语言编写工程文件夹 利用makefile实现c语言项目编译

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

时间:2019-08-31 16:33:02

相关推荐

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

本周操作系统课的实验是用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) 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

参考

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。