Buling-

导航

Makefile简易模板

Makefile 简易模板,可直接套用

hello.c:

#include <stdio.h>
#include "hello.h" // 包含自己的头文件是个好习惯

// 定义 hello 函数
int hello(char *str)
{
    printf("hello_world!\n");
    printf("ch = %s\n", str);
    return 0;
}

hello.h:

#ifndef HELLO_H
#define HELLO_H

int hello(char *str);

#endif // HELLO_H

world.c:

#include <stdio.h>

char ch[] = "hello_world";

world.h:

#ifndef WORLD_H
#define WORLD_H

extern char ch[];

#endif // WORLD_H

main.c:

#include <stdio.h>
#include "hello.h"
#include "world.h"

int main()
{
    printf("start...\n");
    hello(ch);
    printf("exit.\n");
    return 0;
}

Makefile:

# $(wildcard *.c) 列出当前目录下的所有 .c 文件: hello.c main.c
# 用函数 patsubst 进行模式替换得到: hello.o main.o
OBJS = $(patsubst %.c,%.o,$(wildcard *.c))
TARGET = world.out
CC = gcc

$(TARGET): $(OBJS)
	$(CC) -o $(TARGET) $(OBJS)

.PHONY: clean
clean:
	rm -f *.o $(TARGET)

自动生成依赖

<project>
├── Makefile
├── build
└── src
    ├── hello.c
    ├── hello.h
    ├── world.c
    ├── world.h
    └── main.c
SRC_DIR = ./src
BUILD_DIR = ./build
TARGET = $(BUILD_DIR)/world.out

CC = gcc
# 添加 -MMD -MP 标志来自动生成依赖文件
CFLAGS = -Wall -MMD -MP

# 查找所有源文件
SRCS = $(shell find $(SRC_DIR) -name '*.c')
# 将 .c 文件路径转换为 .o 文件路径
OBJS = $(patsubst $(SRC_DIR)/%.c, $(BUILD_DIR)/%.o, $(SRCS))
# 依赖文件列表,与 .o 文件一一对应
DEPS = $(OBJS:.o=.d)

# 默认目标
all: $(TARGET)

# 编译规则:从 .c 生成 .o,同时生成 .d
# -MMD -MP 标志会在这里生效
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c
	@mkdir -p $(dir $@)
	$(CC) $(CFLAGS) -c -o $@ $<

# 链接规则
$(TARGET): $(OBJS)
	@echo "building $@..."
	@mkdir -p $(dir $@)
	$(CC) -o $(TARGET) $(OBJS)

# 清理规则
clean:
	@echo "cleaning $(BUILD_DIR)..."
	@rm -rf $(BUILD_DIR)

# 引入所有自动生成的 .d 文件
-include $(DEPS)

posted on 2026-01-05 14:20  奈何清风  阅读(2)  评论(0)    收藏  举报