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

2022-01-04 00:00:00 object compilation makefile c++

我尝试了无数次尝试将我的 .o 文件移动到我的 obj 文件夹,但无论我做什么,它都无法正常工作.

I've tried numerous attempts to move my .o files to my obj folder, but no matter what I do, it simply just doesn't work.

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

Judging from the makefile provided, what is the best method to move .o files to a specified folder?

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)

推荐答案

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

window.o : window.cpp window.h
    $(CC) $(LIBS) $(INCLUDEPATH) -c window.cpp -o $(OBJ)/$@

<小时>

您可以这样做:


Here is what you could do:

  1. 指定目标文件所在的目录

  1. specify the directory where you want the object files to go

OBJDIR    =   objdir

  • 通过将 .cpp 替换为 .o,从所有 .cpp 文件的列表中创建需要编译的目标文件列表 并添加前缀 $(OBJDIR)/ 到它:

  • Create a list of object files that need to be compiled, from the list of all .cpp files by replacing .cpp with .o and add the prefix $(OBJDIR)/ to it:

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

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

    So your $(OBJ) will look like: objdir/window.o objdir/main.o and so on

    如果目录不存在,则添加一个目标以创建该目录:

    Add a target to create the directory if it does not exist:

    $(OBJDIR):
        mkdir $(OBJDIR)
    

  • 在创建主要目标之前先创建目录目标:

  • Make the directory target before you make your main target:

    all: $(OBJDIR) myapp
    

  • 从当前目录中的 .cpp 文件编译 $(OBJDIR) 中所有 .o 目标文件的规则:

  • Rule to compile all the .o object files in $(OBJDIR) from .cpp files in the current directory:

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

    这将导致类似:

    g++ -c main.cpp -o objdir/main.o
    

  • 你的主要目标没有改变:

  • Your main target is unchanged:

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

    这看起来像:

    g++  -o myapp objdir/window.o objdir/main.o 
    

  • 为了完整性,将 clean 目标添加到清理对象中:

  • For completeness add clean target to cleanup objects:

    clean:
        @rm -f $(TARGET) $(wildcard *.o)
        @rm -rf $(OBJDIR) 
    

  • 并定义 .PHONY 目标,例如即使存在同名的目录或文件,也会进行这些操作:

  • And define .PHONY targets, e.g. these will be made even if directories or files with the same name exist:

    .PHONY: all clean
    

  • 所以它应该是这样的:

    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) 
    

    如果你有像 main.cppa.cpp 这样的文件,这就是 make 会做的:

    And if you have files such as main.cpp and a.cpp this is what make would do:

    > 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
    

    如果您想阅读有关上述任何内容的更多详细信息,请查看 GNU 制作文档页面

    And if you want to read more details about any of the above have a look at GNU make doc page

    相关文章