簡單編寫makefile

2021-09-03 08:00:34 字數 3447 閱讀 7056

乙個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將這些需要執行的步驟寫進去。因...