簡單makefile實例
1,源文件:
main.cpp
#include <stdio.h>
int main()
{
printf("Hello World\n"); return 0; }
2,編寫makefile
若使用g++命令編譯鏈接程序,可以:
g++ -o hello main.cpp
或
g++ [-o main.o] -c main.cpp
g++ -o hello main.o
若使用make命令,則可以這么編寫makefile文件(兩種寫法分別對應了上面說的兩條g++命令):
提示:
2.1,makefile的基本格式為“目標:依賴 命令”
一個 makefile 主要含有一系列的規則,如下:
A: B
(tab)<command>
(tab)<command>
重要: 每個命令行前都必須有tab符號
舉例來說,一種簡單寫法如下:
main : main.c
gcc main.c –o main
在終端執行make命令就可以得到main文件了
2.2 執行過程
通常make命令會逐行解釋makefile文件,然后執行第一個”目標格式行”及其后的”目標命令行“。直到碰到下一個”目標格式行”為止。
注意這里指的是下一個”目標格式行“,而不是文件末尾。
所以我們把生成最后的可執行文件的makefile代碼放在第一行時,只需要鍵入make就可以。
而有些makefile文件未將生成最后的可執行文件的代碼放在第一行,所以如果make的話,就只能執行到第一個目標格式行的code.
另外,我們使用偽目標讓makefile執行不同的操作,如定制Debug和Release版本,清空中間生成文件,安裝軟件包等等。
2.3, 這里要說明一點的是,clean不是一個文件,它只不過是一個動作名字,其冒號后面為空,make就不會找文件的依賴性,也就不會自動執行其后所定義的命令。
要執行其后的命令,就需要在make 命令后顯式指出這個名字。這樣我們就可以定義一些與編譯無關的命令:打包程序,清理程序等外圍操作等。
用".PHONY {目標名}"定義一個偽目標, 用"make {目標名}"執行該偽目標
.PHONY : clean
clean :
@rm -f main *.o
@echo 'clean'
此時執行make命令,終端會顯示系統執行的每條命令,如果你不想系統顯示它執行的命令,在每條命令的前面加上“@”即可。
hello : main.cpp
g++ main.cpp -o hello clean: rm hello main.o -rf
或
hello: main.o
g++ -o hello main.o main.o : main.cpp g++ -c main.cpp clean: rm hello main.o -rf
3,執行make,進行編譯鏈接,
[root@localhost 0-helloworld]#make
g++ -o hello main.o [root@localhost 0-helloworld]#ll 總用量 20 -rwxr-xr-x 1 root root 6908 11月 26 22:59 hello -rw-r--r-- 1 root root 72 11月 26 22:10 main.cpp -rw-r--r-- 1 root root 1472 11月 26 22:35 main.o -rw-r--r-- 1 root root 144 11月 26 22:51 makefile
4,執行程序
[root@localhost 0-helloworld]#./hello
Hello World
5,清理程序
[root@localhost 0-helloworld]#make clean
rm hello main.o -rf [root@localhost 0-helloworld]#ll 總用量 8 -rw-r--r-- 1 root root 72 11月 26 22:10 main.cpp -rw-r--r-- 1 root root 151 11月 26 23:02 makefile [root@localhost 0-helloworld]#