makefile软件版本并实现多目录

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 $@)"。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值