利用makefile實(shí)現(xiàn)c語言項(xiàng)目編譯

本周操作系統(tǒng)課的實(shí)驗(yàn)是用c語言實(shí)現(xiàn)10個(gè)進(jìn)程調(diào)度算法。這個(gè)項(xiàng)目中有多個(gè).h頭文件和.c源文件,利用makefile可以很輕松地找到所有項(xiàng)目文件之間的關(guān)系并實(shí)現(xiàn)編譯。

雖然makefile的基本框架學(xué)校已經(jīng)提供的,但身為c語言小白,連如何利用make指令來使用這份makefile都不知道,更別說要往這里面增加自己添加的文件。就記錄下這篇筆記給自己以及需要的朋友參考。

Makefile解讀

先貼上這份makefile,注釋是自己后來添加的:

# 變量BIN: 給定的是我們想要生成的可執(zhí)行文件的名稱
BIN = scheduler
# 變量SRC中給的是所有的想要編譯的.c源文件,與makefile在同一目錄下可直接寫(如這里的main.c),否則需要寫明相對路徑(如這里的其余源文件都在目錄src下)。
# 多文件時(shí),選擇用"\"進(jìn)行分行處理
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:傳給編譯器的某些編譯參數(shù),看需求添加
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結(jié)尾,即將.c源文件編譯成.o文件
OBJS = $(SRC:%.c=%.o)

# all:可實(shí)現(xiàn)編譯
# 用最簡單的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:定義編譯+執(zhí)行指令
run: $(BIN)
    ./$(BIN)
# clean:定義刪除所有編譯生成的.o文件
clean:
    $(RM) $(BIN) $(OBJS) *.d
 
# 如果當(dāng)前目錄中,正好有一個(gè)文件叫做clean,那么這個(gè)命令不會(huì)執(zhí)行。因?yàn)镸ake發(fā)現(xiàn)clean文件已經(jīng)存在,就認(rèn)為沒有必要重新構(gòu)建了,就不會(huì)執(zhí)行指定的rm -f命令。
# .PHONY:聲明上面的clean、debug、run都是“偽目標(biāo)”而非文件名,這樣就不會(huì)發(fā)生上述情況
# 比如對于命令clean,make就不會(huì)去檢查是否存在一個(gè)叫做clean的文件,而是每次運(yùn)行都執(zhí)行對應(yīng)的命令
.PHONY: clean debug run

make指令

在終端進(jìn)入makefile所在的目錄,使用make,就可以使用我們在makefile中申明的指令,如debug、run和clean。

  1. all 實(shí)現(xiàn)編譯,但不建議使用沒在.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
    

    此時(shí)makefile同目錄中多生成了一個(gè)scheduler可執(zhí)行文件,后續(xù)利用./scheduler即可執(zhí)行

  1. run 實(shí)現(xiàn)編譯并執(zhí)行

    $ 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源文件中編寫的關(guān)于CFLAGS的內(nèi)容,提示用戶如何使用scheduler
    15行 最后執(zhí)行./scheduler,測試的是時(shí)間片輪轉(zhuǎn)(RoundRobin)調(diào)度算法。給了4個(gè)進(jìn)程,其中達(dá)到時(shí)間,進(jìn)程長度和進(jìn)程優(yōu)先級分別為A:0 5 4,B :3 3 1,C: 4 8 2, D:8 4 3(見下表),時(shí)間片長度為最末的數(shù)字 2

    進(jìn)程 A B C D
    到達(dá)時(shí)間 0 3 4 8
    進(jìn)程長度 5 3 8 4
    優(yōu)先級 4 1 2 3
  1. debug 實(shí)現(xiàn)用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 實(shí)現(xiàn)刪除所有編譯生成的.o文件和scheduler這個(gè)可執(zhí)行文件

    $ 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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容