首先编译/生成上次修改的cpp文件

时间:2016-07-22 12:24:44

标签: c++ makefile

当我处理cpp文件时,我经常需要更改该cpp文件引用的头文件。例如,假设我有三个文件:

common-headerh      [file referred to by both cpp files]
file1.cpp
file2.cpp

在我的make文件中,我有相当于的命令:     g ++ -std = c ++ 0x file1.cpp file2.cpp

我想要一个自动重新排序编译顺序的makefile,以便首先编译最近修改过的文件。换句话说,如果最近修改了file1.cpp,我希望我的make文件可以执行:

g++ -std=c++0x file1.cpp file2.cpp

但是,如果最近修改了file2.cpp,我希望make文件做INSTEAD:

g++ -std=c++0x file2.cpp file1.cpp

我怎样才能以自动化方式做到这一点?还欢迎特定于特定IDE /构建环境的答案。

**********背景**********

我有一个大项目(编译大约需要7分钟),我的很多代码都存放在头文件中的模板中[在上面的例子中是common-header.h]。众所周知,如果没有引用的.cpp文件,模板代码就不会 - 更准确地说 - 不能编译。假设我想在file2.cpp中添加一个新功能,最后我用模板对其进行编码。这意味着我被迫将我的新代码放在common-header.h中。当然,这些新代码只在编译file2.cpp时编译。但是,由于头文件已被修改,file1.cpp也需要重新编译。这一切都很好,但是我说我在common-header.h中的新模板代码中输入了一个基本错字。然后我必须等待整个file1.cpp在file2.cpp之前编译。但是,如果首先编译file2.cpp,我会立即知道我的拼写错误,而无需等待file1.cpp的编译。

当然,一个快速的解决方案是手动重新编译file2.cpp。但是,所有错误修复都发生在头文件中:file2.cpp不是我IDE中的焦点窗口。所以,我必须导航到正确的cpp文件,该文件引用common-header.h并从那里重新编译。更不用说我经常简单地将编译快捷方式与构建快捷方式混淆,必须中止构建,自然会分心。或者,我只是放弃并转到youtube等待整个构建,导致可怕的生产力。

感谢您的建议

3 个答案:

答案 0 :(得分:0)

没有灵丹妙药可以减少编译时间,特别是模板,只有一般方法。您应该查看是否可以减少代码耦合,将标头拆分为多个文件,以便更改不会影响整个项目。如果您更改包含在任何位置的标头,则需要重新编译所有内容。您还可以尝试将当前正在修改的功能与整个项目文件分开,以便编译器在进行更改时不必一次又一次地重新编译未更改的代码。此外,如果它是您的选项,请使用预编译的标题。

答案 1 :(得分:0)

我可以考虑使用bash脚本,例如:

ls -tr

这已经提供了从最新订购的文件夹中的文件,如果您有其他文件,则可以使用grep仅检索.cpp。

有了这个,你就可以形成g ++命令了。

如果在Makefile中的命令之前添加注释:

#replace
g++ -std=c++0x file1.cpp file2.cpp

然后使用sed,您可以使用类似

的内容查找和替换订单
NEWCMD=$( ls -tr your/directory | grep .cpp )
NEWCMD="g++ -std=c++0x $NEWCMD"
sed '/#replace/!b;n;c$NEWCMD' Makefile

你需要在Makefile之前运行它,但Makefiles承认一些bash,所以也许有办法把它放在那里而不必调用sed。

我没有对此进行测试,但尚未发表评论:)

答案 2 :(得分:0)

如何指导make构建您最感兴趣的文件?

  

一个快速解决方案是手动重新编译file2.cpp

自动总是更好,对吗?一个叫做make1的小脚本怎么样?

#!/bin/sh
tgt=$(ls -t *.cpp | sed '1 s/\.cpp$/.o/; q')
make $tgt && make

当然,$tgt不必是单个文件;它可能是按时间顺序排列的所有文件。

我简化了;您的源树可能在几个地方有对象。但是,如果您可以枚举它们并按修改时间对它们进行排序,那么您可以识别出最有趣的"目标。