[英]Makefile generates and output .o files to a subfolder
我在使用 Makefile 生成“src/build”时遇到了一些困难。 下面是我的结构。
Project
├── include
│ └── Solution.hpp
└── src
├── bin
│ └──
├── build
│ └──
├── Makefile
├── Solution.cpp
└── main.cpp
我要做的是在 src/build 文件夹下生成 main.o 和 Solution.o,然后在 src/bin 下生成可执行文件“test”。 运行 Makefile 后,我在 src/build 中获得了 main.o,但在 src 中获得了 Solution.o。 我不确定为什么? 变量 OBJDIR 和 BINDIR 应该设置目标的位置,对吗? 如果我删除 $(OBJECTS),一切正常。 为什么我不能 output all.o 文件到 src/build 有什么帮助吗?
ROOTDIR ?= ..
BINDIR := bin
OBJDIR := build
INCLUDEDIR := $(ROOTDIR)/src $(ROOTDIR)/include
CXX := g++
CCFLAGS := -c -g -O2 -Wall -std=c++17
LINKFLAGS :=
SOURCES := main.cpp Solution.cpp
OBJECTS := $(SOURCES:.cpp=.o)
EXECUTABLE := test
OBJSUFFIX := .o
all : $(BINDIR)/$(EXECUTABLE)
makedirs :
@if test ! -d $(BINDIR); then mkdir $(BINDIR); fi
@if test ! -d $(OBJDIR); then mkdir $(OBJDIR); fi
## Link ##
$(BINDIR)/$(EXECUTABLE) : $(OBJDIR)/$(OBJECTS)
$(CXX) $(LINKFLAGS) -o $@ $^
## Compile ##
$(OBJDIR)/%.o : %.cpp makedirs
$(CXX) $(CCFLAGS) $< -o $@
clean :
rm -rf $(BINDIR) $(OBJDIR) *.o
这是错误的:
$(BINDIR)/$(EXECUTABLE) : $(OBJDIR)/$(OBJECTS)
我看到人们一直在 SO 上这样做,我不确定为什么它如此诱人,但当你想到它时它显然无法工作。
你有这个:
SOURCES := main.cpp Solution.cpp
OBJECTS := $(SOURCES:.cpp=.o)
所以OBJECTS
是main.o Solution.o
并且OBJDIR
是build
。
那么$(OBJDIR)/$(OBJECTS)
扩展成什么? 这里有一个提示:make 不会以某种方式发现$(OBJECTS)
有多个单词并推断您想要将前缀应用于每个单词。 它只是扩展了所写的变量。 所以这个扩展的结果是build/main.o Solution.o
。 这就是为什么你会得到你所做的行为。
你想这样写:
OBJECTS := $(patsubst %.cpp,$(OBJDIR)/%.o,$(SOURCES))
或这个:
OBJECTS := $(addprefix $(OBJDIR)/,$(SOURCES:.cpp=.o))
确保目录单独应用于每个单词,而不仅仅是粘贴到第一个单词的前面。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.