如何创建生成文件,为对象和可执行文件指定不同的目录

How to create makefile specifying ifferent directories for object and executable files

本文关键字:可执行文件 对象 创建 何创建 文件      更新时间:2023-10-16
    --folder
    ----book.h
    ----book.cpp
    ----library.h
    ----library.cpp
    ----main.cpp

这是目录结构,我已经创建了这个make文件,该文件在同一目录中生成对象文件和可执行文件。

    main : main.o book.o library.o
        g++ main.o book.o library.o -o main
    main.o : main.cpp book.h library.h
        g++ -c main.cpp
    library.o : library.cpp library.h book.h
        g++ -c library.cpp
    book.o : book.cpp book.h 
        g++ -c book.cpp
    clean:
        rm -f *.o main

但是我想分别为文件夹中的目标文件和可执行文件创建文件夹obj和bin。我该怎么做?

也许是这样的

TARGET  = bin/main
SOURCES = main.cpp book.cpp library.cpp
OBJ_DIR = obj
OBJECTS = $(SOURCES:%.cpp=$(OBJ_DIR)/*.o)
$(TARGET): $(OBJECTS)
    $(LD) $(LDFLAGS) $^ -o $@ $(LIBS)
$(OBJ_DIR)/%.o: %.cpp
    $(CXX) $(CXXFLAGS) $< -c -o $@

这要求首先存在binobj目录。

阅读 GNU 制作手册 了解更多信息。


我有一些时间,所以我为你写了一个完整和自动化的Makefile。这将创建目录(如果它们不存在)。

BINDIR  = bin/
OBJDIR  = obj/
TARGET  = $(BINDIR)target
SOURCES = main.cpp book.cpp library.cpp
LD      = g++
OBJECTS = $(SOURCES:%.cpp=$(OBJDIR)%.o)
.PHONY: all
all: target
.PHONY: target
target: before_target actual_target after_target
.PHONY: before_target
before_target: $(OBJDIR) $(BINDIR)
.PHONY: actual_target
actual_target: $(TARGET)
.PHONY: after_target
after_target:
$(TARGET): $(OBJECTS)
    $(LD) $(LDFLAGS) $^ -o $@ $(LIBS)
$(OBJDIR)%.o: %.cpp
    $(CXX) $(CXXFLAGS) $^ -c -o $@
$(OBJDIR) $(BINDIR):
    mkdir $@
.PHONY: clean
clean:
    -rm -rf $(BINDIR)
    -rm -rf $(OBJDIR)

使用 VPATH!这是一篇出色(且详细)的文章,向您展示了如何:多架构构建。

这是基本理论:

首先,将有一个单级递归。这将处理自动cdobj ect 目录中,而不是出于任何目录层次结构的原因。

其次,您将使用 VPATH 指定源代码相对于对象目录的位置:VPATH=../src

第三。。。嗯......利润!

下面是一个简化的示例(未测试)。您可以对此进行扩展,或按照文章进行操作以获得"更丰富"的版本:

ifneq (obj,$(notdir $(CURDIR)))
    # Not in object directory, so we must be in root (src) directory!
    .SUFFIXES:
    OBJDIR := obj
    MAKETARGET = $(MAKE) --no-print-directory -C $@ -f $(CURDIR)/Makefile 
             SRCDIR=$(CURDIR) $(MAKECMDGOALS)
    .PHONY: $(OBJDIR)
    $(OBJDIR):
        ;+@[ -d $@ ] || mkdir -p $@
        +@$(MAKETARGET)
    Makefile : ;
    %.mk :: ;
    % :: $(OBJDIR) ; :
    .PHONY: clean
    clean:
        rm -rf $(OBJDIR)
else
    VPATH=../src
    CXX := g++  # The default, just so you know it's here
    # CXXFLAGS = ...
    # LDFLAGS = ...
    # LDLIBS = ...
    main : main.o book.o library.o
    main.o : main.cpp book.h library.h
    library.o : library.cpp library.h book.h
    book.o : book.cpp book.h 
endif
您只需在

对象前面加上 obj/,在可执行文件前面加上 bin/,并添加一个命令以使目录mkdir -p bin等。

# make your subfolders targets
all: bin obj bin/main
bin/main : obj/main.o obj/book.o obj/library.o
    g++ -o bin/main obj/main.o obj/book.o obj/library.o
obj/main.o : main.cpp book.h library.h
    g++ -c -o obj/main.o main.cpp
obj/library.o : library.cpp library.h book.h
    g++ -c -o obj/library.o library.cpp
obj/book.o : book.cpp book.h 
    g++ -c -o obj/book.o book.cpp
# create subfolders if not present
bin obj:
    mkdir -p bin
    mkdir -p obj
clean:
    rm -f bin/* obj/*

然后只需键入 make (使 targer all )。

相关文章: