makevar: (预定义一些变量,包括编译器,g++/gcc编译的参数,全局宏定义等,该文件会包含在Makefle中)
KE := make
CC := gcc
CXX := g++
CXXFLAGS := -std=c++11 -Wall -fPIC
CFLAGS := -Wall -fPIC
SHARED := -shared
DEFINE_FLAGS := -DNO_ALIGN
ifeq ($(g), y)
CXXFLAGS += -g
CFLAGS += -g
else
CXXFLAGS +=
CFLAGS +=
endif
ifeq ($(d), y)
DEFINE_FLAGS += -D_XML_DESC_PATH_CHANGE -DCLOUD_PLATFORM -DSIFTGPU_NO_DEVIL -DCUDA_SIFTGPU_ENABLED -DCUDA_ENABLED
endif
Makefile:
########################################################
#当前目录
CurDir=$(shell pwd)
#代码库根目录
RootDir=$(CurDir)
include ${RootDir}/makevar
LIB3RD_DIR=$(CurDir)/./lib_static
########################################################
#头文件目录
INCLUDE := -I${LIB3RD_DIR}/boost_1_72_0/include -I${LIB3RD_DIR}/FreeImage-3.18.0/include -I${LIB3RD_DIR}/glew-2.1.0/include -I./src -I./lib -I/usr/local/cuda-10.0/targets/x86_64-linux/include -I/usr/include/mysql
#依赖库目录
TDLIBS := -L/usr/local/lib -lboost_program_options -lboost_filesystem -lgflags -L/usr/local/lib64 -lceres -lglog -L/usr/lib -lfreeimage -L/lib64 -lGLU -L/usr/lib64 -lpthread -lGL -ldl -lGLEW -L/usr/local/cuda-10.0/targets/x86_64-linux/lib/stubs -lcuda -L/usr/local/cuda-10.0/targets/x86_64-linux/lib -lcudart -L/opt/data/vlfeat-0.9.21/bin/glnxa64 -lvl -L/usr/lib/x86_64-linux-gnu -lOpenGL -L./lib/SiftGPU -lProgramCU -lmysqlclient
LIBRARY :=
#过滤的文件,指定哪些源文件不需要编译
FilterFiles_CPP :=
FilterFiles_C := getopt.c
FilterFiles := $(FilterFiles_C) $(FilterFiles_CPP)
FilterFiles := $(addprefix %/,$(FilterFiles))
SOURCES_ALL := $(shell find . -name "*.cpp" -o -name "*.c" -o -name "*.cu")
SOURCES := $(filter-out $(FilterFiles), $(SOURCES_ALL))
SOURCES_CU := $(filter %.cu, $(SOURCES))
SOURCES_C := $(filter %.c, $(SOURCES))
SOURCES_CPP := $(filter %.cpp, $(SOURCES))
OBJECTS_CU := $(addsuffix .o, $(basename $(SOURCES_CU)))
OBJECTS_C := $(addsuffix .o, $(basename $(SOURCES_C)))
OBJECTS_CPP := $(addsuffix .o, $(basename $(SOURCES_CPP)))
OBJECTS :=$(OBJECTS_CU) $(OBJECTS_C) $(OBJECTS_CPP)
#OBJECTS := $(SOURCES:.cpp=.o)
#DEPS := $(SOURCES:.cpp=.d)
MAIN := main
#######################################################
#test:
# @echo $(SOURCES)
# @echo $(OBJECTS)
all:$(MAIN)
%.d: %.cu
@set -e; rm -f $@;
nvcc $(INCLUDE) -MM $< | sed -e 's,.*\.o[ :]*,$*.o : ,g' > $@;
%.d: %.c
@set -e; rm -f $@;
$(CC) $(INCLUDE) -MM $< | sed -e 's,.*\.o[ :]*,$*.o : ,g' > $@;
%.d: %.cpp
@set -e; rm -f $@;
$(CXX) $(INCLUDE) -MM $< | sed -e 's,.*\.o[ :]*,$*.o : ,g' > $@;
#sinclude $(SOURCES:.cpp=.d)
%.o: %.c
$(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@
%.o: %.cu
nvcc $(INCLUDE) -c $< -o $@
%.o:%.cpp
$(CXX) $(CXXFLAGS) $(DEFINE_FLAGS) $(INCLUDE) -c $< -o $@
$(MAIN):$(OBJECTS)
$(CXX) $(CXXFLAGS) $(OBJECTS) $(TDLIBS) $(LIBRARY) -o $@
.PHONY: clean
clean:
@echo "clean project start"
rm -rf $(MAIN) $(OBJECTS)
find . -name "*.d" | xargs rm -rf
@echo "clean project finished"
########################################################
执行命令:
make:直接编译
make d=y:会加入预定义宏
make g=y:会生成调试信息,可用gdb调试生成的可执行程序