Makefile簡單編寫實例


介紹一下Makefile的簡單編寫例子。

編寫Makefile的規則就是:

目標文件:依賴文件
(tab)編譯規則

現在我有一個文件目錄結構為:

解釋一下這幾個文件。首先我創建makefile目錄,底下有一個include目錄和src目錄。include目錄存放一個head.h頭文件,是我們src中所有cpp文件都要引用的頭文件。

這四個cpp文件就是實現加減乘除的功能。把add.cpp看一下就知道了:

#include "head.h"

int add(int a, int b)
{
    return a + b;
}

其余都一樣,做各自的運算而已。而main.cpp中我調用了它們:

int main(int argc, char const *argv[])
{
	printf("sum = %d\n", add(10, 3));
	printf("mul = %d\n", mul(10, 3));
	printf("sub = %d\n", sub(10, 3));
	printf("div = %lf\n", div(10, 3));
	return 0;
}

直接編寫,易於理解

現在我們要實現的功能就很明了了,編譯這幾個cpp,生成一個可執行文件,使得我們能夠正確運行結果。這里面我寫了兩個Makefile文件,第一個是Makefile_SB(改名之后),這個用來理解makefile的編寫規則很有用:

main:main.o add.o mul.o sub.o div.o
	g++ -o main add.o mul.o sub.o div.o main.o
main.o:main.cpp
	g++ -c -I ../include main.cpp
add.o:add.cpp ../include/head.h
	g++ -c -I ../include add.cpp
mul.o:mul.cpp ../include/head.h
	g++ -c -I ../include mul.cpp
sub.o:sub.cpp ../include/head.h
	g++ -c -I ../include sub.cpp
div.o:div.cpp ../include/head.h
	g++ -c -I ../include div.cpp
.PHONY:clean
clean:
	rm -f *.o

以上,我們遵循我們的規則:

目標文件:依賴文件
(tab)編譯規則

首先,main是我們最后要生成的可執行文件,它依賴於所有的.o文件,編譯規則就是直接g++ -o .o文件即可。

然后,我們的.o文件呢,又依賴於.c文件,所以下面也要寫。其中要注意,頭文件在上層目錄的include下,所以要加上:

-I ../include

至於.PHONY,是一個偽目標,我們真正的目標都是會生成的,而clean只是我們清除文件使用的,它並不生成一個目標文件,所以我們使用偽目標來執行這個命令。

簡潔編寫,使用函數

在我目錄下的Makefile文件,才是我最后使用的那個文件:

#獲取.cpp文件
SrcFiles=$(wildcard *.cpp)
#使用替換函數獲取.o文件
ObjFiles=$(patsubst %.cpp,%.o,$(SrcFiles))
#生成的可執行文件
all:main
#目標文件依賴於.o文件
main:$(ObjFiles)
	g++ -o $@ -I ../include $(SrcFiles)
#.o文件依賴於.cpp文件,通配使用,一條就夠
%.o:%.cpp
	g++ -c -I ../include $<

.PHONY:clean all

clean:
	rm -f *.o
	rm -f main 

有了我們上面的規則講解之后,這個就能很好的理解。先介紹兩個函數:

  • wildcard函數,就是獲取指定的文件
  • patsubst函數,有替換功能。

而SrcFiles和ObjFiles都是變量,它不用特別的定義,直接寫出來就是定義了。

再寫一下其它符號的意義,記住就行了:

  • $(Files),取File變量的值。
  • $@ 目標文件
  • $^ 全部依賴
  • $< 第一個依賴
  • $? 第一個變化的依賴


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM