日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Linux下的自動化構建工具之make/makefile的用法詳解_linux shell

作者:蔣靈瑜的筆記本 ? 更新時間: 2022-12-02 編程語言

一、make和makefile的區別

make是一個命令,makefile是一個文件。

二、makefile的原理

1、make的原理詳解

每次生成可執行文件時需要輸入一長串的gcc········指令是不是感覺很麻煩?makefile存在的意義是為了項目的構建。需要表明依賴關系和依賴方法。

2、臨時文件的清理

mycode:mycode.c
    gcc mycode.c -o mycode
.PHONY:clean                                                                                               
clean:
    rm -f mycode

.PHONY表示被該關鍵字修飾的對象是一個偽目標。(該偽目標總是可被執行)

我們在編寫完makefile后,make一下,就能生成對應的可執行程序。如果依賴的文件列表沒有發生修改,gcc通過判斷mycode.c的Modify time早于mycode的Modify time,說明依賴文件列表沒有修改,那么再次make將會失敗;反之,重新編譯將會成功。

不過多次make clean卻不會失敗,因為clean被.PHONY修飾,變成了一個偽目標,所以clean總是可被執行。

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,優化為多次訪問才修改一次該時間)

2、修改文件時,三個時間都會被改變

3、修改屬性時,Change time被改變,而Access、Modify time不會被改變

三、makefile的推導規則

makefile會自己逐步尋找依賴文件列表,如果沒找到對于依賴文件,將會繼續向下尋找該依賴文件的依賴方法。

四、實現一個進度條

1、緩沖區問題

#include <stdio.h>    
#include <unistd.h>    
int main()    
{    
    printf("hello world\n");//如果這里沒有\n,程序將會在3秒后執行打印
    //fflush(stdout);//fflush會立即刷新緩沖區
    sleep(3);    
    return 0;    
}   

因為\n才會刷新緩沖區(\r等不會),這個程序printf執行完之后,將會休眠3秒,如果沒有\n或者fflush手動刷新緩沖區,hello world將會存放至緩沖區,程序結束后才執行打印。

2、實現倒計時程序

#include <stdio.h>    
#include <unistd.h>    
int main()    
{    
    int cnt=10;    
    while(cnt)    
    {    
        printf("%2d\r",cnt);//2d控制刷新兩位,\r表示回車                                                                                   
        fflush(stdout);//手動刷新緩沖區   
        sleep(1);    
        --cnt;    
    }    
    return 0;    
}  

能夠實現從10到計時的程序。

3、進度條的實現

//.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表示占據屏幕100個空間并左對齊,%%轉義為%
        printf("[%-100s][%d%%][%c]\r",bar,cnt,type[cnt%4]);   
        bar[cnt++]=STYLE;    
        fflush(stdout);    
        usleep(50000);    
    }    
    printf("\n");    
} 

makefile中不用寫頭文件,編譯器自己會去找。

<>查找方式:直接去庫目錄下查找,如果找不到,報編譯錯誤;

""查找方式:先去代碼所在的路徑下查找,如果找不到,再去庫目錄下查找,如果找不到,報編譯錯誤。

原文鏈接:https://blog.csdn.net/gfdxx/article/details/127564396

欄目分類
最近更新