一、makefile
make是一個命令,而makefile是一個文件。make命令執行時,需要一個 Makefile 文件,以告訴make命令需要怎麼樣的去編譯和鏈接程序。一個工程中的源文件不計數,其按類型、功能、模塊分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要後編譯,哪些文件需要重新編譯,甚至於進行更復雜的功能操作,因為makefile就像一個Shell腳本一樣,其中也可以執行操作系統的命令。makefile
帶來的好處就是――“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟件開發的效率。
舉例:首先建立個test1.c文件
建立makfile文件,對makfile文件進行編寫
注:在依賴方法那行,一定要以Tab鍵開頭
在命令行輸入make
make是如何工作的?
在默認的方式下,也就是我們只輸入make命令。那麼,
1、make會在當前目錄下找名字叫“Makefile”或“makefile”的文件。
2、如果找到,它會找文件中的第一個目標文件(target),在上面的例子中,他會找到“edit”這個文件,並把這個文件作為最終的目標文件。
3、如果edit文件不存在,或是edit所依賴的後面的 .o 文件的文件修改時間要比edit這個文件新,那麼,他就會執行後面所定義的命令來生成edit這個文件。
4、如果edit所依賴的.o文件也不存在,那麼make會在當前文件中找目標為.o文件的依賴性,如果找到則再根據那一個規則生成.o文件。(這有點像一個堆棧的過程)
5、當然,你的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目標文件後定義的命令)。(這是博主百度的哦~)
上面文件內容中,“.PHONY”表示,clean是個偽目標文件。
在依賴關系前加@,可屏蔽細節
二、進度條的簡單實現
建立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;
}
編譯,執行,運行結果:
本文出自 “朔月雲影” 博客,請務必保留此出處http://19940325.blog.51cto.com/10789287/1784329