makefile:不同目录中的CPP文件,将对象文件重定向为./obj,并且可执行到./bin

Makefile: Cpp Files in Different Directories, Redirect Object Files to ./obj and Executable to ./bin

本文关键字:文件 obj bin 可执行 重定向 对象 CPP makefile      更新时间:2023-10-16

我的目录结构看起来像

-Project
|--bin
|--obj/
|--class1
  |--class1.h
  |--class1.cpp
|--test
  |--test-wrapper-class.h
  |--test-wrapper-class.cpp
  |--main.cpp

我想编写一个将会

的makefile

1)创建三个对象文件,main.o,class1.o和test-wrapper-class.o,然后将这些文件放在OBJ目录

2)使用这些对象文件创建将放置在bin文件夹中的可执行文件

3)有一个干净,可以删除OBJ和bin中的所有文件

我知道如何创建对象文件。我已经看到了从位于同一目录中的所有CPP文件创建对象文件,然后将它们全部放置在OBJ目录中的示例。我不知道该怎么做是

1)从不同目录中的CPP源创建对象文件,将所有对象文件放在每个源目录的单独目录中

2)并使用这些对象文件创建位于对象文件和源的另一个目录中的可执行文件。

处于当前状态。我的makefile甚至没有接近工作。

CXX=g++
INC=-I/home/epi/jfrye_xilinx/SystemC/systemc-2.3.2/include ./test_bench/ ./src/
LIB=-L/home/epi/jfrye_xilinx/SystemC/systemc-2.3.2/lib-linux64
LIBS=-lsystemc
OBJDIR=obj
_OBJS = main.o test_bench.o
OBJS = $(addprefix $(OBJDIR), _OBJS)

all: $(OBJS)
    $(CXX) $(OBJS) $(INC) $(LIB) $(LIBS) -o out
$(OBJDIR) obj/%.o : %.cpp test_bench.h
    $(CXX) $(OBJS) $(INC) $(LIB) $(LIBS) $< -o $@

我认为我非常了解如何包括标头文件(库)目录以及如何包含链接器文件。我只是在汇编阶段移动文件,但我不太了解。

谢谢。

让我们从这个问题的简单版本开始:

src/
  foo.cpp
  bar.cpp
inc/
  bar.h
obj/
bin/

我想在obj/中构建foo.obar.ofoo.cpp包括bar.h(因此bar.h应该是foo.obar.o的先决条件),我想将这些对象链接到bin/中的app

技巧一个,使用目标的完整路径:

SRCDIR := src
INCDIR := inc
OBJDIR := obj
BINDIR := bin
OBJECTS:= $(addprefix $(OBJDIR)/, foo.o bar.o)
bin/app: $(OBJECTS)
    $(CXX) $^ -o $@
$(OBJECTS): $(OBJDIR)/%.o: $(SRCDIR)/%.cpp
    $(CXX) -I$(INCDIR) $< -o $@
$(OBJDIR)/foo.o $(OBJDIR)/bar.o: $(INCDIR)/bar.h

现在让我们假设源位于一个以上的目录中,例如class1/test/

技巧2,使用vtath查找资源:

vpath %.cpp src
$(OBJECTS): $(OBJDIR)/%.o: %.cpp
    $(CXX) -I$(INCDIR) $< -o $@

不要忘记clean规则:

.PHONY: clean
clean:
    @rm -fr $(BINDIR)/* $(OBJDIR)/*

其他改进是可能的,但这足以让您开始。