自动重新编译编译器标志更改

时间:2012-07-05 01:17:58

标签: c++ c makefile gnu-make

当我调试和优化我的一个C / C ++项目时,我经常禁用并启用分析标志-p -g -pg和我的Makefile中的一些优化标志,以便更好地了解发生的事情。

但是,GNU make未检测到此更改,并且未进行重新编译。

如何在不手动执行make clean的情况下,使用一些新标记(或删除一些标记)正确重建整个软件项目?

4 个答案:

答案 0 :(得分:4)

作为对Stefan上述响应的建议调整,您可以将构建配置分解为单独的文件。您可以将此配置文件的名称列为您用于构建代码的所有makefile规则的先决条件(即冒号右侧),而不是以某种方式强制包含此代码中的文件。

答案 1 :(得分:0)

要做的基本事情是让每个对象都依赖于配置文件。

作为c / c ++的一个有点疯狂的解决方案,可以使用下面的文件,它是makefile和c / c ++的正确语法。

我没有在Makefile本身中拥有所有编译器标志,而是创建了以下文件" Makefile_flags":

#undef DUMMY
#define DUMMY /*
PROFILING_FLAGS = -p -g -pg
OPTIMIZATION_FLAGS = -O3
COMPILE_FLAGS = -Wall -Wextra -Wuninitialized -Wmissing-declarations \
                -Wshadow -ftrapv -Wfloat-equal -Wundef -Wpointer-arith \
                -Wcast-align -Wunreachable-code -Wold-style-cast \
                -Wformat=2 -Winit-self -Werror-implicit-function-declaration \
                -Wredundant-decls -Wunsafe-loop-optimizations \
                -pedantic -MD -MP
CPP_STD_FLAGS = -std=c++0x
COMPILE_FLAGS += $(CPP_STD_FLAGS)
COMPILE_FLAGS += $(PROFILING_FLAGS)
COMPILE_FLAGS += $(OPTIMIZATION_FLAGS)
LINKING_FLAGS = $(COMPILE_FLAGS)
#foo */

现在在你的Makefile中写-include Makefile_flags,在你想要更新的源代码的每个文件中#include "Makefile_flags"写一下(例如在每个* .c / * .cpp文件中)。

此解决方案的优点:Makefile使用#作为评论的符号,因此#undef DUMMY#define DUMMY /*#foo */在此处无效。但是,在C / C ++中,/*用于多行注释。因此,编译器会忽略整个非C代码,并且Makefile不会看到未知符号/*。此外,预处理器指令#undef DUMMY负责不执行#define DUMMY两次,#foo语句位于多行注释内。

然而,缺点是,必须将其包含在每个文件中。

确保您拥有正确的文件相对路径" Makefile_flags"。

答案 2 :(得分:0)

正是这个问题的解决方案内置于makepp。这会自动检测并考虑所有依赖关系,并且更改的命令当然是其中之一。

答案 3 :(得分:0)

如果可能,您可以使用更智能的构建系统。我使用SCons并且它有这样的内容。它还具有很好的功能,例如自动扫描文件以获取标头依赖性,因此您无需手动保持最新版本或运行20个自动工具。