本文共 5540 字,大约阅读时间需要 18 分钟。
CC := g++CFLAGS := -g -Wall -c -std=c++17 -I/usr/local/libusb-1.0.24/include/LDFLAG := -L/usr/local/libusb-1.0.24/lib/ -lusb-1.0SRCS := $(wildcard *.cpp)OBJS := $(patsubst %cpp,%o, $(SRCS))TARGET := testall:$(TARGET)%.o:%.cpp $(CC) $(CFLAGS) $^ -o $@$(TARGET):$(OBJS) $(CC) $(LDFLAG) $^ -o $@clean: rm -rf $(TARGET) *.o
“=”
make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:
x = fooy = $(x) barx = xyz
在上例中,y的值将会是 xyz bar ,而不是 foo bar 。
“:=”
“:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。
x := fooy := $(x) barx := xyz
在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。
文件存放说明:
Makefile文件的写法:
INC_DIR=./includeBIN_DIR=./binSRC_DIR=./srcOBJ_DIR=./objSRC=${wildcard ${SRC_DIR}/*.c}OBJ=${patsubst %.c, $(OBJ_DIR)/%.o, ${notdir ${SRC}}}#用于查看变量的值#test:# echo $(SRC)# echo $(OBJ)TARGET=mainBIN_TARGET=${BIN_DIR}/${TARGET}CC=gccCFLAGS= -g -Wall -I${INC_DIR}${BIN_TARGET}:${OBJ} ${CC} ${OBJ} -o $@${OBJ_DIR}/%.o:${SRC_DIR}/%.c ${CC} ${CFLAGS} -c $< -o $@clean: find ${OBJ_DIR} -name *.o -exec rm -rf {} \;
Execute command; true if 0 status is returned. All following arguments to find are taken to be argu‐
ments to the command until an argument consisting of;' is encountered. The string
{}’ is replaced by the current file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it is alone, as in some versions of find. Both of these constructions might need to be escaped (with a `\’) or quoted to protect them from expansion by the shell. See the EXAMPLES sec‐ tion for examples of the use of the -exec option. The specified command is run once for each matched file. The command is executed in the starting directory. There are unavoidable security problems surrounding use of the -exec action; you should use the -execdir option instead.
文件存放说明:
Makefile文件的写法:
CUR_DIR=add/sub/mutis/main文件所处的目录ADD_DIR=${CUR_DIR}/addSUB_DIR=${CUR_DIR}/subMUL_DIR=${CUR_DIR}/multisMAIN_DIR=${CUR_DIR}/mainINC_DIR= -I${ADD_DIR} \ -I${SUB_DIR} \ -I${MUL_DIR} \ -I${MAIN_DIR}SRC = ${wildcard ${ADD_DIR}/*.c} \ ${wildcard ${SUB_DIR}/*.c} \ ${wildcard ${MUL_DIR}/*.c} \ ${wildcard ${MAIN_DIR}/*.c}OBJ = ${patsubst %.c, %.o, ${SRC}}TARGET=mainCC=gccCCFLAGS=-g -Wall ${INC_DIR}${TARGET}: ${OBJ} ${CC} ${notdir ${OBJ} } -o $@ echo "Compile done."${OBJ}:${SRC} $(CC) ${CCFLAGS} -c $? clean: rm -f ${OBJ} rm -f *.o rm -f *~ rm -f ${TARGET} echo "Clean done."
改进版本:
CUR_DIR=/home/plv/Desktop/demo_multi_makefile/test3ADD_DIR=${CUR_DIR}/addSUB_DIR=${CUR_DIR}/subMUL_DIR=${CUR_DIR}/multisMAIN_DIR=${CUR_DIR}/mainINC_DIR= -I${ADD_DIR} \ -I${SUB_DIR} \ -I${MUL_DIR} \ -I${MAIN_DIR}SRC = ${wildcard ${ADD_DIR}/*.c} \ ${wildcard ${SUB_DIR}/*.c} \ ${wildcard ${MUL_DIR}/*.c} \ ${wildcard ${MAIN_DIR}/*.c}OBJ = ${patsubst %.c, %.o, ${SRC}}TARGET=mainCC=gccCCFLAGS=-g -Wall ${INC_DIR}${TARGET}: ${OBJ} ${CC} ${OBJ} -o $@ @echo "Compile done."#${OBJ}:${SRC}# $(CC) ${CCFLAGS} -c $? $(OBJ):%.o:%.c @echo "Compiling $< ==> $@" ${CC} ${CCFLAGS} -c $< -o $@clean: @rm -f ${OBJ} @echo "Clean object files done." @rm -f *~ @echo "Clean tempreator files done." @rm -f ${TARGET} @echo "Clean target files done." @echo "Clean done."
说明:
1.@ echo ""
表示执行该条命令,但不输出该命令的内容。
2.改进版本中将
${OBJ}:${SRC} $(CC) ${CCFLAGS} -c $?
替换成了,
$(OBJ):%.o:%.c @echo "Compiling $< ==$@" ${CC} ${CCFLAGS} -c $< -o $@
CC = g++CC_FLAG = -D_NOMNG -D_FILELINE#set your inc and libINC = LIB = -lpthread -L./ -lsvrtool#make target lib and relevant obj PRG = libsvrtool.soOBJ = Log.o#all targetall:$(PRG)$(PRG):$(OBJ) $(CC) -shared -o $@ $(OBJ) $(LIB).SUFFIXES: .c .o .cpp.cpp.o: $(CC) $(CC_FLAG) $(INC) -c $*.cpp -o $*.o.PRONY:cleanclean: @echo "Removing linked and compiled files......; rm -f $(OBJ) $(PRG)
CC = g++CC_FLAG = -D_NOMNG -D_FILELINE#static library use 'ar' command AR = ar#set your inc and libINC = LIB = -lpthread -L./ -lsvrtool#make target lib and relevant obj PRG = libsvrtool.aOBJ = Log.o#all targetall:$(PRG)$(PRG):$(OBJ) ${AR} rv ${PRG} $?.SUFFIXES: .c .o .cpp.cpp.o: $(CC) $(CC_FLAG) $(INC) -c $*.cpp -o $*.o.PRONY:cleanclean: @echo "Removing linked and compiled files......" rm -f $(OBJ) $(PRG)
随机组合、举一反三会写出适合项目的makefile.
转载地址:http://ovfci.baihongyu.com/