gpt4 book ai didi

c - Makefile 没有制作所有目标

转载 作者:太空宇宙 更新时间:2023-11-04 01:31:54 25 4
gpt4 key购买 nike

我试图将编译后的 obj 文件放在两个不同的文件夹中

  1. dobjects:对象有调试符号的地方(带 -g 选项的 gcc)
  2. sobjects:在没有调试符号的情况下编译对象的位置。

源文件相同,

我有以下生成文件。

CC = gcc
CFLAGS = -Wall
OBJS = a.o b.o
SRCS = a.c b.c
SOBJS_DIR = sobjects
DOBJS_DIR = dobjects
SOBJS = $(addprefix $(SOBJS_DIR)/, $(OBJS))
DOBJS = $(addprefix $(DOBJS_DIR)/, $(OBJS))

all: release debug

release: $(SOBJS)

debug: $(DOBJS)

$(DOBJS_DIR)/%.o: CFLAGS += -g

$(DOBJS_DIR)/%.o $(SOBJS_DIR)/%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@

clean:
rm dobjects/*
rm sobjects/*

但每次我尝试“制作”时,只有一个目标被制作出来。

$ make
gcc -Wall -c a.c -o sobjects/a.o
gcc -Wall -c b.c -o sobjects/b.o

$ make
gcc -Wall -g -c a.c -o dobjects/a.o
gcc -Wall -g -c b.c -o dobjects/b.o

任何帮助将不胜感激

最佳答案

此规则与您认为的不同:

$(DOBJS_DIR)/%.o $(SOBJS_DIR)/%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@

具有多个目标的模式规则告诉 make 一次调用配方将构建两个目标。因此,当 make 运行该规则来构建 $(DOBJS_DIR)/a.o 时,make 相信 $(SOBJS_DIR)/a.o 也已构建,因此它不会尝试运行构建它的规则。但是您的规则实际上并没有构建它,因此当您第二次运行 make 时,它​​发现目标文件丢失并再次运行上述规则,以构建丢失的文件。

你必须把它写成两个不同的规则:

$(DOBJS_DIR)/%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@

$(SOBJS_DIR)/%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@

关于c - Makefile 没有制作所有目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21191955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com