(作为序言,我意识到这是古怪而不是标准的c ++实践,但它适合我的目的。)
好吧,所以我有一个C ++库,它基本上都是头文件,因为它大量使用模板。几乎每个头文件都包含一个类定义(“ButterworthFilter.h”,“Interpolator.h”等)。我想让它成为每个类的第二个“独立”版本,这样它们就可以轻松地传输到不同的项目,而无需占用整个库。所以基本上这个手动版本将进入每个标题,查看#include依赖项,然后将这些包含的类复制/粘贴到原始文件中#included的顶部。这样做的问题是,只要原始文件中的某个文件发生了更改,就需要更改,因此只要进行更新,就应该以编程方式完成。我想用perl脚本来做这件事,但这几乎必将失败。
有没有办法让编译器输出每个依赖文件的整个内容?例如,我可以告诉编译器输出ButterworthFilter.h的依赖关系,它会检查#includes,看它依赖于Filter.h,并输出所有的Filter.h(以及递归的任何依赖关系)。更好的是,这是一个实际操作这样的库的程序。我认为拥有一个可以生成隐藏在某个库中的任何有用类的独立版本的工具会很棒。
无论如何,我希望这个问题有意义并提前感谢。
答案 0 :(得分:2)
您可以使用编译器来编写预处理的结果。通常,您使用-E
选项来获取预处理文件的结果。 proprocessed文件往往具有行号和原始文件的指示 - 您可能想要删除它们。当然,这也会扩展宏,但除了包含保护之外你还希望不使用任何宏......
答案 1 :(得分:0)
你朝着正确的方向前进:http://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html
有-M选项可以生成适合make的规则 - 所以它列出了所有相关文件 - 这就是所有头文件,因此make可以知道如果头更改,则必须重新编译目标文件。与-MF选项一起使用。
来自gcc doc:
-M Instead of outputting the result of preprocessing, output a rule suitable for make describing the dependencies of the main source file. The preprocessor outputs one make rule containing the object file name for that source file, a colon, and the names of all the included files, including those coming from -include or -imacros command line options. ... This option does not suppress the preprocessor's debug output, such as -dM. To avoid mixing such debug output with the dependency rules you should explicitly specify the dependency output file with -MF, or use an environment variable like DEPENDENCIES_OUTPUT...