Linux下的自動化構(gòu)建工具之make/makefile的用法詳解
一、make和makefile的區(qū)別
make是一個命令,makefile是一個文件。
二、makefile的原理
1、make的原理詳解
每次生成可執(zhí)行文件時需要輸入一長串的gcc········指令是不是感覺很麻煩?makefile存在的意義是為了項目的構(gòu)建。需要表明依賴關(guān)系和依賴方法。
2、臨時文件的清理
mycode:mycode.c gcc mycode.c -o mycode .PHONY:clean clean: rm -f mycode
.PHONY表示被該關(guān)鍵字修飾的對象是一個偽目標。(該偽目標總是可被執(zhí)行)
我們在編寫完makefile后,make一下,就能生成對應(yīng)的可執(zhí)行程序。如果依賴的文件列表沒有發(fā)生修改,gcc通過判斷mycode.c的Modify time早于mycode的Modify time,說明依賴文件列表沒有修改,那么再次make將會失敗;反之,重新編譯將會成功。
不過多次make clean卻不會失敗,因為clean被.PHONY修飾,變成了一個偽目標,所以clean總是可被執(zhí)行。
3、文件的三個時間
[root@VM-4-11-centos ~]# stat 106/text.c File: ‘106/text.c' Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fd01h/64769d Inode: 658416 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2022-09-17 21:13:21.098656019 +0800//最近訪問 Modify: 2022-09-17 21:13:21.098656019 +0800//最近修改 Change: 2022-09-17 21:13:21.098656019 +0800//最近改動 Birth: -
1、讀取文件時,Access time被改變,而Modify、Change time不會被改變(為防止文件被頻繁訪問修改Access time,優(yōu)化為多次訪問才修改一次該時間)
2、修改文件時,三個時間都會被改變
3、修改屬性時,Change time被改變,而Access、Modify time不會被改變
三、makefile的推導(dǎo)規(guī)則
makefile會自己逐步尋找依賴文件列表,如果沒找到對于依賴文件,將會繼續(xù)向下尋找該依賴文件的依賴方法。
四、實現(xiàn)一個進度條
1、緩沖區(qū)問題
#include <stdio.h> #include <unistd.h> int main() { printf("hello world\n");//如果這里沒有\(zhòng)n,程序?qū)?秒后執(zhí)行打印 //fflush(stdout);//fflush會立即刷新緩沖區(qū) sleep(3); return 0; }
因為\n才會刷新緩沖區(qū)(\r等不會),這個程序printf執(zhí)行完之后,將會休眠3秒,如果沒有\(zhòng)n或者fflush手動刷新緩沖區(qū),hello world將會存放至緩沖區(qū),程序結(jié)束后才執(zhí)行打印。
2、實現(xiàn)倒計時程序
#include <stdio.h> #include <unistd.h> int main() { int cnt=10; while(cnt) { printf("%2d\r",cnt);//2d控制刷新兩位,\r表示回車 fflush(stdout);//手動刷新緩沖區(qū) sleep(1); --cnt; } return 0; }
能夠?qū)崿F(xiàn)從10到計時的程序。
3、進度條的實現(xiàn)
//.h文件 #pragma once #include <stdio.h> #include <unistd.h> #include <string.h> #define NUM 101 #define STYLE '*' extern void processOn(); //.c文件 #include "process.h" void processOn() { int cnt=0; char bar[NUM]; memset(bar,'\0',NUM); char type[4]={'|','/','-','\\'}; while(cnt<=100) { //-100表示占據(jù)屏幕100個空間并左對齊,%%轉(zhuǎn)義為% printf("[%-100s][%d%%][%c]\r",bar,cnt,type[cnt%4]); bar[cnt++]=STYLE; fflush(stdout); usleep(50000); } printf("\n"); }
makefile中不用寫頭文件,編譯器自己會去找。
<>查找方式:直接去庫目錄下查找,如果找不到,報編譯錯誤;
""查找方式:先去代碼所在的路徑下查找,如果找不到,再去庫目錄下查找,如果找不到,報編譯錯誤。
到此這篇關(guān)于Linux下的自動化構(gòu)建工具之make/makefile的用法詳解的文章就介紹到這了,更多相關(guān)Linux自動化構(gòu)建工具內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux Shell腳本系列教程(七):腳本調(diào)試
這篇文章主要介紹了Linux Shell腳本系列教程(七):腳本調(diào)試,本文講解了Bash內(nèi)建調(diào)試功能和自定義調(diào)試功能等內(nèi)容,需要的朋友可以參考下2015-06-06Shell中的循環(huán)語句for、while、until實例講解
這篇文章主要介紹了Shell中的循環(huán)語句for、while、until實例講解,簡單清晰明了,非常不錯的教程,需要的朋友可以參考下2014-06-06Shell調(diào)用curl實現(xiàn)IP歸屬地查詢的腳本
這篇文章主要介紹了Shell調(diào)用curl實現(xiàn)IP歸屬地查詢,文中給大家提到了查詢IP歸屬地的shell腳本,在批量查找數(shù)據(jù)的時候經(jīng)常會遇到,今天給大家分享出來,需要的朋友可以參考下2021-07-07shell向文件中添加新內(nèi)容的實現(xiàn)方法
Shell腳本是一種為shell編寫的腳本程序,下面這篇文章主要給大家介紹了關(guān)于shell向文件中添加新內(nèi)容的實現(xiàn)方法,需要的朋友可以參考下2023-06-06用shell腳本監(jiān)控進程是否存在 不存在則啟動的實例
這篇文章主要介紹了用shell腳本監(jiān)控進程是否存在 不存在則啟動的實例,需要的朋友可以參考下2016-03-03