使用make将.o文件移动到单独的目录中

zeb*_*und 9 c++ makefile compilation object

我已经尝试过多次尝试将我的.o文件移动到我的obj文件夹,但不管我做什么,它只是不起作用.

从提供的makefile判断,将文件移动.o到指定文件夹的最佳方法是什么?

BIN = bin/
OBJ = obj/
TARGET = opengl_03
DEPS = main.o  displayinit.o initializer.o algorithms.o matrix3f.o window.o vertex3.o
CC = g++
CFLAGS = -g 
LIBS = -lglut -lGLEW -lGL 
INCLUDEPATH = -L/usr/include/ -L/usr/lib/ -L/usr/lib/x86_64-linux-gnu/

$(TARGET) : $(DEPS)
    $(CC) $(CFLAGS) -o $(BIN)$(TARGET) $(DEPS) $(LIBS) $(INCLUDEPATH) 

displayinit.o : displayinit.cpp displayinit.h
    $(CC) $(LIBS) $(INCLUDEPATH) -c displayinit.cpp && mv displayinit.o $(OBJ)displayinit.o
initializer.o : initializer.cpp initializer.h
    $(CC) $(LIBS) $(INCLUDEPATH) -c initializer.cpp $(OBJ)
algorithms.o : algorithms.cpp algorithms.h
    $(CC) -c algorithms.cpp $(OBJ)
matrix3f.o : matrix3f.cpp matrix3f.h
    $(CC) $(LIBS) $(INCLUDEPATH)  -c matrix3f.cpp $(OBJ)
vertex3.o : vertex3.cpp vertex3.h
    $(CC) $(LIBS) $(INCLUDEPATH)  -c vertex3.cpp $(OBJ)
window.o : window.cpp window.h
    $(CC) $(LIBS) $(INCLUDEPATH) -c window.cpp $(OBJ)
main.o : main.cpp
    $(CC) $(LIBS) $(INCLUDEPATH) -c main.cpp $(OBJ)
Run Code Online (Sandbox Code Playgroud)

ste*_*anB 17

要指定创建对象的位置,请使用 -o

window.o : window.cpp window.h
    $(CC) $(LIBS) $(INCLUDEPATH) -c window.cpp -o $(OBJ)/$@
Run Code Online (Sandbox Code Playgroud)

这是你可以做的:

  1. 指定目标文件的目录

    OBJDIR    =   objdir
    
    Run Code Online (Sandbox Code Playgroud)
  2. 建立需要进行编译,所有的列表对象的文件列表.cpp替换文件.cpp.o和前缀添加$(OBJDIR)/到它:

    OBJ = $(addprefix $(OBJDIR)/, $(patsubst %.cpp, %.o, $(wildcard *.cpp)))
    
    Run Code Online (Sandbox Code Playgroud)

    所以你的$(OBJ)看起来像:objdir/window.o objdir/main.o等等

  3. 添加目标以创建目录(如果该目录不存在):

    $(OBJDIR):
        mkdir $(OBJDIR)
    
    Run Code Online (Sandbox Code Playgroud)
  4. 在制作主目标之前制作目录:

    all: $(OBJDIR) myapp
    
    Run Code Online (Sandbox Code Playgroud)
  5. 规则从当前目录中的.o文件中编译所有目标文件:$(OBJDIR).cpp

    $(OBJDIR)/%.o: %.cpp
        $(GCC) $(CPPFLAGS) -c $< -o $@
    
    Run Code Online (Sandbox Code Playgroud)

    这将导致类似于:

    g++ -c main.cpp -o objdir/main.o
    
    Run Code Online (Sandbox Code Playgroud)
  6. 你的主要目标是不变的:

    $(TARGET): $(OBJ)
        $(GCC) $(LDFLAGS) -o $@ $^ 
    
    Run Code Online (Sandbox Code Playgroud)

    这看起来像:

    g++  -o myapp objdir/window.o objdir/main.o 
    
    Run Code Online (Sandbox Code Playgroud)
  7. 为了完整性,将clean目标添加到清理对象:

    clean:
        @rm -f $(TARGET) $(wildcard *.o)
        @rm -rf $(OBJDIR) 
    
    Run Code Online (Sandbox Code Playgroud)
  8. 并定义.PHONY目标,例如,即使存在具有相同名称的目录或文件,也会生成这些目标:

    .PHONY: all clean
    
    Run Code Online (Sandbox Code Playgroud)

所以看起来应该是这样的:

OBJDIR    =   objdir
OBJ       =   $(addprefix $(OBJDIR)/, $(patsubst %.cpp, %.o, $(wildcard *.cpp)))
TARGET    =   my app

.PHONY: all clean

all: $(OBJDIR) $(TARGET)

$(OBJDIR):
    mkdir $(OBJDIR)

$(OBJDIR)/%.o: %.cpp
    $(GCC) $(CPPFLAGS) -c $< -o $@

$(TARGET): $(OBJ)
    $(GCC) $(LDFLAGS) -o $@ $^ 

clean:
    @rm -f $(TARGET) $(wildcard *.o)
    @rm -rf $(OBJDIR) 
Run Code Online (Sandbox Code Playgroud)

如果你有这样的文件main.cpp,a.cpp这就是make:

> ls
Makefile a.cpp    main.cpp

> make
mkdir objdir
g++ -I. -c a.cpp -o objdir/a.o
g++ -I. -c main.cpp -o objdir/main.o
g++ -o myapp objdir/a.o objdir/main.o 

> ls
Makefile a.cpp    main.cpp objdir   myapp

> make clean
> ls
Makefile a.cpp    main.cpp
Run Code Online (Sandbox Code Playgroud)

如果您想了解有关上述任何内容的更多详细信息,请查看GNU make doc页面