我正在使用gmake并gcc -MM跟踪手册中的标题依赖项.该机制依赖于makefile include指令来导入计算的依赖项.
由于.d文件包含在makefile中,因此它们必须存在于任何目标中,包括clean.因此,在clean做正确的事情之前,必须生成依赖关系,如果一个人无法构建,那么就会clean变得更加混乱.
此外clean,它希望在构建任何目标之前创建所有依赖项.
此外,如果任何文件被更改为包含不存在的文件,则依赖关系解析会中断,并且根本不会构建任何文件.
如果删除了标头,那么现有的依赖项文件仍然将其命名为目标,并且在删除有问题的依赖项文件之前不会构建任何内容...这是无法完成的clean.
include用通配符替换替换模式以包含所有预先存在的依赖项文件可以解决一些问题,但它仍然无法清除损坏的依赖项,并且永远不会删除过时的依赖项文件.有更好的解决方案吗?该手册的示例是否真正用于实际用途?
我正在尝试构建一个模式规则,允许我%在宏调用中使用,但我没有得到我期望的结果。
模式规则:
%.o: %.cpp $(%_H)
g++ -o $@ $(FLAGS) -c $<
Run Code Online (Sandbox Code Playgroud)
问题出在 $(%_H)
出于某种原因%,没有扩展到它定义的范围。
当我打印出依赖列表时($^),只打印源文件。
我有一种非常干净的方式来设置我想使用的依赖项:
# Header Dependencies per object
Geometry_H:=Geometry.h $(Error_H)
Enemy_H:=Enemy.h $(Geometry_H) $(Error_H)
Surface_H:=Surface.h $(Geometry_H)
Player_H:=Player.h $(Geometry_H) $(Surface_H)
SDLWindow_H:=SDLWindow.h $(Surface_H) $(Error_H)
Path_H:=Path.h $(Geometry_H) $(Error_H)
Territory_H:=Territory.h $(Geometry_H)
Board_H:=Board.h $(Territory_H) $(Geometry_H) $(Player_H) $(Path_H) $(Enemy_H) $(Error_H)
Error_H:=Error.h
Diminisher_H:=Diminisher.h $(SDLWindow_H) $(Geometry_H) $(Surface_H) $(Board_H) $(Error_H)
Main_H:=$(Diminisher_H)
Run Code Online (Sandbox Code Playgroud)
另一个人建议我将这些变量更改为依赖项列表。
即 Main_H:=$(Diminisher_H)
变成 Main.o: $(Diminisher_H)
这是一个很好的修复,它有效。然而,问题仍然存在,$(%_H)不知何故无效。
我想知道如何(如果可能)使其成为有效的表达式。
我已经尝试过$( $%_H ), $( $(%)_H ),$( …
我正在尝试构建一个正确的Makefile.
我想要的是完全控制正在发生的事情,所以我不想要任何第三方软件.
我当前的尝试对我来说似乎是逻辑,但由于依赖关系生成无效,我有点卡住了.
为了更好的可读性,完整的Makefile被分成几小块.如果有什么需要改进,我将不胜感激任何评论.
首先,我有以下静态定义
CXX = g++
CXXFLAGS = -Wall \
-Wextra \
-Wuninitialized \
-Wmissing-declarations \
-pedantic \
-O3 \
-p -g -pg
LDFLAGS = -p -g -pg
DEPFLAGS = -MM
Run Code Online (Sandbox Code Playgroud)
Afaik这应该没问题.使分析标志可选是完美的,但这并不重要.
SRC_DIR = ./src
OBJ_DIR = ./obj
SRC_EXT = .cpp
OBJ_EXT = .o
TARGET = ./bin/my_target
SRCS = $(wildcard $(SRC_DIR)/*$(SRC_EXT))
OBJS = $(subst $(SRC_DIR), $(OBJ_DIR), $(SRCS:$(SRC_EXT)=$(OBJ_EXT)))
DEP = depend.main
Run Code Online (Sandbox Code Playgroud)
基本上,这应该只是提取所有*.cpp文件出的子文件夹中src,另外更换./src用./obj,并.cpp与.o作为对象的名称.
.PHONY: clean all depend
all: …Run Code Online (Sandbox Code Playgroud)