美文网首页
利用makefile实现c语言项目编译

利用makefile实现c语言项目编译

作者: Lynn_4f26 | 来源:发表于2020-06-06 18:06 被阅读0次

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

  1. 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即可执行

  1. 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
  1. 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 <http://gnu.org/licenses/gpl.html>
    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:
    <http://www.gnu.org/software/gdb/bugs/>.
    Find the GDB manual and other documentation resources online at:
        <http://www.gnu.org/software/gdb/documentation/>.
    
    For help, type "help".
    Type "apropos word" to search for commands related to "word"...
    Reading symbols from ./scheduler...
    (gdb) 
    
    
  1. 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
    

参考

http://www.ruanyifeng.com/blog/2015/02/make.html

https://blog.csdn.net/zhaocuit/article/details/74782789

相关文章

  • 利用makefile实现c语言项目编译

    本周操作系统课的实验是用c语言实现10个进程调度算法。这个项目中有多个.h头文件和.c源文件,利用makefile...

  • 关于Makefile的使用

    本周主要学习在Linux系统下使用Makefile对多个C语言源程序进行编译。 对于多个C语言源程序编译的时候,可...

  • Linux Makefile文件模板

    1、编译驱动的Makefile文件模板: 2、编译c/c++文件的Makefile文件模板: 3、带文件夹的文件模...

  • c程序如何调用cobol gnt程序

    c程序 cobol程序 makefile 编译运行

  • java_类的加载、链接、初始化

    makefile C/C++ 的makefile 处理的是编译,链接的过程,手下是将源文件编译成中间文件 .o文...

  • Makefile

    在使用Makefile 编译多个c文件时,出现 Makefile:2:*** missing separator....

  • C语言使用flock函数对文件加锁

    lock.c Makefile 编译 验证 窗口1 窗口2

  • QMake概述

    qmake将项目中的文件信息扩展为Makefile,该Makefile执行编译和链接所需的命令。 项目描述 项目由...

  • iOS-tips

    OC语言的面向对象特性是通过封装c和c++实现的,编译器会将OC编译为c和c++,再讲c编译为汇编语言,最终转成机...

  • makefile的自动推导

    main.c 文件 test.c 文件 Makefile 文件 然后就可以编译出可执行文件了。 Makefile的...

网友评论

      本文标题:利用makefile实现c语言项目编译

      本文链接:https://www.haomeiwen.com/subject/wfkftktx.html