繁体   English   中英

Makefile 生成 output.o 文件到子文件夹

[英]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)

所以OBJECTSmain.o Solution.o并且OBJDIRbuild

那么$(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM