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!
相关推荐
minji...28 分钟前
Linux 线程同步与互斥(三) 生产者消费者模型,基于阻塞队列的生产者消费者模型的代码实现
linux·运维·服务器·开发语言·网络·c++·算法
w61001046642 分钟前
cka-2026-ConfigMap
java·linux·cka·configmap
cc_yy_zh1 小时前
Win10 家庭版找不到Device Guard; 无法处理 VMware Workstation与Device Guard不兼容问题
linux·vmware
嵌入式吴彦祖1 小时前
Luckfox Pico Ultra W WIFI
linux·嵌入式硬件
SPC的存折1 小时前
MySQL 8组复制完全指南
linux·运维·服务器·数据库·mysql
Linux技术芯3 小时前
Refault Distance算法详解
linux
0vvv03 小时前
linux-软件安装
linux
IMPYLH3 小时前
Linux 的 nproc 命令
linux·运维·服务器·bash
九英里路4 小时前
OS学习之路——动静态库制作与原理
linux·学习·操作系统·unix·进程·编译·动静态库
kcuwu.5 小时前
从0到1:VMware搭建CentOS并通过FinalShell玩转Linux命令
linux·运维·centos