前面文章介绍了C++编译过程:预处理、编译、汇编、链接,内容比较简单,只要会使用命令行,就能根据文章的内容实践操作,直观的了解编译全过程。
一个项目往往不只一两个cpp文件,此时命令行编译的方式就会显得捉襟见肘。然而在实际项目中,有序构建并不需要开发人员投入太多精力,这就必须要用到编译脚本,了解一两个常用命令,就可以搞定这个复杂的过程。
如果要说什么是C++开发中可以真正做到一劳永逸的事情,那就是编译脚本。编译脚本是一个规则描述文件,配合工具就可以完成编译,其维护成本极低,只需要参考模板简单改改,就可以拿来直接用,岂不美哉。
make与Makefile
make是上个世纪70年代诞生的工具,能够沿用至今,必属经典。
大型工程的编译面临依赖多、耗时长的问题,有时候你只改了一小段代码,却要等好几十秒甚至几分钟来等待编译结果。在企业级的中心化构建系统中,还可能会存在队列等待的问题。
其实大型工程也是基于一些基础的小工程构建的,将大型工程用可插拔的理念,拆分成一个个小单元,那么在这些小的单元中,其实用不到太复杂的构建系统,选择make可以快速验证demo程序是否符合预期。没有RPC、网络、权限校验、流程等诸多工程问题。
make指令需要一个构建规则,这个规则默认放在Makefile中,当然也可以通过-f参数指定规则文件。话不多说,直接上菜:
$(shell if [ ! -d sbin ]; then mkdir sbin; fi;)
TAR := ./sbin/cppcompiletemplate
CXX := g++ # -m32
SOURCES :=$(wildcard *.cpp) $(wildcard *.c) $(wildcard *.hpp) $(wildcard *.cc)
AllDirs := $(shell ls -R | grep '^\./.*:$$' | awk '{gsub(":","");print}' | grep -vE 'cmakebuild|sbin')
$(info AllDirs: $(AllDirs))
SOURCES += $(foreach subdir,$(AllDirs),$(wildcard $(subdir)/*.cpp) $(wildcard $(subdir)/*.c)) # 遍历子目录
COPTION := -W -Wall -Wfatal-errors -fpermissive # -Werror -Wshadow -Wdouble-promotion -fno-common -Wconversion
#COPTION += -Wno-unused-function -Wno-error=missing-field-initializers
CFLAGS := -pthread -std=c++11 $(COPTION)
CFLAGS_DEBUG := -g -O0
CFLAGS_RELEASE := -s -O2 -static-libstdc++ -static-libgcc # -static
###############################################################################################################
DEFS := #-DNDEBUG
CFLAGS += # -pg
INC := # -I ./3rdlib/jsoncpp/include
LIB := # ./3rdlib/jsoncpp/lib/libjsoncpp.a
LFLAGS := -pthread #-lrt -ldl
###############################################################################################################
all: $(TAR)
debug: