项目使用Makefile来实现项目代码的编译、连接和清理等。
使用centos5.9 系统),gcc编译器
1、总领Makefile
在项目最外面使用的Makefile,用来一次性编译多个程序(适用于多进程的程序管理)
调试选项
DEBUG_COMPILE_OPT = -g -fno-eliminate-unused-debug-types -Werror $(MY_COMPILE_OPT)
#MY_COMPILE_OPT 是自己的编译选项 一般可以在 用户目录下 .bashrc文件中定义优化选项
OPTIMIZE_COMPILE_OPT = -g
编译子目录名
SUB_DIRS = util framework program1 program2 program3 program4 program5export CXX = /usr/bin/g++
.PHONY : all debug release ctags distclean clean $(SUB_DIRS)
all: debug
debug:
@for dir in $(SUB_DIRS); \
do \
MY_COMPILE_OPT='$(DEBUG_COMPILE_OPT)' $(MAKE) -C $$dir || exit 1; \
done
release :
@for dir in $(SUB_DIRS); \
do \
MY_COMPILE_OPT='$(OPTIMIZE_COMPILE_OPT)' $(MAKE) -C $$dir release || exit 1; \
done
ctags:
@ctags -R -h ".c.cpp.h" -o tags
#ctags 快捷命令
distclean:
@find . -iname .\*.d -exec rm \{\} \;
#清除gcc 生成的缓存文件和目标文件和编译的程序
clean:
@for dir in $(SUB_DIRS); \
do \
$(MAKE) -C $$dir clean; \
done
2、子目录Makefile
在各个子目录中的程序编译、连接使用的Makefile,这是其中一个
头文件目录
CXXFLAGS = $(MY_COMPILE_OPT) -g -Wno-deprecated -I../3Party/protobuf-2.2.0/src -I../common -I../protocol -I../framework -Wall -I/usr/local/include/google/gflags `mysql_config --cflags` `xml2-config --cflags`
连接编译第三方的库
CXXLFLAGS = $(MY_COMPILE_OPT) -g -Wall -L../framework -lframework -L../framework -ltinyxml -L../framework -lpthread -lrt -lz -ldl -lgflags `mysql_config --libs_r` `xml2-config --libs`
连接编译自定义库
LIB_SKD = ../framework/libframework.a
产生目标文件(根据源文件)
OBJS = file1.o \
file2.o \
file3.o
SRCS = $(OBJS:%.o=%.cpp)
DEPS = $(OBJS:%.o=.%.d)
目标程序
ALL_TARGETS = program1
all: $(ALL_TARGETS)
include $(DEPS)
$(DEPS): .%.d: %.cpp
@$(CXX) -M $(CXXFLAGS) $< > $@.$$$$; sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; rm -f $@.$$$$
$(OBJS): %.o: %.cpp
$(CXX) -c $(CXXFLAGS) $< -o $@
#编译自己的代码成目标代码,要导入头文件
$(ALL_TARGETS): $(OBJS) $(LIB_SKD)
$(CXX) $(OBJS) -o $@ $(CXXLFLAGS)
#目标文件连接库文件 ,编译生成目标程序
clean:
@rm -rf ./.*.d *.o $(ALL_TARGETS) core *~
#清除 生成的*.o文件和缓存文件 *.d
#distclean 和clean命令 比较有用,有时候程序会有莫名其妙的错误 ,是由于缓存文件(*.o和*.d文件)引起的,清理一下就好了。