如何编写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来处理头文件中的更改的主要内容,如果未能解决你的问题,请参考以下文章