使用Makefile、源生成器和gcc生成依赖关系
Working with Makefile, source generators and generating dependencies with gcc
在项目中,我有:
main.cpp
template.sth
- 更多
对于每个.cpp
文件,我生成.o
文件。多亏了这一点,我可以为所有.o
目标编写简单的规则(为了更清晰,简化了一点伪代码版本):
OBJS = #list of all .o files needed
%.o: %.cpp
g++ -MM -MF %.d -MP -MT %.o %.cpp
g++ -c -o %.o %.cpp
然后我将包括所有现有的.d
文件,因此在每次生成之后,我都会刷新依赖关系。
除非我有template.sth
,否则它是有效的。该文件包含一些用于生成h
文件和cpp
文件的模板。
当一个文件,即main.cpp
包括从template.sth
(比方说gen.h
)生成的文件时:
- 生成
.d
文件的指令不起作用,因为缺少gen.h
:fatal error: gen.h: No such file or directory
include "gen.h"
- 即使这些说明有效,我的"工作流程"也有问题。到目前为止,我可以为下一次制作生成
.d
文件。它起作用了,因为添加新的依赖项需要更改当前的一个依赖项。因此,在添加一个CCD_ 18之后进行重建,并生成新的CCD_ 19。现在我需要检测到,在制作.o
之前,我需要从template.sth
生成gen.h
有什么方法可以自动完成吗?问题1。如果有某种方法告诉CCD_ 23,如果某个CCD_。解决问题1。多次执行make(我认为两次总是足够的)最终会生成项目(第一个make
会生成依赖文件,然后第二个make
看到main.cpp
依赖于gen.h
,gen.h
缺失,并且有关于如何创建gen.h
的指令,因此它将在构建main.o
之前创建gen.h
)。
如果它不能以某种方式自动完成,如何解决?我可以在Makefile
指令中编写,它将在任何其他指令之前构建所有生成的文件吗?或者我需要手动将此生成的文件添加为所有.o
指令中的依赖项吗?
更新:
经过几次更改后,使用-MG
标志g++
即使对于gen.h
也会生成正确的文件。我现在可以用两个make
命令构建我的项目了。第一个将创建正确的.d
文件并中断,因为缺少gen.h
。第二个将准备好.d
文件,因此它将在构建main.o
之前生成gen.h
,因此构建main.o
将成功。
在生成.o
之前,有没有一种方法可以生成.d
文件并使用它?
您需要为生成的文件添加依赖项:
gen.h: template.sth
...command to create gen.h from template.sth
如果你有很多生成的文件,你可能想要一种自动创建这些依赖关系的方法,这将取决于你如何生成它们。
此外,您希望独立于.o文件生成.d文件,并在生成它们时使用-MG
标志来忽略丢失的文件:
%.d: %.cpp
g++ -MM -MF $@ -MP -MG $<
-include $(OBJS:.o=.d)
这样,第一次运行make时,它将生成具有依赖项的.d
文件,然后重新读取它们并重新计算所有依赖项,然后再尝试构建其他文件。
- 如何从C++中的依赖类型中获得它所依赖的类型
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 奇怪的结构&GCC&clang(void*返回类型)
- GCC本机矩阵运算库
- GCC,CMake,预编译标头和维护依赖项
- 依赖GCC/LLVM的"-fexceptions"在技术上是未定义的行为吗?
- c++ 中带有容器迭代器的循环类型依赖关系(GCC 失败,而 MSVC 正常)
- GCC 一起构建对象和依赖项文件
- GCC 5.1 库对旧发行版的依赖 - walkthough
- GCC 为依赖于默认构造函数的模板化类中的静态数据成员提供"undefined reference"错误
- 仅针对直接依赖关系链接GCC/LD
- 使用Makefile、源生成器和gcc生成依赖关系
- c++库是否依赖于C库?(对于GCC和linux来说)
- GCC—gc-sections和查找符号依赖项
- 依赖模板可以在Visual Studio中编译,但在clang/gcc中失败
- 是否有可能在Makefile的单次传递中使用gcc/g++/nvcc自动依赖-M而不将依赖保存到文件中?
- GCC、Clang和IBM在如何执行依赖模板参数的名称查找方面存在分歧.哪一个是对的
- 使用GCC依赖文件会导致Make每次都完全重建项目
- GCC 自动依赖完整路径
- GCC依赖跟踪:-M比-MM好吗?