繁体   English   中英

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

[英]Automatic recompile on compiler flag change

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

但是, GNU make没有检测到这种变化,也没有进行重新编译。

如何正确地重建一个整个软件项目与一些新标志(或一些删除),而无需手动make clean

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

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

作为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 */

现在编写 - 在-include Makefile_flags中包含Makefile_flags,并在要更新的源代码的每个文件中包含#include "Makefile_flags" (例如,在每个* .c / * .cpp文件中)。

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

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

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

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

如果可能,您可以使用更智能的构建系统。 我使用SCons ,它有这样的东西建立它。 它还具有很好的功能,例如自动扫描文件的头部依赖性,因此您不必手动保持最新或运行20个自动工具。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM