编辑代码

#CROSS_COMPILE=/opt/zxw/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf/bin/
#CC=$(CROSS_COMPILE)/arm-linux-gnueabihf-gcc
CC=gcc       #编译工具
#CFLAGS = -O  -lm -fpermissive  #lib文件也链接上,之前需要连接静态库

#LIBS = -lpthread -lstdc++ -pthread -w -lrt -lke_mqtt_lib_static -lm -lanalysis -lpaho-mqtt3c
#LIBS = -lpthread -lstdc++ -pthread -w -lrt -lm -lanalysis -lpaho-mqtt3c
#LIBS =  -L/usr/lib -lpthread -pthread -w -lrt -lanalysis -lm  -lpaho-mqtt3c -L/lib
#LIBS = -L./ -L../lib -L../../lib -lanalysis -lpthread -lstdc++ -pthread -w -lrt -lm -lpaho-mqtt3c -lsg
#COMMON_INCLUDE = -I../include -I./

PROG = ./app_test
#生成的目标 当前目录下

SRC_CXX = ./hk_camera.c ./crc.c ./main.c
#需要编译的文件


OBJS = $(SRC_CXX:.c=.o)
#目标.o文件的生成依赖于目标.c文件

.PHONY:all
#对这句话的解释
#.PHONY: clean
    # means the word "clean" doesn't represent a file name in this Makefile;
    # means the Makefile has nothing to do with a file called "clean" in the same directory.

#all目标都表示如果你调用它,make将会构build完成所需的所有东西 。 这通常是一个虚拟目标,它不会创build任何文件,而仅仅依赖于其他文件
#带@符,这条命令仅执行,不会打印在缓冲区
#如果#在行首的话,makefile不会做任何动作。
#但是如果#号以tab开头,makefile虽然不会执行,但是会回显到终端上。
#用@:在以tab开头的情况和#在行首的情况是一样的。
#@$(CC) -o $(PROG) $(CFLAGS) -O2 -Wall $(LIBS) $(OBJS) libke_mqtt_lib_static.a
all:$(OBJS) 
	@$(CC) -o $(PROG) -O2 -Wall $(OBJS)
	@echo "Build done $(PROG)...OK"
	@echo "****************************"
	@echo "*                          *"
	@echo "*    app_test start run    *"
	@echo "*                          *"
	@echo "****************************"
	@$(PROG)
	
#-Wno-write-strings:
#会忽略掉C++ char * 转const char  *的警告,这样并不会很安全;
#@$(CC) -o $@ -c $(CFLAGS) -Wno-write-strings $(COMMON_INCLUDE) $(LIBS) $<
#下边的第一命令是上面命令的简化版,类似于gcc -o main.o -c main.c,$@目标文件,$<第一个依赖的文件
$(OBJS):%.o:%.c
	@$(CC) -o $@ -c $<      
	@echo "Compling $<...OK"

clean:
	@rm -rf $(OBJS) $(PROG)
	@echo "Clean done!"