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!
相关推荐
橘颂TA6 小时前
【Linux】特效爆满的Vim的配置方法 and make/Makefile原理
linux·运维·服务器·vim
AI大法师7 小时前
企业级Linux服务器安全:防火墙规则配置与Web/SSH服务优化指南
linux·服务器·安全
花小璇学linux7 小时前
imx6ull-驱动开发篇10——pinctrl 子系统
linux·驱动开发·imx6ull·嵌入式软件
Hat_man_8 小时前
如何在虚拟机(Linux)安装Qt5.15.2
linux·运维·服务器
LLLLYYYRRRRRTT8 小时前
12. SELinux 加固 Linux 安全
linux·运维·安全
爱学习的小熊猫_8 小时前
在Linux上部署RabbitMQ、Redis、ElasticSearch
linux·redis·elasticsearch·中间件·rabbitmq
拾心219 小时前
【运维进阶】DHCP服务配置和DNS域名解析
linux·运维·服务器
陈陈爱java9 小时前
实习文档背诵
linux·服务器·windows
代码改变世界ctw10 小时前
TrustZone技术详解————这篇是AI写的包括图
linux
Johny_Zhao10 小时前
SeaTunnel的搭建部署以及测试
linux·网络·网络安全·信息安全·kubernetes·云计算·containerd·devops·seatunnel·系统运维