You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改GNU Makefile适配调整后的项目目录结构并输出到指定文件夹

Makefile 修改方案

以下是修改完成的完整Makefile,可直接满足你的两个需求:

SOURCE_DIR = src
HEADER_DIR = $(SOURCE_DIR)/include
BUILD_DIR = build
LIB_DIR = lib
BIN_DIR = bin

# 给所有目标文件加build目录前缀
OBJS = $(addprefix $(BUILD_DIR)/, foo.o foobar.o foofoobar.o barbar.o barfoo.o barbarfoo.o)
MAIN_OBJ = $(BUILD_DIR)/main.o

# 统一加头文件搜索路径、自动生成依赖的参数
CFLAGS += -I$(HEADER_DIR) -MMD -MP
WARNINGS += -Wall -Wextra # 可根据需要调整警告等级

all: dir release

dir:
	test -d $(HEADER_DIR) || mkdir -p $(HEADER_DIR)
	test -d $(BUILD_DIR) || mkdir -p $(BUILD_DIR)
	test -d $(LIB_DIR) || mkdir -p $(LIB_DIR)
	test -d $(BIN_DIR) || mkdir -p $(BIN_DIR)

debug : CC = gcc
debug : CFLAGS += -std=c99 -O0 -g
debug : LDLIBS = -lm
debug : project

release : CC = gcc
release : CFLAGS += -std=c99 -O3 -fno-strict-aliasing
release : LDLIBS = -lm
release : project

debug_cpp : CC = g++
debug_cpp : CFLAGS += -x c++ -std=c++11 -O0 -g
ifeq ($(PLATFORM),Darwin) # macOS
debug_cpp : WARNINGS += -Wcast-qual
endif
debug_cpp : LDLIBS = -lstdc++
debug_cpp : project

release_cpp : CC = g++
release_cpp : CFLAGS += -x c++ -std=c++11 -O3 -fno-strict-aliasing
ifeq ($(PLATFORM),Darwin) # macOS
release_cpp : WARNINGS += -Wcast-qual
endif
release_cpp : LDLIBS = -lstdc++
release_cpp : project

# 替换原有隐式规则,明确生成到build目录,且依赖目录先创建
$(BUILD_DIR)/%.o : $(SOURCE_DIR)/%.c | dir
	$(CC) -c $(CFLAGS) $(WARNINGS) $< -o $@

project : $(MAIN_OBJ) $(LIB_DIR)/libproject.a
	$(CC) -o $(BIN_DIR)/project $< -L$(LIB_DIR) -lproject $(LDLIBS)
    
$(LIB_DIR)/libproject.a : $(OBJS)
	rm -f $@   
	ar cq $@ $^

clean : 
	-rm -rf $(BUILD_DIR)/*
	-rm -f $(BIN_DIR)/project
	-rm -f $(LIB_DIR)/libproject.a
    
.PHONY : all project clean debug release debug_cpp release_cpp

# 导入自动生成的依赖文件,无需手动维护gcc -MM生成的规则
-include $(OBJS:.o=.d) $(MAIN_OBJ:.o=.d)

核心修改说明

  • 所有编译中间文件(.o目标文件、.d依赖文件)全部输出到$(BUILD_DIR)目录,符合需求的中间文件存放要求
  • 可执行文件直接生成到$(BIN_DIR),静态库文件直接生成到$(LIB_DIR),无需额外移动
  • 新增自动生成依赖的逻辑,不需要再手动执行gcc -MM更新依赖规则,编译时会自动处理头文件变更的增量编译
  • 所有规则下的命令行开头必须使用Tab缩进,不能替换为空格,否则Make会报错

内容的提问来源于stack exchange,提问作者Homunculus Reticulli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 08:54:02