多目录的源文件makefile

目录结构

-----

  |--common

    |---add.h add.cpp

    |---sub.h sub.cpp

  |--src

    |---main.cpp

COMMDIR=common
APPDIR=src

COMMSRC:=$(wildcard $(COMMDIR)/*.cpp)
APPSRC:=$(wildcard $(APPDIR)/*.cpp)

COMMDEP:=$(patsubst %.cpp,%.d,$(COMMSRC))
APPDEP:=$(patsubst %.cpp,%.d,$(APPSRC))

COMMOBJ:=$(patsubst %.cpp,%.o,$(COMMSRC))
APPOBJ:=$(patsubst %.cpp,%.o,$(APPSRC))

CPPFLAGS:=-g -Icommon -MD

all:main

deps: $(COMMDEP) $(APPDEP)

main: $(COMMOBJ) $(APPOBJ)
g++ $^ -o $@ -Icommon/

common:$(COMMOBJ)

app:$(APPOBJ)

clean:
@rm -rf main
@find ./ -name *.d | xargs rm -rf
@find ./ -name *.o | xargs rm -rf

-include $(COMMDEP) $(APPDEP)

注意点:

1. CPPFLAGS的定义, 必须加入-MD, 下面是MD在GNU GCC 中文手册的解释

-MD
和`-M'选项类似,但是把依赖信息输出在文件中,文件名通过把输出文件名末尾的
`.o'替换为 `.d'产生.同时继续指定的编译工作---`-MD'不象`-M'那样阻止正常
的编译任务

2. -include 后面紧跟 dep文件的定义 

-include file
在处理常规输入文件之前,首先处理文件 file,其结果是,文件 file 的内容先得到编
译. 命令行上任何`-D'和`-U'选项永远在`-include file'之前处理, 无论他们在
命令行上的顺序如何.然而`-include'和`-imacros'选项按书写顺序处理.

转载于:https://www.cnblogs.com/adidos/p/3592818.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于多目录的情况,我们可以使用一个主makefile来管理整个项目,然后在每个子目录下再编写各自的makefile。以下是一个示例: 首先,我们创建一个名为`Makefile`的主makefile,并在其中定义一些变量和规则: ```makefile # 定义子目录 SUBDIRS := dir1 dir2 dir3 # 定义编译器和编译选项 CC := gcc CFLAGS := -Wall -Werror # 定义目标文件存放的目录 OBJDIR := obj # 定义目标文件和可执行文件 TARGET := myprogram OBJS := $(addprefix $(OBJDIR)/, file1.o file2.o file3.o) .PHONY: all clean $(SUBDIRS) all: $(TARGET) $(TARGET): $(OBJS) $(CC) $(CFLAGS) $^ -o $@ # 在每个子目录下执行make命令 $(SUBDIRS): $(MAKE) -C $@ # 生成目标文件的规则 $(OBJDIR)/%.o: %.c | $(OBJDIR) $(CC) $(CFLAGS) -c $< -o $@ # 创建目标文件存放的目录 $(OBJDIR): mkdir -p $@ clean: rm -rf $(TARGET) $(OBJDIR) ``` 然后,在每个子目录下创建各自的makefile,例如`dir1/Makefile`: ```makefile # 定义当前子目录下的源文件 SRCS := file1.c # 生成当前子目录下的目标文件 OBJS := $(addprefix $(OBJDIR)/, $(SRCS:.c=.o)) all: $(OBJS) $(OBJS): $(SRCS) | $(OBJDIR) $(CC) $(CFLAGS) -c $< -o $@ $(OBJDIR): mkdir -p $@ clean: rm -rf $(OBJS) ``` 其他子目录的`Makefile`可以类似地创建。 这样,通过在主makefile中定义需要编译的子目录,并在其中执行各自的make命令,可以实现多目录的编译。同时,每个子目录下的makefile会将编译生成的目标文件放入统一的目标文件存放目录中。 使用`make`命令执行主makefile即可开始编译整个项目。使用`make clean`命令可以清除编译生成的目标文件和可执行文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值