CROSS_COMPILE = aarch64-himix100-linux_V630- CC = $(CROSS_COMPILE)gcc CPLUS = $(CROSS_COMPILE)g++ INC_DIR = -I./alg_test/inc CFLAGS = -Wall $(INC_DIR) -O2 -g -Wall -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable CFLAGS += -mcpu=cortex-a73.cortex-a53 -fno-aggressive-loop-optimizations -lstdc++ -ldl -ffunction-sections -fdata-sections -ftree-vectorize SOURCES = $(wildcard ./alg_test/src/*.c) OBJECTS = $(patsubst %.c, %.o, $(SOURCES)) SOURCES_CPP = $(wildcard ./alg_test/src/*.cpp) OBJECTS_CPP = $(patsubst %.cpp, %.o, $(SOURCES_CPP)) TARGET = arm_alg all : $(TARGET) %.o:%.cpp $(CPLUS) $(CFLAGS) -c -o $@ $< %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< $(TARGET): $(OBJECTS) $(OBJECTS_CPP) $(CC) $(CFLAGS) -o $@ $(OBJECTS) $(OBJECTS_CPP) -lpthread -lm chmod -R 777 $(TARGET) rm -f *.o mv arm_alg ./bin clean: rm -rf $@. rm ./*.o $(TARGER) $(OBJECTS) $(OBJECTS_CPP) -f
直接可能看的不大明白因為里面用到的參數是比較多的下面具體分析。
該makefile文件是讓交叉編譯工具去編譯一個程序,等好的左邊都是定義的變量,如CROSS_COMPILE等等,$后面相當於當做參數傳遞,前三行相當於把編譯工具確定,如果是c文件就在后面加上gcc,如果是cpp文件就在后面加上g++,然后和前面的交叉編譯前綴連在一起構成完整的交叉編譯工具名稱。
其后三行INC_DIR與CFLAGS是負責確定編譯的配置參數,后面是放在編譯工具之后,可以理解為放在gcc之后的參數,這里是放在交叉編譯工具之后
-I(大寫的i)加上路徑表示頭文件路徑,告訴編譯器到這里尋找頭文件
-Wall表示編譯之后顯示所有警告
-O2表示編譯優化等級為2級,0-3可選擇
-g表示可執行程序包含調試信息
-Wunused-but-set-variable
每當一個局部變量被分配時發出警告,此警告由啟用-Wall 。
-Wunused-function
每當聲明靜態函數但未定義或未使用非內聯靜態函數時發出警告。此警告由啟用-Wall
-mpcu=type表示處理器類型,這里是交叉編譯所以要明確,如果不需要交叉編譯可省略
-fno-aggressive-loop-optimizations表示無需優化的循環結構
-l(小寫的l)加上動態庫,如-lm 鏈接數學庫, -lptread 鏈接線程庫,當然也可以鏈接自己編譯的庫,不過需要放到指定尋找的路徑下
再其后的四行時批量操作c文件生成o文件 這里就體現出makefile的方便之處
這里用到了makefile中的兩個函數wildcard和patsubst
wildcard表示擴展通配符,patsubst表示將路徑中所有的c文件以列表形式轉換為o文件
SOURCES = $(wildcard ./alg_test/src/*.c)
OBJECTS = $(patsubst %.c, %.o, $(SOURCES))
以上兩句就是說將當前文件夾下的c文件以絕對路徑保存到sources中,接着將該路徑傳遞到下句所有的c文件生成o文件,但這里並不是真正生成了o文件,而是生成列表,就是說生成一種對應關系,比如a.c對應a.o,b.c對應b.o
以上是所有的准備工作,下面才是具體的指令部分
Target表示最終生成可執行文件,叫做arm_alg
all:表示執行make指令后從該句執行
%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<
這兩句是生成o文件的指令,%.o和%.c則是上述通配符函數生成的自動對應列表,$@表示目標文件,$<表示依賴文件
以上是一個完整的makefile文件的分析,下面自己動手寫一個簡單的程序測試一下
新建一個testmakefile,在該文件夾下新建alg文件夾,bin文件夾,makefile文件,alg下新建src,inc兩個文件夾,在src中建立a.cpp,b.cp和main.cpp,inc中建立a.h和b.h,兩個cpp子文件中分別寫函數func1和func2用來打印輸出
最后的makefile如下所示,由於程序相當的簡單,根本用不到嚴格的參數配置,我們就簡單的添加幾個表示一下
CROSS_COMPILER=g CC=$(CROSS_COMPILER)cc CXX=$(CROSS_COMPILER)++ INC_DIR=-I ./alg/inc CFLAGS=-Wall $(INC_DIR) -O1 -g SOURCES_C=$(wildcard ./alg/src/*.c) OBJECTS_C=$(patsubst %.c,%.o,$(SOURCES_C)) SOURCES_CPP=$(wildcard ./alg/src/*.cpp) OBJECTS_CPP=$(patsubst %.cpp,%.o,$(SOURCES_CPP)) %.o:%.c $(CC) $(CFLAGS) -c -o $@ $< %.o:%.cpp $(CXX) $(CFLAGS) -c -o $@ $< Target=test_alg all:$(Target) $(Target): $(OBJECTS) $(OBJECTS_CPP) $(CXX) $(CFLAGS) -o $@ $(OBJECTS_C) $(OBJECTS_CPP) chmod -R 777 $(Target) mv test_alg ./bin clean: rm ./bin/test_alg $(TARGER) $(OBJECTS) $(OBJECTS_CPP)
以上轉載於 : makefile 編寫