小工程可以使用的Makefile模板,可交叉编译c,c++文件,从网上找来的只支持c文件的模板上更改了下。
# 交叉编译工具链,需要更改
CROSS_COMPILE= arm-linux-gnueabihf-
CC = $(CROSS_COMPILE)gcc
CXX = $(CROSS_COMPILE)g++
LINK = $(CROSS_COMPILE)g++
AS = as
LD = ld
#CC = gcc
CPP = $(CC) -E
AR = ar
NM = nm
# 程序的默认名称,需要更改
TARGET = app_gateway
# 命令行中使用p=X或P=X修改默认程序名称
ifeq ("$(origin p)", "command line")
TARGET = $(p)
endif
ifeq ("$(origin P)", "command line")
TARGET = $(P)
endif
DIRS = $(shell find . -type d)
# 找出所有的.c .h .a .so文件及目录
CFILES_DIR = $(shell find . -type f -name "*.c")
CFILES = $(notdir $(CFILES_DIR))
HFILES_DIR = $(shell find . -type f -name "*.h")
HFILES = $(notdir $(HFILES_DIR))
HDIRS = $(sort $(dir $(HFILES_DIR)))
AFILES_DIR = $(shell find . -type f -name "lib*.a")
AFILES = $(notdir $(AFILES_DIR))
ADIRS = $(sort $(dir $(AFILES_DIR)))
SOFILES_DIR = $(shell find . -type f -name "lib*.so")
SOFILES = $(notdir $(SOFILES_DIR))
SODIRS = $(sort $(dir $(SOFILES_DIR)))
# 包含所有含有.h文件的目录
INCLUDES += $(HDIRS:%=-I%)
$(warning INCLUDES : [ $(INCLUDES) ])
CFLAGS += $(INCLUDES)
# 编译标志 -Werror
CFLAGS += -Wall -rdynamic
CFLAGS += -g -MD -O2 -static
CFLAGS += -Wno-unused-parameter -Wno-unused-variable
CPPFLAGS += $(CFLAGS) -std=c++11
# 含有.a .so文件的目录
LDFLAGS += $(ADIRS:%=-L%)
LDFLAGS += $(SODIRS:%=-L%)
#LDFLAGS += -L./openssl/lib/
# 引用库文件
LDFLAGS += $(AFILES:lib%.a=-l%)
LDFLAGS += $(SOFILES:lib%.so=-l%)
LDFLAGS += -lpthread
LDFLAGS += -lm
$(warning LDFLAGS : [ $(LDFLAGS) ])
# 包含所有的目录
VPATH = $(DIRS)
# 所有的.c/.cpp文件,需要更改
#CFILES = $(CFILES)
SOURCES = cJSON.c mod_mqtt.c
SOURCESCXX = main.cpp drv_can.cpp mod_can.cpp devicemgr.cpp
$(warning SOURCES : [ $(SOURCES) ])
$(warning SOURCESCXX : [ $(SOURCESCXX) ])
# 目标及依赖
OBJS = $(SOURCES:%.c=obj/%.o) $(SOURCESCXX:%.cpp=obj/%.o)
DEPS = $(SOURCES:%.c=obj/%.d) $(SOURCESCXX:%.cpp=obj/%.d)
###########################################################
#CC编译时,库的依赖要放在文件之后 $(CC) $^ -o $@ $(LDFLAGS)
.PHONY : all clean cleanall
all : $(TARGET)
$(TARGET) : $(OBJS)
@echo
@echo "Linking..."
@echo
$(LINK) $^ -o $@ $(LDFLAGS)
@echo
@echo "enjoy < $(TARGET) > Good Luck."
@echo
obj/%.o : %.c
@mkdir -p obj
$(CC) $(CFLAGS) -c $< -o $@
obj/%.o : %.cpp
-@mkdir -p obj
$(CXX) $(CPPFLAGS) -c $< -o $@
clean :
rm -rf $(OBJS) $(DEPS) obj
cleanall :
rm -rf $(OBJS) $(DEPS) obj $(TARGET)
# 包含生成的依赖关系
sinclude $(DEPS)