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!
相关推荐
驱动探索者19 小时前
影石Insta360发展史:从深圳公寓到全球影像创新标杆
linux
Wang's Blog19 小时前
Linux小课堂: SSH 免密登录原理与实现之基于公钥认证的安全连接机制
linux·安全·ssh
戴草帽的大z19 小时前
交叉编译FFmpeg:从x264到RK3588部署实战
linux·ffmpeg·rk3588·h.264·aarch64
qiuiuiu41320 小时前
正点原子RK3568学习日志19- Linux错误处理 字符驱动框架完全体
linux·服务器·学习·ubuntu
如果是君20 小时前
【git使用】ubuntu下利用git工具提交一个工程
linux·git·ubuntu
橘颂TA20 小时前
【Linux】 层层递进,抽丝剥茧:调度队列、命令行参数、环境变量
linux·运维·服务器·c/c++
X_szxj20 小时前
Volatility2在kali安装
linux·运维·服务器
像风一样!20 小时前
NFS文件存储
linux·服务器·网络·nfs文件存储
大聪明-PLUS20 小时前
Linux 中的 DNS 工作原理(一):从 getaddrinfo 到 resolv.conf
linux·嵌入式·arm·smarc
郝学胜-神的一滴20 小时前
C++ STL(标准模板库)深度解析:从基础到实践
linux·服务器·开发语言·c++·算法