Loading...
Loading...
Compare original and translation side by side
$@$<$^$@$<$^CC := gcc
CFLAGS := -std=c11 -Wall -Wextra -g -O2
LDFLAGS :=
LDLIBS :=
SRCS := $(wildcard src/*.c)
OBJS := $(SRCS:src/%.c=build/%.o)
TARGET := build/prog
.PHONY: all clean
all: $(TARGET)
$(TARGET): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
build/%.o: src/%.c | build
$(CC) $(CFLAGS) -c -o $@ $<
build:
mkdir -p build
clean:
rm -rf build$@$<$^$*%$(@D)$@CC := gcc
CFLAGS := -std=c11 -Wall -Wextra -g -O2
LDFLAGS :=
LDLIBS :=
SRCS := $(wildcard src/*.c)
OBJS := $(SRCS:src/%.c=build/%.o)
TARGET := build/prog
.PHONY: all clean
all: $(TARGET)
$(TARGET): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
build/%.o: src/%.c | build
$(CC) $(CFLAGS) -c -o $@ $<
build:
mkdir -p build
clean:
rm -rf build$@$<$^$*%$(@D)$@.cCC := gcc
CFLAGS := -std=c11 -Wall -Wextra -g -O2
DEPFLAGS = -MMD -MP # -MMD: generate .d file; -MP: phony targets for headers
SRCS := $(wildcard src/*.c)
OBJS := $(SRCS:src/%.c=build/%.o)
DEPS := $(OBJS:.o=.d)
TARGET := build/prog
.PHONY: all clean
all: $(TARGET)
$(TARGET): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
build/%.o: src/%.c | build
$(CC) $(CFLAGS) $(DEPFLAGS) -MF $(@:.o=.d) -c -o $@ $<
-include $(DEPS) # '-' ignores errors on first build (no .d files yet)
build:
mkdir -p build
clean:
rm -rf build.cCC := gcc
CFLAGS := -std=c11 -Wall -Wextra -g -O2
DEPFLAGS = -MMD -MP # -MMD: 生成.d文件; -MP: 为头文件创建伪目标
SRCS := $(wildcard src/*.c)
OBJS := $(SRCS:src/%.c=build/%.o)
DEPS := $(OBJS:.o=.d)
TARGET := build/prog
.PHONY: all clean
all: $(TARGET)
$(TARGET): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
build/%.o: src/%.c | build
$(CC) $(CFLAGS) $(DEPFLAGS) -MF $(@:.o=.d) -c -o $@ $<
-include $(DEPS) # '-' 表示首次构建时忽略.d文件不存在的错误
build:
mkdir -p build
clean:
rm -rf buildundefinedundefinedundefinedundefinedBUILD ?= release
ifeq ($(BUILD),debug)
CFLAGS += -g -Og -DDEBUG
else
CFLAGS += -O2 -DNDEBUG
endifmake BUILD=debugBUILD ?= release
ifeq ($(BUILD),debug)
CFLAGS += -g -Og -DDEBUG
else
CFLAGS += -O2 -DNDEBUG
endifmake BUILD=debugmake -j$(nproc) # use all CPUs
make -j4 # exactly 4 jobs-Otarget-Omake -j$(nproc) -Omake -j$(nproc) # 使用所有CPU核心
make -j4 # 恰好运行4个任务-Otarget-Omake -j$(nproc) -Oundefinedundefined
Override silence: `make V=1` if you guard with `$(V)`:
```makefile
Q := $(if $(V),,@)
build/%.o: src/%.c
$(Q)$(CC) $(CFLAGS) -c -o $@ $<
如果用`$(V)`做判断,可以通过`make V=1`取消静默输出:
```makefile
Q := $(if $(V),,@)
build/%.o: src/%.c
$(Q)$(CC) $(CFLAGS) -c -o $@ $<PREFIX ?= /usr/local
install: $(TARGET)
install -d $(DESTDIR)$(PREFIX)/bin
install -m 0755 $(TARGET) $(DESTDIR)$(PREFIX)/bin/PREFIX ?= /usr/local
install: $(TARGET)
install -d $(DESTDIR)$(PREFIX)/bin
install -m 0755 $(TARGET) $(DESTDIR)$(PREFIX)/bin/undefinedundefined
```makefile
```makefileundefinedundefined| Error | Cause | Fix |
|---|---|---|
| Missing source or rule | Check source path and pattern rule |
| Targets up to date | Touch a source file or run |
| Target depends on itself | Check dependency chain |
| Tab vs spaces | Recipes must use a tab, not spaces |
| Pattern rule syntax error | Check |
| Rebuilds everything every time | Timestamps wrong, or PHONY missing | Check |
| Header change not detected | No dep tracking | Add |
| 错误信息 | 原因 | 解决方法 |
|---|---|---|
| 缺少源文件或规则 | 检查源文件路径和模式规则 |
| 所有目标均已更新 | 修改某个源文件或执行 |
| 目标依赖自身 | 检查依赖链 |
| 制表符与空格混淆 | 命令必须使用制表符,而非空格 |
| 模式规则语法错误 | 检查 |
| 每次都重新构建所有内容 | 时间戳错误,或缺少伪目标声明 | 检查系统时间;确保 |
| 修改头文件后未触发重新构建 | 未配置依赖跟踪 | 添加 |
skills/build-systems/cmakeskills/build-systems/ninjaskills/compilers/gccskills/build-systems/cmakeskills/build-systems/ninjaskills/compilers/gcc