具体讲解:
#this is annotation
CCFILES += $(wildcardsrc/*.cpp)
利用wildcard函数获取src目录下所有.cpp文件,并赋值给自定义变量CCFILES。其中#号是makefile的注释符号,同shell。
SRCDIR:= ./src/
自定义变量SRCDIR用于指明.cpp源文件所在目录。SRCDIR变量在command中出现时,以类似于宏替换的方式将其载入command中。
VPATH= src:./include:./src/xmlparser:./lib
指明makefile寻找依赖项时,若当前目录不存在,则去VPATH指明的目录去寻找。各目录以“:”号隔开。
CC := icpc
自定义变量CC指明为编译器为icpc,表示使用Intelc++ Compiler作为项目的编译器。
FLAGS := -openmp -openmp-report-vec-report -O2
指明编译选项。
OECT :=file_intece.otinyxml2.o mic_decomposer.o Charset.o network.o buffer.o \
task_queue.o common.o main.o mic_function.o hashtree.onodeconfig.o md5_mic.o ntlm_mic.o
指明目标文件;其中反斜杠\表示一行还未结束。
ALG.out : $(OECT)
$(CC) $(FLAGS) -o ALG.out $(OECT) ./lib/libxmlextern.a
此处表示makefile需要生成的第一个目标文件,也就是不指明目标文件的make命令默认生成的目标文件。加入icpc的编译选项后,根据ALG.out依赖的目标文件和静态链接库项./lib/libxmlextern.a,进行连接生成可执行文件ALG.out。
file_intece.o :global.htinyxml2.h file_intece.h $(SRCDIR)file_intece.cpp
$(CC) $(FLAGS) -c$(SRCDIR)file_intece.cpp
指明file_intece.o的依赖项并编译成二进制文件file_intece.o。后面的每个目标文件皆是如此做法。
.PHONY clean
clean:
rm -f *.o *.out
使用.PHONY关键字,指明clean是伪目标,仅作标签使用。此处不依赖与任何项,使用方法是显示调用make clean,用于执行rm操作。但也可以添加依赖项,如:
all : prog1 prog2 prog3
.PHONY : all
则all依赖于prog1 prog2 prog3这三个文件,那么使用 makeall则可以生成三个目标文件prog1、prog2和prog3。若将all放在所有目标文件的前面,则使用make即可,无需指明make all,原因是make命令将makefile中第一个出现的目标作为最终目标,若不放在最前面,则必须指明make all。
= 是最基本的赋值,以makefile中最后赋值为准;
:= 是覆盖之前的值,以当前赋值为准;
?= 是如果没有被赋值过就赋予等号后面的值;
+= 是添加等号后面的值,即拼接等号后面的值。
其中=和:=的区别见如下代码:
(1)“=”
make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-40643-2.html
芝麻打成粉了
桃子