乙個makefile基本的規則:
a: b
(tab)
(tab)
a為目標檔案,b為依賴檔案(可能含有多個),接下來為命令(必須含有tab),操作依賴檔案得到目標檔案
以乙個簡單的示例來演示如何編寫乙個基礎的makefile:
#ifndef file1_h
#define file1_h
#ifdef __cplusplus
extern
"c"#endif
#endif
#include
#include
"file1.h"
using namespace std;
void
file1print()
#include
#include
"file1.h"
using namespace std;
intmain()
根據上述的規則,我們可以寫出如下的makefile:
helloworld: file1.o file2.o
g++ file1.o file2.o -o helloworld
file2.o: file2.cpp
g++-c file2.cpp -o file2.o
file1.o: file1.cpp file1.h
g++-c file1.cpp -o file1.o
clean:
rm -rf *
.o helloworld
在這裡可以看出基本基於規則來寫的,而且先執行file2.cpp,同時在這裡加了一條clean語句,方便清除檔案(*.o即匹配所有字尾為.o的檔案並清除)
來簡單測試一下,得到如下的結果:
可以看到make之後執行的是我們在makefile中編寫的幾條命令,接著我們編譯得到的可執行檔案helloworld,同時測試所編寫的clean語句,得到如下結果:
到這裡就可以簡單編寫一下makefile了,再上一層樓,簡單使用變數!
為什麼需要在makefile中引入變數呢?有時出現在makefile中的引數重複出現或依賴項太長等原因,導致makefile編寫效率低,這個時候引入變數就可以讓我們的makefile看著更為簡潔,編寫也更為方便要設定乙個變數,只要在一行的前端寫下這個變數的名字,後面跟乙個「=」號,後面跟要設定的這個變數的值即可。以後要引用這個變數,只寫乙個「$」符號,後面是在括號裡的變數名即可
那我們將上面的makefile簡單修改一下,引入變數,如下:
objs = file1.o file2.o
xx = g++
cflags =
-wall -o -g
helloworld : $(objs)
$(xx) $(objs)
-o helloworld
file2.o:file2.cpp file1.h
$(xx) $(cflags)
-c file2.cpp -o file2.o
file1.o:file1.cpp file1.h
$(xx) $(cflags)
-c file1.cpp -o file1.o
clean:
rm -rf *
.o helloworld
在這裡可以發現,g++這一操作重複出現,可以以變數代替,在這裡我們還新增了乙個變數cflags,這個變數被加入到g++操作中,可以簡單分析一下這個變數
cflags = -wall -o -g:配置編譯器設定,並把它賦值給cflags變數,其中每個部分含義為:1. -wall:輸出所有的警告資訊;2.-o:編譯時進行優化;3.-g:表示編譯debug版本
來make一下,得到以下結果(可以看到變數在執行時被替換):
新增變數也比較簡單及容易理解,但我們很容易發現其缺點,即當我們新增乙個檔案到我們的專案中時,我們就得修改我們的makefile,這樣也顯得較為繁雜,所以嘗試引入內嵌函式及內部變數來讓我們編寫的makefile有較好的相容性
先將上述的makefile改寫,然後再來詳細解析:
cc = gcc
xx = g++
target = helloworld
cflags =
-wall -o -g
%.o :%.c
$(cc) $(cflags)
-c $<
-o $@
%.o :
%.cpp
$(xx) $(cflags)
-c $<
-o $@
sources = $(wildcard *
.c *
.cpp)
objs = $(patsubst %
.c,%
.o,$(patsubst %
.cpp,
%.o,$(sources)))
$(target)
: $(objs)
$(xx) $(objs)
-o $(target)
clean:
rm -rf *
.o helloworld
1.首先來看看其中的兩個內嵌函式:
2.接著來認識其中的幾個內部變數:
%
.o :%.c
$(cc) $(cflags)
-c $<
-o $@
在上述語句中表示以.o為字尾的檔案
//例
helloworld: file1.o file2.o
則表示file1.o
更多的了解內部變數關於內部變數
了解了這些,可以來編譯此makefile:
到這裡我們的簡單makefile編寫就算結束了,想要編寫極為出色的makefile,還需潛心學習!!!
--------------------------------------------get------------------------------------------
簡單makefile的編寫
編寫簡單的makefile
假如有乙個上百個檔案的 構成的專案,如果只是對其中乙個或少數幾個檔案進行了修改,若用gcc編譯工具就不得不把整個專案裡的檔案重新編譯一遍。編譯過程分為編譯 彙編鏈結等階段。其中,編譯階段僅檢查語法錯誤以及函式與變數的宣告是否正確,在鏈結階段則主要完成函式鏈結和全域性變數的鏈結。因此,沒有改動的源 根...
簡單的makefile編寫
cc gcc cflags wall i home coc target sysroots corei7 64 poky linux usr include libxml2 ldflags l home coc target sysroots corei7 64 poky linux usr lib...
簡單Makefile的編寫
在乙個較大的工程中,工程的原始檔按不同的型別 功能 模組分類,這樣給我們在編譯的過程中就增加了較大的工程量,並且有些還有可能要進行一些較為複雜的操作。編譯一次還可以,但我們在除錯的過程中不可能只編譯一次,為了解決這個麻煩,做到一勞永逸。我們就可以通過編寫makefile將這些需要執行的步驟寫進去。因...