makefile obj文件路径_编写makefile【简单记录】

本文记录了Makefile的使用,包括config.mk中配置BUILD_ROOT的导出,common.mk中的编译脚本,根目录makefile如何遍历子目录执行编译,以及子目录makefile如何设置目标生成可执行文件,并通过include调用编译过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录结构

2225c96a1a838f1f1744670711fbea6f.png

config.mk

配置文件

# 当前路径
export BUILD_ROOT = $(shell pwd)

# include路径
export INCLUDE_PATH = $(BUILD_ROOT)/include

# 需要编译的路径
BUILD_DIR = $(BUILD_ROOT)/app/

export DEBUG = true

export将BUILD_ROOT传递到下级makefile中

common.mk

编译脚本

ifeq ($(DEBUG),true)
CC = g++ -std=c++11 -g
VERSION = debug
else
CC = g++ -std=c++11
VERSION = release
endif

# 获取所有.cpp
SRCS = $(wildcard *.cpp)
# 每个.cpp对应一个.o
OBJS = $(SRCS:.cpp=.o)
# .每个.cpp对应一个.d,记录依赖
DEPS = $(SRCS:.cpp=.d)
# 最终生成的可执行文件
BIN := $(addprefix $(BUILD_ROOT)/,$(BIN))
# 目标文件.o的存放位置
LINK_OBJ_DIR = $(BUILD_ROOT)/link_obj
# .p文件的存放位置
DEP_DIR = $(BUILD_ROOT)/dep

# 生成link_obj和dep文件夹
$(shell mkdir -p $(LINK_OBJ_DIR))
$(shell mkdir -p $(DEP_DIR))

# 为每个.o和.d文件添加路径信息
# 例如: ./link_obj/xx.o和./dep/xx.d
OBJS := $(addprefix $(LINK_OBJ_DIR)/,$(OBJS))
DEPS := $(addprefix $(DEP_DIR)/,$(DEPS))

# 获取LINK_OBJ_DIR下的所有.o文件
LINK_OBJ = $(wildcard $(LINK_OBJ_DIR)/*.o)
# OBJS为需要生成的.o文件,一开始不存在任何.o文件所以添加OBJS到LINK_OBJ
LINK_OBJ += $(OBJS)

# 默认入口,依赖DEPS、OBJS和BIN文件,即xx.d, xx.o, 可能存在的可执行文件名
all:$(DEPS) $(OBJS) $(BIN)

# 链接生成可执行程序
$(BIN):$(LINK_OBJ)
	@echo "BIN $(BIN)"
	@echo "------------------------build $(VERSION) mode--------------------------------!!!"

	$(CC) -o $@ $^ -lpthread

# 编译生成.o文件
$(LINK_OBJ_DIR)/%.o:%.cpp
	@echo "LINK_OBJ_DIR $(LINK_OBJ_DIR)"
	$(CC) -I$(INCLUDE_PATH) -o $@ -c $(filter %.cpp,$^)

# 生成.p文件
$(DEP_DIR)/%.d:%.cpp
	@echo "DEP_DIR $(DEP_DIR)"
	echo -n $(LINK_OBJ_DIR)/ > $@
	$(CC) -I$(INCLUDE_PATH) -MM $^ >> $@

根目录下的makefile

遍历所有包含makefile的子目录,依次执行编译任务

include config.mk
all:
	@for dir in $(BUILD_DIR); 
	do 
		make -C $$dir; 
	done
clean:
	rm -rf link_obj dep
  1. 当make目标为all时,-C $$dir表示跳转到目录dir下读取makefile

子目录下的makefile

BIN = test
include $(BUILD_ROOT)/common.mk
  1. 将BIN设为test,即生成名为test的可执行文件
  2. 通过include common.mk执行编译过程,生成.d、.o和可执行文件test

编译信息

make[1]: Entering directory '/mnt/d/Linux/VSCode/MakeTest/app'
DEP_DIR /mnt/d/Linux/VSCode/MakeTest/dep
echo -n /mnt/d/Linux/VSCode/MakeTest/link_obj/ > /mnt/d/Linux/VSCode/MakeTest/dep/file1.d
g++ -std=c++11 -g -I/mnt/d/Linux/VSCode/MakeTest/include -MM file1.cpp >> /mnt/d/Linux/VSCode/MakeTest/dep/file1.d
DEP_DIR /mnt/d/Linux/VSCode/MakeTest/dep
echo -n /mnt/d/Linux/VSCode/MakeTest/link_obj/ > /mnt/d/Linux/VSCode/MakeTest/dep/file3.d
g++ -std=c++11 -g -I/mnt/d/Linux/VSCode/MakeTest/include -MM file3.cpp >> /mnt/d/Linux/VSCode/MakeTest/dep/file3.d
DEP_DIR /mnt/d/Linux/VSCode/MakeTest/dep
echo -n /mnt/d/Linux/VSCode/MakeTest/link_obj/ > /mnt/d/Linux/VSCode/MakeTest/dep/file2.d
g++ -std=c++11 -g -I/mnt/d/Linux/VSCode/MakeTest/include -MM file2.cpp >> /mnt/d/Linux/VSCode/MakeTest/dep/file2.d
DEP_DIR /mnt/d/Linux/VSCode/MakeTest/dep
echo -n /mnt/d/Linux/VSCode/MakeTest/link_obj/ > /mnt/d/Linux/VSCode/MakeTest/dep/main.d
g++ -std=c++11 -g -I/mnt/d/Linux/VSCode/MakeTest/include -MM main.cpp >> /mnt/d/Linux/VSCode/MakeTest/dep/main.d
DEP_DIR /mnt/d/Linux/VSCode/MakeTest/dep
echo -n /mnt/d/Linux/VSCode/MakeTest/link_obj/ > /mnt/d/Linux/VSCode/MakeTest/dep/file4.d
g++ -std=c++11 -g -I/mnt/d/Linux/VSCode/MakeTest/include -MM file4.cpp >> /mnt/d/Linux/VSCode/MakeTest/dep/file4.d
LINK_OBJ_DIR /mnt/d/Linux/VSCode/MakeTest/link_obj
g++ -std=c++11 -g -I/mnt/d/Linux/VSCode/MakeTest/include -o /mnt/d/Linux/VSCode/MakeTest/link_obj/file1.o -c file1.cpp
LINK_OBJ_DIR /mnt/d/Linux/VSCode/MakeTest/link_obj
g++ -std=c++11 -g -I/mnt/d/Linux/VSCode/MakeTest/include -o /mnt/d/Linux/VSCode/MakeTest/link_obj/file3.o -c file3.cpp
LINK_OBJ_DIR /mnt/d/Linux/VSCode/MakeTest/link_obj
g++ -std=c++11 -g -I/mnt/d/Linux/VSCode/MakeTest/include -o /mnt/d/Linux/VSCode/MakeTest/link_obj/file2.o -c file2.cpp
LINK_OBJ_DIR /mnt/d/Linux/VSCode/MakeTest/link_obj
g++ -std=c++11 -g -I/mnt/d/Linux/VSCode/MakeTest/include -o /mnt/d/Linux/VSCode/MakeTest/link_obj/main.o -c main.cpp
LINK_OBJ_DIR /mnt/d/Linux/VSCode/MakeTest/link_obj
g++ -std=c++11 -g -I/mnt/d/Linux/VSCode/MakeTest/include -o /mnt/d/Linux/VSCode/MakeTest/link_obj/file4.o -c file4.cpp
BIN /mnt/d/Linux/VSCode/MakeTest/test
------------------------build debug mode--------------------------------!!!
g++ -std=c++11 -g -o /mnt/d/Linux/VSCode/MakeTest/test /mnt/d/Linux/VSCode/MakeTest/link_obj/file1.o /mnt/d/Linux/VSCode/MakeTest/link_obj/file3.o /mnt/d/Linux/VSCode/MakeTest/link_obj/file2.o /mnt/d/Linux/VSCode/MakeTest/link_obj/main.o /mnt/d/Linux/VSCode/MakeTest/link_obj/file4.o -lpthread
make[1]: Leaving directory '/mnt/d/Linux/VSCode/MakeTest/app'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值