Makefile —— Makefile的规则是什么?make是如何工作的?make的工作方式是什么?
#1、Makefile的規則:
# ? target... : prerequisites...
#?? ??? ?command
target是:【目標文件:包含執行文件edit與中間目標文件(*.o)文件】
prerequisites是: 【依賴文件:包含冒號后面那些.c文件與.h文件;edit的依賴文件是所有.o文件】
command是:【命令:定義了如何生成目標文件的操作系統命令,一定要以Tab鍵作為開頭】
#2、make什么時候執行command命令?
#?? ?make會比較targets文件和prerequisites文件的修改日期,如果prerequisutes文件的日期要比targets文件的日期要新,或者target不存在的話,那么,make就會執行后續定義的命令
#3、clean不是一個文件,它不過是一個動作名字,有點像c語言中的lable一樣,
#?? ??? ??? ?其冒號后什么也沒有,那么,make就不會自動去找文件的依賴性,也就不會自動執行其后所定義的命令
#?? ??? ??? ?要執行其后的命令,就要在make命令后明顯的指出這個lable的名字。?? ?
#?? ?為了避免和文件重名的這種情況,我們可以使用一個特殊標記".PHONY"來顯示地知名一個目標是"偽目標"
#?? ??? ??? ?向make說明,不管是都有這個文件,這個目標就是"偽目標"
a.c a.h b.c b.h common.h文件代碼如下:
#a.c [root@localhost MakeFile]# cat a.c #include "common.h" #include "a.h"int main(void) {printf("aaa\n");testb();printf("a:%d\n", strlen("asafxxxxxx"));return 0; }#a.h [root@localhost MakeFile]# cat a.h #include <stdio.h>#b.c [root@localhost MakeFile]# cat b.c #include "common.h" #include "b.h"void testb(void) {printf("bbb\n");printf("b:%d\n", strlen("asaf"));return ; }#b.h [root@localhost MakeFile]# cat b.h #include <stdio.h>#common.h [root@localhost MakeFile]# cat common.h #include <string.h> #include <unistd.h>Makefile文件代碼如下:?
export CC=gcc?all:edit@echo "all"edit:b.o a.o@$(CC) a.o b.o -o edit@echo "edit" a.o:a.c a.h common.h@$(CC) -c a.c -o a.o@echo "a.o" b.o:b.c b.h common.h@$(CC) -c b.c -o b.o@echo "b.o".PHONY:clean clean:@rm a.o b.o edit -f# 4、make是如何工作的?
# 若工程首次被編譯:
# 1》make會在當前目錄下找到"Makefile"的文件;
# 2》如果找到,就會找文件中的第一個目標文件(target),在上面的例子中找到"all"這個文件;
# 3》"all"所需的目標是"edit","edit"文件所需文件都為[.o]文件,所以此文件作為最終的目標文件;
# 4》如果edit文件不存在,或者是edit所依賴的后面的[.o]文件的文件修改時間要比edit這個文件新,
# ?? ?那么,他就會執行后面所定義的命令來生成edit這個文件;
# 5》如果edit所依賴的.o文件也存在,那么make會在當前文件中找目標為.o文件的依賴性,
# ?? ?如果找到,則再根據那一個規則生成.o文件;
# 6》執行edit文件。
結果如下:
[root@localhost MakeFile]# make -f 1_makefile.bak b.o a.o edit all [root@localhost MakeFile]# ./edit aaa bbb b:4 a:10# # # 若工程未被編譯過: # ?? ??? ?打印結果為: b.o >然后是> a.o >然后是> ?edit >然后是> all # 若編譯好后,只是修改了a.h文件: # ?? ??? ?打印結果為: ?a.o >然后是> edit >然后是> all ## make的工作方式:
# ?? ?1》讀入所有的Makefile
# ?? ?2》讀入被include的其他的Makefile
# ?? ?3》初始化文件中的變量
# ?? ?4》推導隱晦規則,并分析所有規則
# ?? ?5》為所有的目標文件創建依賴關系鏈
# ?? ?6》依據依賴關系,決定那些目標要重新生成
# ?? ?7》執行生成命令
總結
以上是生活随笔為你收集整理的Makefile —— Makefile的规则是什么?make是如何工作的?make的工作方式是什么?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言——实现用链表存储学生信息,当输入
- 下一篇: Makefile —— 如何在文件内使用