2011-09-01 197 views
4

其实我有一个库'cryptopp',我想要的是,当我对文件进行任何更改并发出make命令时,它应该照顾变化在源目录中的任何文件中创建。那么,cryptoopp的GNUMakefile会处理'.cpp'文件中的'if'更改,但不处理'.h'文件中所做的更改。如何编写makefile来处理头文件中的更改

那么我可以在cryptopp的'GNUMakefile'中做什么修改,以便它查看所有修改过的头文件并重新编译所有依赖于'modified'头文件的文件。

回答

2

你必须所有的依赖添加到您的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的唯一的解决办法,尽管这完全是另外一个头疼......

+0

这是一团糟。这就是为什么使用'.depend'文件(由编译器自动生成)... –

2

如果安装在您的系统上,您可以尝试'makedepend'。最简单的方法是将一个目标添加到您的生成文件。例如:

depend: 
    makedepend *.cc 

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