Makefile参考样例5:多个文件夹.c和.cpp混合编译

样例4只能编译纯C文件,现在添加C++的支持。

同时添加环境变量CROSS_COMPILE支持灵活跨平台编译。

源代码根目录为src,所有源码在src的子目录会被编译。

bash 复制代码
#CROSS_COMPILE ?= 

CC      = $(CROSS_COMPILE)gcc
CXX     = $(CROSS_COMPILE)g++
LD      = $(CROSS_COMPILE)g++
STRIP   = $(CROSS_COMPILE)strip

#编译选项
DEFINES  = -DTEST=1
CFLAGS   = -O0 -Wall -Wformat-overflow=0 $(DEFINES)
CXXFLAGS = -O0 -Wall -Wformat-overflow=0 $(DEFINES)
LDFLAGS  = -Wl,-gc-sections -Wl,-rpath=lib -Wl,-rpath='$$ORIGIN' -lpthread -lm

#目录结构
target   = main
srcdir   = src
objdir   = build
srcsub   = $(shell find $(srcdir) -type d)
objsub   = $(patsubst $(srcdir)/%,$(objdir)/%,$(srcsub))

#源文件查找
csrc    = $(foreach dir,$(srcsub),$(wildcard $(dir)/*.c))
cxxsrc  = $(foreach dir,$(srcsub),$(wildcard $(dir)/*.cpp))
obj     = $(patsubst $(srcdir)/%.c,$(objdir)/%.o,$(csrc)) $(patsubst $(srcdir)/%.cpp,$(objdir)/%.o,$(cxxsrc))
dep     = $(patsubst $(srcdir)/%.c,$(objdir)/%.d,$(csrc)) $(patsubst $(srcdir)/%.cpp,$(objdir)/%.d,$(cxxsrc))

#包含路径
CFLAGS   += $(foreach dir,$(srcsub),-I$(dir))
CXXFLAGS += $(foreach dir,$(srcsub),-I$(dir))
LDFLAGS  += $(foreach dir,$(srcsub),-L$(dir))

#依赖生成规则
$(objdir)/%.d: $(srcdir)/%.c
	@echo "Generating $@..."
	@$(CC) -MM -MT "$(@:.d=.o) $@" $(CFLAGS) $< > $@

$(objdir)/%.d: $(srcdir)/%.cpp
	@echo "Generating $@..."
	@$(CXX) -MM -MT "$(@:.d=.o) $@" $(CXXFLAGS) $< > $@

#编译规则
$(objdir)/%.o: $(srcdir)/%.c
	@echo "Compiling $<..."
	@$(CC) $(CFLAGS) -c $< -o $@

$(objdir)/%.o: $(srcdir)/%.cpp
	@echo "Compiling $<..."
	@$(CXX) $(CXXFLAGS) -c $< -o $@

ifeq ($(MAKELEVEL), 1)
include $(dep)
endif

.PHONY: all clean

all: $(objsub) $(dep)
	@$(MAKE) -s $(target)

clean:
	@echo Clean target...
	@rm -rf $(target) $(objdir)
	@echo Clean done!

$(objsub):
	@mkdir -p $@

$(target): $(obj)
	@echo Linking...
	@$(LD) $(LDFLAGS) -o $@ $^
	@$(STRIP) $@
	@echo Build done!
相关推荐
A小辣椒21 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒1 天前
TShark:基础知识
linux
AlfredZhao1 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5203 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩3 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言