首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使生成文件生成到obj/文件夹,而不是src/文件夹?

如何使生成文件生成到obj/文件夹,而不是src/文件夹?
EN

Stack Overflow用户
提问于 2022-07-28 02:06:23
回答 1查看 51关注 0票数 1

我正在扩展一个旧的学校项目,我有课程人员为我们制作的Makefile。我已经像这样重新组织了这个项目的目录结构。

代码语言:javascript
复制
+-----obj
|
+-----src
|     |
|     +-Makefile
|     +-allocator.h
|     +-debug_break.h
|     +-rbtree_clrs.c
|     +-rbtree_linked.c
|     +-rbtree_stack.c
|     +-rbtree_topdown.c
|     +-rbtree_unified.c
|     +-segment.c
|     +-segment.h
|     +-test_harness.c
|     +-my_optional_program.c
|
+------scripts

Makefile当前使用test_my_optional_program在我编写的堆分配器(以my_optional_program开头的文件)前面加上,并将它们放在与Makefile相同的目录中。然后,我可以在scripts文件夹中的脚本上运行不同的堆分配程序实现。相反,我想要这个:

代码语言:javascript
复制
+-----obj
|     +-my_optional_program_rbtree_clrs
|     +-my_optional_program_rbtree_linked
|     +-my_optional_program_rbtree_stack
|     +-my_optional_program_rbtree_topdown
|     +-my_optional_program_rbtree_unified
|     +-test_rbtree_clrs
|     +-test_rbtree_linked
|     +-test_rbtree_stack
|     +-test_rbtree_topdown
|     +-test_rbtree_unified
|
+-----src
|     |
|     +-Makefile
|     +-allocator.h
|     +-debug_break.h
|     +-rbtree_clrs.c
|     +-rbtree_linked.c
|     +-rbtree_stack.c
|     +-rbtree_topdown.c
|     +-rbtree_unified.c
|     +-segment.c
|     +-segment.h
|     +-test_harness.c
|     +-my_optional_program.c
|     
+------scripts

我需要在Makefile中添加或更改什么,以便将其构建到obj/文件夹中?

代码语言:javascript
复制
# They had us try different optimization levels here (-O0, -O2, etc).
rbtree_clrs.o: CFLAGS += -O0
rbtree_unified.o: CFLAGS += -O0
rbtree_linked.o: CFLAGS += -O0
rbtree_stack.o: CFLAGS += -O0
rbtree_topdown.o: CFLAGS += -O0

ALLOCATORS = rbtree_clrs rbtree_unified rbtree_stack rbtree_linked rbtree_topdown
PROGRAMS = $(ALLOCATORS:%=test_%)
MY_PROGRAMS = $(ALLOCATORS:%=my_optional_program_%)

all:: $(PROGRAMS) $(MY_PROGRAMS)

# I had to use gcc-11 on mac to be able to build this project.
UNAME := $(shell uname)
ifeq ($(UNAME),Darwin)
CC = gcc-11
else
CC = gcc
endif

CFLAGS = -g3 -std=gnu99 -Wall $$warnflags -fcf-protection=none -fno-pic -no-pie
export warnflags = -Wfloat-equal -Wtype-limits -Wpointer-arith -Wlogical-op -Wshadow -Winit-self -fno-diagnostics-show-option
LDFLAGS =
LDLIBS =

$(PROGRAMS): test_%:%.o segment.c test_harness.c
    $(CC) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@

$(MY_PROGRAMS): my_optional_program_%:my_optional_program.c %.o segment.c
    $(CC) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@

clean::
    rm -f $(PROGRAMS) $(MY_PROGRAMS) *.o callgrind.out.*

.PHONY: clean all

.INTERMEDIATE: $(ALLOCATORS:%=%.o)

更新:这个Makefile解决了这个问题。我选择了勒诺·帕卡莱的Makefile (谢谢!),并调整了路径以达到预期的结果。目录中似乎没有上升一个级别是个问题。然后我不得不在PROGRAMS变量中添加我想要的路径到ALLOCATORS。我不知道这是否应该这样做,但它是否工作。如果有更好的方法,我可以更新这个路径。

代码语言:javascript
复制
SRCDIR = ../src
OBJDIR = ../obj
SRC := $(wildcard $(SRCDIR)/*.c)
OBJ := $(patsubst $(SRCDIR)/%.c, $(OBJDIR)/%.o,$(SRC))

# They had us try different optimization levels here (-O0, -O2, etc).
$(filter $(OBJDIR)/rbtree_%.o,$(OBJ)): CFLAGS += -O0

ALLOCATORS = rbtree_clrs rbtree_unified rbtree_stack rbtree_linked rbtree_topdown
PROGRAMS = $(addprefix $(OBJDIR)/test_,$(ALLOCATORS))
MY_PROGRAMS = $(addprefix $(OBJDIR)/my_optional_program_,$(ALLOCATORS))

all:: $(PROGRAMS) $(MY_PROGRAMS)

# I had to use gcc-11 on mac to be able to build this project.
UNAME := $(shell uname)
ifeq ($(UNAME),Darwin)
CC = gcc-11
else
CC = gcc
endif

CFLAGS = -g3 -std=gnu99 -Wall $$warnflags -fcf-protection=none -fno-pic -no-pie
export warnflags = -Wfloat-equal -Wtype-limits -Wpointer-arith -Wlogical-op -Wshadow -Winit-self -fno-diagnostics-show-option
LDFLAGS =
LDLIBS =

$(OBJ): $(OBJDIR)/%.o: $(SRCDIR)/%.c
    $(CC) $(CFLAGS) -c -o $@ $<

$(PROGRAMS): $(OBJDIR)/test_%: $(OBJDIR)/%.o segment.c test_harness.c
    $(CC) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@

$(MY_PROGRAMS): $(OBJDIR)/my_optional_program_%: my_optional_program.c $(OBJDIR)/%.o segment.c
    $(CC) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@

clean::
    rm -f $(PROGRAMS) $(MY_PROGRAMS) $(OBJ) callgrind.out.*
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-28 09:52:11

您没有编译规则,所以使用它的隐式规则进行编译,它将对象文件与源文件放在同一个目录中。

只需添加自己的规则,并对对象文件的所有引用进行重新处理:

代码语言:javascript
复制
OBJDIR := ../obj
SRC := $(wildcard *.c)
OBJ := $(patsubst %.c,$(OBJDIR)/%.o,$(SRC))

# They had us try different optimization levels here (-O0, -O2, etc).
$(filter $(OBJDIR)/rbtree_%.o,$(OBJ)): CFLAGS += -O0

ALLOCATORS = rbtree_clrs rbtree_unified rbtree_stack rbtree_linked rbtree_topdown
PROGRAMS = $(ALLOCATORS:%=$(OBJDIR)/test_%)
MY_PROGRAMS = $(ALLOCATORS:%=$(OBJDIR)/my_optional_program_%)

all:: $(PROGRAMS) $(MY_PROGRAMS)

# I had to use gcc-11 on mac to be able to build this project.
UNAME := $(shell uname)
ifeq ($(UNAME),Darwin)
CC = gcc-11
else
CC = gcc
endif

CFLAGS = -g3 -std=gnu99 -Wall $$warnflags -fcf-protection=none -fno-pic -no-pie
export warnflags = -Wfloat-equal -Wtype-limits -Wpointer-arith -Wlogical-op -Wshadow -Winit-self -fno-diagnostics-show-option
LDFLAGS =
LDLIBS =

$(OBJ): $(OBJDIR)/%.o: %.c
    $(CC) $(CFLAGS) -c -o '$@' '$<'

$(PROGRAMS): $(OBJDIR)/test_%: $(OBJDIR)/%.o segment.c test_harness.c
    $(CC) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@

$(MY_PROGRAMS): $(OBJDIR)/my_optional_program_%: my_optional_program.c $(OBJDIR)/%.o segment.c
    $(CC) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@

clean::
    rm -f $(PROGRAMS) $(MY_PROGRAMS) $(OBJ) callgrind.out.*

请注意,您还应该管理对象和头文件之间的依赖关系(上面没有,就像原始版本一样)。如果它足够简单,您将很容易地修改建议的Makefile。否则,考虑阅读这篇关于自动依赖生成的非常有趣的文章当前GNU使主要维护者。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73146447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档