当我调试和优化我的一个 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 和#include "Makefile_flags"
您想要更新的源代码的每个文件(例如,在每个 *.c / *.cpp 文件中)。
此解决方案的优点:Makefile#
用作注释的符号,因此#undef DUMMY
,#define DUMMY /*
并#foo */
在此处无效。然而,在 C/C++ 中,/*
用于多行注释。因此,编译器会忽略整个非 C 代码,并且/*
Makefile 看不到未知符号。此外,预处理器指令#undef DUMMY
注意不执行#define DUMMY
两次,并且该#foo
语句位于多行注释内。
然而,缺点是,必须将它包含在每个文件中。
确保您的文件“Makefile_flags”具有正确的相对路径。
这个问题的解决方案内置于makepp中。这会自动检测并考虑所有依赖项,更改的命令当然就是其中之一。
如果可能的话,您可以使用更智能的构建系统。我使用SCons,它有这样的东西构建它。它还具有很好的功能,例如自动扫描文件以查找标题依赖项,因此您不必手动保持最新或运行 20 个自动工具。