当我调试和优化我的一个C / C ++项目时,我经常禁用并启用分析标志-p -g -pg
和我的Makefile中的一些优化标志,以便更好地了解发生的事情。
但是,GNU make
未检测到此更改,并且未进行重新编译。
如何在不手动执行make clean
的情况下,使用一些新标记(或删除一些标记)正确重建整个软件项目?
答案 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个自动工具。