3

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

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

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

4

4 回答 4

5

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

于 2012-07-05T01:31:00.667 回答
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 */

现在写入-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”具有正确的相对路径。

于 2012-07-05T01:17:58.690 回答
0

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

于 2012-07-08T16:07:38.097 回答
0

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

于 2012-07-08T16:16:16.667 回答