如何编写makefile来处理头文件中的更改

Posted

技术标签:

【中文标题】如何编写makefile来处理头文件中的更改【英文标题】:how to write makefile to take care of changes in the header file 【发布时间】:2011-09-01 19:18:08 【问题描述】:

实际上我有一个库'cryptopp',我想要的是当我对文件进行任何更改并发出make 命令时,它应该处理对源目录中任何文件所做的更改。好吧,cryptopp 的 GNUMakefile 负责“.cpp”文件中“if”所做的更改,但不负责“.h”文件中所做的更改。

那么我可以在 cryptopp 的“GNUMakefile”中进行哪些更改,以便它查看所有修改后的头文件并重新编译依赖于“修改后”头文件的所有文件。

【问题讨论】:

【参考方案1】:

如果您使用 g++ 构建,您可以让 g++ 生成依赖生成文件。 您可以将它们包含在您的主 makefile 中。

使用 -M 和 -M* 参数来使用此功能。 (见http://gcc.gnu.org/onlinedocs/gcc-4.6.1/gcc/Preprocessor-Options.html#Preprocessor-Options)

【讨论】:

【参考方案2】:

您必须将所有依赖项添加到您的 Makefile:

mycode.o: mycode.cpp mycode.h somelib.h resources.h
        $(CXX) -c -o $@ $< $(CXXFLAGS) $(INCLUDES)

如果你已经有一个通用的模式匹配命令行,你就不用再说命令了,你可以列出依赖关系:

%o: %.cpp
        $(CXX) -c -o $@ $< $(CXXFLAGS) $(INCLUDES)

mycode.o: mycode.cpp mycode.h somelib.h resources.h

yourcode.o: yourcode.cpp yourcode.h mycode.h somethingelse.h

# ...

总的来说,这是一个可怕且无法扩展的混乱局面。您几乎肯定需要一个更高级别的构建系统来为您生成 Makefile。即使对于非常小的项目,在 Makefile 中保持头文件依赖项是最新的也是如此痛苦,以至于根本不值得。

有几种流行的便携式构建环境。我个人非常喜欢cmake,其中包括发现如果您更改了构建设置(例如从调试到发布)并且将始终构建所有必要的文件(例如,如果您更改 cmake 主文件并键入“make”它'会先自动为你再次运行cmake)。

对于仅适用于 Unix 的解决方案,您可以尝试 makedepend 或臭名昭著的 autotools,尽管这完全是另一个令人头疼的问题...

【讨论】:

一团糟。这就是为什么使用.depend 文件(由编译器自动生成)的原因...【参考方案3】:

如果您的系统上安装了“makedepend”,您可以尝试它。最简单的方法是将目标添加到您的生成文件中。比如:

depend:
    makedepend *.cc

您可能需要将“*.cc”替换为源文件列表。然后,您可以使用“make depend”命令重新生成所有依赖项。您可能希望将错误消息重定向到 /dev/null,因为它似乎总是会产生很多噪音。

【讨论】:

以上是关于如何编写makefile来处理头文件中的更改的主要内容,如果未能解决你的问题,请参考以下文章

如何在makefile中指定头文件目录

Makefile不会在头文件更改时重新编译

如何通过自动生成的makefile 看各个文件的依赖关系

如何使用Makefile(vim)中的ifeq检查头文件是否位于main.c中

如何将 ref 添加到 Makefile 中的 1 头文件

如何使用 makefile 生成自动头文件