linux——學習篇(三)之makefile的簡單應用及實現簡單的進度條

1、makefile編程

     make是一個命令,而makefile是一個文件。make命令執行時,須要一個 Makefile 文件,以告訴make命令須要怎麼樣的去編譯和連接程序。一個工程中的源文件不計數,其按類型、功能、模塊分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些文件須要先編譯,哪些文件須要後編譯,哪些文件須要從新編譯,甚至於進行更復雜的功能操做,由於makefile就像一個Shell腳本同樣,其中也能夠執行操做系統的命令。makefile 帶來的好處就是——「自動化編譯」,一旦寫好,只須要一個make命令,整個工程徹底自動編譯,極大的提升了軟件開發的效率。ide

舉例:首先創建個test1.c文件spa

wKioL1dK3UWRLdXIAAA3F480PVo356.png-wh_50

創建makfile文件,對makfile文件進行編寫操作系統

wKioL1dK4C2A8N0GAACD8Ng5kMQ136.png-wh_50

注:在依賴方法那行,必定要以Tab鍵開頭
命令行

在命令行輸入make3d

wKioL1dK4QPTxv2TAADclsHHQss306.png-wh_50

make是如何工做的?
在默認的方式下,也就是咱們只輸入make命令。那麼,
一、make會在當前目錄下找名字叫「Makefile」或「makefile」的文件。
二、若是找到,它會找文件中的第一個目標文件(target),在上面的例子中,他會找到「edit」這個文件,並把這個文件做爲最終的目標文件。
三、若是edit文件不存在,或是edit所依賴的後面的 .o 文件的文件修改時間要比edit這個文件新,那麼,他就會執行後面所定義的命令來生成edit這個文件。
四、若是edit所依賴的.o文件也不存在,那麼make會在當前文件中找目標爲.o文件的依賴性,若是找到則再根據那一個規則生成.o文件。(這有點像一個堆棧的過程)
五、固然,你的C文件和H文件是存在的啦,因而make會生成 .o 文件,而後再用 .o 文件生命make的終極任務,也就是執行文件edit了。
這 就是整個make的依賴性,make會一層又一層地去找文件的依賴關係,直到最終編譯出第一個目標文件。在找尋的過程當中,若是出現錯誤,好比最後被依賴的 文件找不到,那麼make就會直接退出,並報錯,而對於所定義的命令的錯誤,或是編譯不成功,make根本不理。make只管文件的依賴性,即,若是在我 找了依賴關係以後,冒號後面的文件仍是不在,那麼對不起,我就不工做啦。
經過上述分析,咱們知道,像clean這種,沒有被第一個目標文件直接或間接關聯,那麼它後面所定義的命令將不會被自動執行,不過,咱們能夠顯示要make執行。即命令——「make clean」,以此來清除全部的目標文件,以便重編譯。
因而在咱們編程中,若是這個工程已被編譯過了,當咱們修改了其中一個源文件,好比file.c,那麼根據咱們的依賴性,咱們的目標file.o會被重編譯 (也就是在這個依性關係後面所定義的命令),因而file.o的文件也是最新的啦,因而file.o的文件修改時間要比edit要新,因此edit也會被 從新連接了(詳見edit目標文件後定義的命令)。(這是博主百度的哦~
blog

wKiom1dK6lyS6j97AABXlmuIK74633.png-wh_50

上面文件內容中,「.PHONY」表示,clean是個僞目標文件。ci

wKioL1dK5w_RSbCwAACZy3an4CA142.png-wh_50

在依賴關係前加@,可屏蔽細節
開發

wKioL1dK7g3QPGHzAABaIC2BjvM614.png-wh_50

wKiom1dK7kyRPRiUAACmrBovyjY390.png-wh_50

2、進度條的簡單實現get

創建ProBar.h文件

#pragma once
#include<stdio.h>
#define SIZE 103
#include<unistd.h>
#include<string.h>
void ProBar()
{
    int i=1;
    char ch[SIZE];
    memset(ch,'\0',sizeof(ch));
    ch[SIZE-1]='\0';
    ch[SIZE-2]=']';
    ch[0]='[';
    char circle[]="-\\|/\\0";
    while(i<=100)
    {
        ch[i]='#';
        printf("%100s[%d%%]%c\r",ch,i,circle[i%4]);
        i++;
        fflush(stdout);
        sleep(1);
    }
    printf("\n");
}

創建testPro.c文件

#include<stdio.h>
#include"ProBar.h"

int main()
{
    ProBar();
    return 0;

}

wKioL1dLC0-QCUBKAAES0ZqjCJE433.png-wh_50

編譯,執行,運行結果:

wKioL1dLDpuCj2JXAAA_9Z1J5vE263.png-wh_50

相關文章
相關標籤/搜索