gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:27:29 25 4
gpt4 key购买 nike

我已经尝试了很多次尝试将我的 .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)

最佳答案

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

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

这是你可以做的:

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

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

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

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

  3. 如果目录不存在,添加一个创建目录的目标:

    $(OBJDIR):
    mkdir $(OBJDIR)
  4. 在创建主要目标之前先创建目录目标:

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

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

    这将导致如下结果:

    g++ -c main.cpp -o objdir/main.o
  6. 你的主要目标没有改变:

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

    这看起来像:

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

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

    .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 会做的:

> 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 make doc page

关于c++ - 使用 make 将 .o 文件移动到单独的目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8654548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com