是否可以在 Makefile 的单次传递中使用 gcc/g++/nvcc 自动依赖项 -M 而无需将依赖项保存到文件中?

Posted

技术标签:

【中文标题】是否可以在 Makefile 的单次传递中使用 gcc/g++/nvcc 自动依赖项 -M 而无需将依赖项保存到文件中?【英文标题】:Is it possible to use gcc/g++/nvcc automatic dependency -M in a single pass of a Makefile without saving dependencies to a file? 【发布时间】:2016-09-24 14:17:05 【问题描述】:

我试图想出一个使用 gcc/g++/nvcc 和 Makefile 的自动依赖解决方案。

我想我会想出一个解决方案,在任何编译目标之前在 Makefile 中调用 gcc -M $(SRC FILES),假设 Make 现在已经更新了编译目标的规则。

我认为可行的 Makefile 示例如下:

PROG = main.out

SRC = $(wildcard *.cc)
OBJ = $(SRC:.cc=.o)

all: $(PROG) | deps

$(PROG): $(OBJ)
    g++ -o $@ $^

$(OBJ): $(SRC)
    g++ -c $<

.PHONY: deps

deps:
    g++ -M $(SRC)

现在我想知道是否调用

    g++ -M $(SRC)

只是导致依赖项被打印到标准输出,实际上 Makefile 对自动依赖项仍然不明智。

理想情况下,我正在寻找一种解决方案,该解决方案将在 Makefile 的一次传递中运行并使用 gcc/g++/nvcc 自动依赖标志,最好是不需要将依赖关系保存到一大堆文件的解决方案。

【问题讨论】:

【参考方案1】:

您可以执行以下操作来获取.o.d 文件:

g++ -c main.cpp -o main.o -MP -MMD -MF main.d

所以在你的 Makefile 中定义你的依赖文件(例如DEPFILES)并像上面的命令一样生成.d,然后通过- 包含DEPFILES,这告诉GNU Make 包含dep 文件(如果它存在)。

-include $(DEPFILES)

【讨论】:

我发现最适合我使用的最简单的解决方案是:***.com/a/21086223/5791272 它与您的方法非常相似,但不使用“-MMD”和“-MF”。

以上是关于是否可以在 Makefile 的单次传递中使用 gcc/g++/nvcc 自动依赖项 -M 而无需将依赖项保存到文件中?的主要内容,如果未能解决你的问题,请参考以下文章

QMouseEvent 用于 QWidget 上的单次移动

使用 G++,未定义参考 std::Makefile

火炬中的单次多维索引 - 也许使用 index_select 或收集?

jdbc 批量插入和查询与使用生成键的单次插入

为啥Spring对@Cacheable注解方法的单次调用执行@Cacheable keyGenerator 2次

WSO2 Identity Server 4.5 上的单次注销