Linux下的自動(dòng)化構(gòu)建工具之make/makefile的用法詳解
一、make和makefile的區(qū)別
make是一個(gè)命令,makefile是一個(gè)文件。
二、makefile的原理
1、make的原理詳解
每次生成可執(zhí)行文件時(shí)需要輸入一長(zhǎng)串的gcc········指令是不是感覺很麻煩?makefile存在的意義是為了項(xiàng)目的構(gòu)建。需要表明依賴關(guān)系和依賴方法。

2、臨時(shí)文件的清理
mycode:mycode.c
gcc mycode.c -o mycode
.PHONY:clean
clean:
rm -f mycode
.PHONY表示被該關(guān)鍵字修飾的對(duì)象是一個(gè)偽目標(biāo)。(該偽目標(biāo)總是可被執(zhí)行)
我們?cè)诰帉懲阭akefile后,make一下,就能生成對(duì)應(yīng)的可執(zhí)行程序。如果依賴的文件列表沒有發(fā)生修改,gcc通過判斷mycode.c的Modify time早于mycode的Modify time,說明依賴文件列表沒有修改,那么再次make將會(huì)失?。环粗?,重新編譯將會(huì)成功。
不過多次make clean卻不會(huì)失敗,因?yàn)閏lean被.PHONY修飾,變成了一個(gè)偽目標(biāo),所以clean總是可被執(zhí)行。
3、文件的三個(gè)時(shí)間
[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//最近改動(dòng) Birth: -
1、讀取文件時(shí),Access time被改變,而Modify、Change time不會(huì)被改變(為防止文件被頻繁訪問修改Access time,優(yōu)化為多次訪問才修改一次該時(shí)間)
2、修改文件時(shí),三個(gè)時(shí)間都會(huì)被改變
3、修改屬性時(shí),Change time被改變,而Access、Modify time不會(huì)被改變
三、makefile的推導(dǎo)規(guī)則

makefile會(huì)自己逐步尋找依賴文件列表,如果沒找到對(duì)于依賴文件,將會(huì)繼續(xù)向下尋找該依賴文件的依賴方法。
四、實(shí)現(xiàn)一個(gè)進(jìn)度條
1、緩沖區(qū)問題
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("hello world\n");//如果這里沒有\(zhòng)n,程序?qū)?huì)在3秒后執(zhí)行打印
//fflush(stdout);//fflush會(huì)立即刷新緩沖區(qū)
sleep(3);
return 0;
}
因?yàn)閈n才會(huì)刷新緩沖區(qū)(\r等不會(huì)),這個(gè)程序printf執(zhí)行完之后,將會(huì)休眠3秒,如果沒有\(zhòng)n或者fflush手動(dòng)刷新緩沖區(qū),hello world將會(huì)存放至緩沖區(qū),程序結(jié)束后才執(zhí)行打印。
2、實(shí)現(xiàn)倒計(jì)時(shí)程序
#include <stdio.h>
#include <unistd.h>
int main()
{
int cnt=10;
while(cnt)
{
printf("%2d\r",cnt);//2d控制刷新兩位,\r表示回車
fflush(stdout);//手動(dòng)刷新緩沖區(qū)
sleep(1);
--cnt;
}
return 0;
}
能夠?qū)崿F(xiàn)從10到計(jì)時(shí)的程序。
3、進(jìn)度條的實(shí)現(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個(gè)空間并左對(duì)齊,%%轉(zhuǎn)義為%
printf("[%-100s][%d%%][%c]\r",bar,cnt,type[cnt%4]);
bar[cnt++]=STYLE;
fflush(stdout);
usleep(50000);
}
printf("\n");
}
makefile中不用寫頭文件,編譯器自己會(huì)去找。
<>查找方式:直接去庫目錄下查找,如果找不到,報(bào)編譯錯(cuò)誤;
""查找方式:先去代碼所在的路徑下查找,如果找不到,再去庫目錄下查找,如果找不到,報(bào)編譯錯(cuò)誤。
到此這篇關(guān)于Linux下的自動(dòng)化構(gòu)建工具之make/makefile的用法詳解的文章就介紹到這了,更多相關(guān)Linux自動(dòng)化構(gòu)建工具內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
shell腳本結(jié)合iptables防端口掃描的實(shí)現(xiàn)
這篇文章主要介紹了shell腳本結(jié)合iptables防端口掃描的實(shí)現(xiàn),中間使用了inotify-tools工具,需要的朋友可以參考下2014-05-05
Shell腳本實(shí)現(xiàn)監(jiān)控swap空間使用情況和查看占用swap的進(jìn)程
這篇文章主要介紹了Shell腳本實(shí)現(xiàn)監(jiān)控swap空間使用情況和查看占用swap的進(jìn)程,曾經(jīng)有一段時(shí)間機(jī)器的swap不停上漲,監(jiān)控后發(fā)現(xiàn)是一些java進(jìn)程占用swap空間后,完全不釋放,殺死這些java進(jìn)程后,釋放swap,需要的朋友可以參考下2014-12-12
exit(-1)或者return(-1)shell得到的退出碼為什么是255
exit(-1)或者return(-1)shell得到的退出碼為是255,大家知道為什么嗎?帶著這個(gè)疑問來腳本之家學(xué)習(xí)下吧,本篇文章告訴大家答案2015-10-10
shell隨機(jī)定時(shí)修改密碼change_passwd.sh
這篇文章主要介紹了shell隨機(jī)定時(shí)修改密碼change_passwd.sh,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12
Linux各項(xiàng)目環(huán)境部署記錄(換服務(wù)器部署腳本整理)
每次換便宜的服務(wù)器都要導(dǎo)致環(huán)境重新部署一遍,十分麻煩,于是把每次部署的腳本整理了一下,方便在服務(wù)器上快速進(jìn)行部署,基于?CentOS2023-05-05

