做学生时, 写个”Hello World”, 若是Linux, 用个g++ main.cpp就可以了. 但对多些的源码工程, 一行命令就难以搞定了. 这个时候, 大家熟悉的make命令就派上用场. 这个书上很少教说, 我在网上边搜边学后折腾了个简单的makefile, 应付简单的工程…
1
| ifeq ($(dd),debug)
export dd := debug
BIN_DIR=./debug
CPPLAGS=-g -pg -fPIC -Wall -D_FILE_OFFSET_BITS=64
BUILDS=$(DIRS) lib test
else #release
export dd := release
BIN_DIR=./release
CPPLAGS=-O3 -fPIC -D_FILE_OFFSET_BITS=64
BUILDS=$(DIRS) lib
endif
TEST=
DIRS=$(BIN_DIR)
BASE_DIR=.
LIB_PATH=$(BASE_DIR)/lib
SHARE_PATH=$(LIB_PATH)
STATIC_PATH=$(LIB_PATH)
SHARE_LIBS=boost_thread
STATIC_LIBS=libboost_system.a libevent.a
INC_PATH=./
SRC_DIRS=./ ./bits ./algo ./ext
SRCS=$(foreach SRC_DIRS,$(SRC_DIRS),$(wildcard $(SRC_DIRS)/*.cxx))
OBJS=$(patsubst %.cxx,%.o,$(SRCS))
INC_SHARE=$(addprefix -L, SHARE_PATH/) $(addprefix -l, $(SHARE_LIBS))
INC_STATIC=$(addprefix $(STATIC_PATH)/, $(STATIC_LIBS))
.SECONDARY :%.o %(OBJS)
%.o:%.cxx
@echo "Compile $@ ($<)."
@g++ $(CPPLAGS) -I $(INC_PATH) -c $< -o $@
all: $(BUILDS)
$(DIRS):
mkdir -p $@
lib: $(OBJS)
@echo 'build static lib'
@ar -rc libbang.a $(OBJS)
mv $(OBJS) libbang.a $(BIN_DIR)
test:
@echo 'build unit test'
g++ -DUNIT_TEST -DTEST_$(TEST) $(CPPLAGS) -o $(TEST).exe $(SRCS) -I $(INC_PATH) $(INC_SHARE) $(INC_STATIC) -lcurl
install:
@echo 'install lib'
cp $(BIN_DIR)/libbang.a $(LIB_PATH)
clean:
@echo 'clean up the generated files'
rm ./debug/ -rf;
rm ./release/ -rf;
.PHONY: all lib test install clean $(DIRS)
|
用这个Makefile文件, 即可编译链接了. make dd=debug进行debug方式的编译. 而make dd=release则进行release编译, 以适合生产环境的需要和性能优化. 那这种区别编译是怎么做到的呢? 我们如何在实际使用时干预已经写好的代码行为?答案就是本篇的主题, 宏.
Read More