【发布时间】:2023-09-18 11:03:01
【问题描述】:
我正在尝试使用 makefile 编译我的项目。我是makefile的新手,所以请原谅我的无知。我遇到的问题是我希望输出命令构建所有 .o 文件,但是如果我这样运行它,它将不会构建 .o 文件,而是会尝试编译所有 .o 文件/obj 目录。
如何编译输出规则中的所有 .o 文件规则?
The directory structure for this project is:
recipe_book
|-GFX (source directory)
|-PageManager (source directory)
|-Pages (source directory)
|-main (source directory)
|-obj (.o files directory)
|-out (application output)
这是我的 Makefile:
#COMPILER_FLAGS specifies the additional compilation options we're using
# -w suppresses all warnings
COMPILER_FLAGS = -w -g
#LINKER_FLAGS specifies the libraries we're linking against
LINKER_FLAGS = -lSDL2 -lSDL2_image
G++ = g++ -std=c++17 $(LINKER_FLAGS) $(COMPILER_FLAGS)
#Source Directories:
GFX := GFX
PAGE_MANAGER := PageManager
PAGES := Pages
#Object Directory:
OBJ := obj
# Complile the objects into the executable
output: main/main.cpp main/main.hpp $(OBJ)/*.o
$(G++) main/main.cpp $(OBJ)/*.o -o out/recipe_book.out
#make all object files
#'.' turns them into macros?
#GFX
$(OBJ)/%.o: $(GFX)/%.cpp $(GFX)/%.hpp
$(G++) -I$(GFX) -c $< -o $@
#PageManager
$(OBJ)/%.o: $(PAGE_MANAGER)/%.cpp $(PAGE_MANAGER)/%.hpp
$(G++) -I$(PAGE_MANAGER) -c $< -o $@
#Pages
$(OBJ)/%.o: $(PAGES)/%.cpp $(PAGES)/%.hpp
$(G++) -I$(PAGES) -c $< -o $@
clean:
rm out/*.out obj/*.o
【问题讨论】:
-
你必须使用make文件吗?其他构建系统更容易学习/使用
-
我使用 make 只是为了让事情变得简单......如果我列出所有生成的 .o 文件,我觉得如果我能弄清楚最后一个,使用 make 会很好部分。我也在为多个平台(Linux、Rasperry Pi、Windows)开发这个
-
您想要工作目录中的目标文件 (
.o)?如果是这样,那么我认为将OBJ := obj更改为OBJ := .就足够了。 -
哦,对不起,我可能没有把自己说得那么清楚。我希望 .o 文件位于 obj 目录中。问题是,当我构建它时,它不会构建任何 .o 文件。我想让输出将 obj 目录中的所有内容编译到 out 目录中,以保持整洁。