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)
这是你可以做的:
指定目标文件的目录
OBJDIR = objdir
Run Code Online (Sandbox Code Playgroud)建立需要进行编译,所有的列表对象的文件列表.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等等
添加目标以创建目录(如果该目录不存在):
$(OBJDIR):
mkdir $(OBJDIR)
Run Code Online (Sandbox Code Playgroud)在制作主目标之前制作目录:
all: $(OBJDIR) myapp
Run Code Online (Sandbox Code Playgroud)规则从当前目录中的.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)你的主要目标是不变的:
$(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)为了完整性,将clean目标添加到清理对象:
clean:
@rm -f $(TARGET) $(wildcard *.o)
@rm -rf $(OBJDIR)
Run Code Online (Sandbox Code Playgroud)并定义.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页面