2

我一直在尝试在我的 makefile 中使用自动依赖项,但我为使其工作付出了很多努力,因为我为我的项目使用了更复杂的结构,而不仅仅是将每个文件都放在根文件夹中。

我尝试在我的 makefile 中使用这段代码:

OBJECTS_DIR = obj/
SRCS_DIR = src/
#source files list, i.e : src/foo.cpp src/bar/foo2.cpp
SOURCES = $(shell find $(SRCS_DIR) -name \*.cpp | xargs -d '\n')
#object files list, i.e : obj/foo.o obj/foo2.o
OBJECTS = $(addprefix $(OBJECTS_DIR), $(notdir $(SOURCES:.cpp=.o)))
DEPS = $(OBJECTS_DIR)make.dep

myproject : $(OBJECTS)
    $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^

$(OBJECTS) : $(SOURCES)
    $(CC) $(CFLAGS) $(LDFLAGS) -o $@ -c $(filter %/$(notdir $(@:.o=.cpp)), $(SOURCES))

$(DEPS): $(SOURCES)
    $(CC) -MM  $(SOURCES) > $(DEPS)

-include $(DEPS)

all : myproject

clean :
    @-rm -f $(RELEASE_DIR)* $(OBJECTS_DIR)*

我想将所有依赖项存储在 obj/make.dep 文件中。这给了我以下输出(这里 foo 包括 foo2):

foo2.o: src/bar/foo2.cpp src/bar/headers/foo2.h
foo.o: src/foo.cpp src/bar/headers/foo2.h

我想重命名每个目标文件以获得以下输出: obj/foo2.o: src/bar/foo2.cpp src/bar/headers/foo2.h obj/foo.o: src/foo。 cpp src/bar/headers/foo2.h

我已经尝试使用 -MT 选项但没有结果......此外, -include $(DEPS) 是否足以包含我创建的依赖项?我不应该将 OBJECT 规则中的 $(filter %/$(notdir $(@:.o=.cpp)), $(SOURCES)) 替换为 make.dep 文件中写入的行吗?

提前感谢您的洞察力,请告诉我是否有任何其他方法可以增强我的 makefile !

4

2 回答 2

1

您将所有依赖项存储在 1 个文件中的原因是什么?按照惯例,每个目标文件都有自己的 .d 文件,该文件是在编译期间创建的,这就是你的 .d 文件-include。在这种情况下,将 -MT 标志等添加到与初始编译相同的命令中以获取正确的对象目录和名称要简单得多。

我会按照这个问题的答案做更多的事情:

使用 -MM 生成包含指令和依赖项

好消息是所有依赖项的生成都将在编译步骤中发生,因此您不必对 gcc 进行额外的调用。对于一个小文件来说,将所有依赖项放在一个文件中可能是可以的,但是如果您希望您的 makefile 可以扩展,那么最好执行上述操作。

于 2013-03-10T17:34:38.330 回答
1

您应该使用模式规则来生成.o文件。

$(OBJECTS_DIR)/%.o : %.c 
        $(CC) $(CFLAGS) -c -o $@ $^ 

您必须处理依赖文件以将 OBJECTS_DIR 添加到目标路径。 sed使这变得简单。您可能还希望它依赖于.h文件。

$(DEPS): $(SOURCES) $(shell find . -name '*.h')
        $(CC) -MM  $(SOURCES) | sed 's#^\(.*:\)#$(OBJECTS_DIR)\1#' > $(DEPS)
于 2013-03-10T21:31:25.520 回答