其实我有一个库'cryptopp',我想要的是,当我对文件进行任何更改并发出make
命令时,它应该照顾变化在源目录中的任何文件中创建。那么,cryptoopp的GNUMakefile会处理'.cpp'文件中的'if'更改,但不处理'.h'文件中所做的更改。如何编写makefile来处理头文件中的更改
那么我可以在cryptopp的'GNUMakefile'中做什么修改,以便它查看所有修改过的头文件并重新编译所有依赖于'modified'头文件的文件。
其实我有一个库'cryptopp',我想要的是,当我对文件进行任何更改并发出make
命令时,它应该照顾变化在源目录中的任何文件中创建。那么,cryptoopp的GNUMakefile会处理'.cpp'文件中的'if'更改,但不处理'.h'文件中所做的更改。如何编写makefile来处理头文件中的更改
那么我可以在cryptopp的'GNUMakefile'中做什么修改,以便它查看所有修改过的头文件并重新编译所有依赖于'modified'头文件的文件。
如果你使用g ++构建你可以让G ++生成生成文件扶养。 你可以将这些包含在主makefile中。
使用-M和-M *参数来使用此功能。 (请参阅http://gcc.gnu.org/onlinedocs/gcc-4.6.1/gcc/Preprocessor-Options.html#Preprocessor-Options)
你必须所有的依赖添加到您的Makefile:
mycode.o: mycode.cpp mycode.h somelib.h resources.h
$(CXX) -c -o [email protected] $< $(CXXFLAGS) $(INCLUDES)
如果你已经有了一个通用的模式匹配的命令行,你不必再命令说,你可以列出的依赖关系:
%o: %.cpp
$(CXX) -c -o [email protected] $< $(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)。
对于您可以尝试makedepend
,或臭名昭著的autotools
Unix的唯一的解决办法,尽管这完全是另外一个头疼......
这是一团糟。这就是为什么使用'.depend'文件(由编译器自动生成)... –
如果安装在您的系统上,您可以尝试'makedepend'。最简单的方法是将一个目标添加到您的生成文件。例如:
depend:
makedepend *.cc
您可能需要用源文件列表替换'* .cc'。然后你可以用'make depend'命令重新生成所有的依赖关系。您可能希望将错误消息重定向到/ dev/null,因为它似乎总是产生大量噪音。
感谢您的答案,这真的很有帮助 –