1. 项目中不可能每个软件都包含同样的头文件来进行版本统一管理,编译version.o,链接到目标文件中。
源文件组织如下:
|---src--->|-->helloworld.cc
|-->VersionManage.cc
|---include-->|--->VersionManage.h
|---build----->*.o
将三种文件单独放在不同目录中。
Makefile 如下:
TOPDIR:= .
INCLUDE = -I./include/ -I./src/
OBJ_DIR = ./build/
SRC_DIR = ./src/
#vpath %.o $(OBJ_DIR)
#vpath %.cc $(SRC_DIR)
VPATH = $(SRC_DIR)
PROG := helloworld
CROSS_COMPILE := arm-linux-
CC = $(CROSS_COMPILE)gcc
CPP = $(CROSS_COMPILE)g++
SRCS = $(wildcard $(SRC_DIR)*.cc)
OBJS = $(SRCS:.cc=.o)
OBJS_1 := $(notdir $(OBJS))
OBJS_1 := $(addprefix ./build/,$(OBJS_1))
OBJS_1 += version.o
CPPFLAGS += -Wall -g
$(PROG): $(OBJS_1)
$(CPP) $(CPPFLAGS) $(INCLUDE) -o $(PROG) $(OBJS_1)
$(OBJ_DIR)%.o:$(SRC_DIR)%.cc
@echo "=======> Compiling $@ "
$(CPP) $(CPPFLAGS) -Iinclude/ -c $< -o $(OBJ_DIR)$(@F)
################################
version.o: $(OBJS_1)
echo '#include "$(TOPDIR)/../version.h"' > version.c
echo '#define stringify(x) _stringify(x)' >> version.c
echo '#define _stringify(x) #x' >> version.c
echo 'const char version[] = ' >> version.c
echo ' "Release " stringify(RELEASE)' >> version.c
echo ' " Version " stringify(VERSION)' >> version.c
echo ' " Build " __DATE__ " " __TIME__;' >> version.c
$(CC) -o $@ -c version.c
rm -f version.c
##################################
clean:
rm -f $(OBJ_DIR)*.o *.o *.bak helloworld
注意:
1. 静态模式中的%.o:%.cc的依赖关系只能建立在同一个目录下,如果指定的文件在两个目录中,要在前面加上路径。
2. Makefile 中自动变量都是带路径的,
$(@D) 如果"$@"值是"dir/foo.o",那么"$(@D)"就是"dir",而如果"$@"中没有包含斜杠的话,其值就是"."(当前目录)。
$(@F) 如果"$@"值是"dir/foo.o",那么"$(@F)"就是"foo.o","$(@F)"相当于函数"$(notdir $@)"。