为什么可能有必要强制重建程序?

Why might it be necessary to force rebuild a program?

我正在关注 Warren Gay 的“Beginning STM32”一书(顺便说一句,迄今为止非常好),其中介绍了如何开始使用 Blue Pill。

让我感到困惑的部分是,当我们将第一个程序放在我们的 Blue Pill 上时,书中建议在将程序闪存到设备之前强制重建该程序。我使用:

make clobber

make

make flash

我的问题是:为什么这是必要的?既然程序已经制作完成,为什么不直接刷入程序呢?我的猜测是它只是为了学习如何制作一个未制作的程序......但我也想知道在闪存到设备之前重建是否是最佳实践?书上没有说为什么?

你得问问作者,但我建议不要再“以防万一”了。不相信 make 文件可能指定了所有可能的依赖项。如果 makefile 是在没有自动生成依赖项的情况下手动构建的,那是完全有可能的。此外,简单地建议重建比解释所有可能需要或其他情况的情况更容易,后者不会详尽无遗。

从作者的角度来看,它消除了一些超出他控制范围的可能的构建一致性错误,因此它确保您最终不会认为这本书是错误的,而实际上您可能已经这样做了作者无法控制。

即使使用自动生成的依赖项,项目也可能具有 makefile 或依赖项生成器无法捕获的依赖项,例如用于使用自定义工具生成代码的资源文件。

对于长期开发的大型项目,一些很少修改的模块很可能已经使用旧版本的工具链进行编译,干净的构建确保所有内容都已编译并与当前工具链接。

make 根据文件时间戳构建依赖;如果您有由命令行宏控制的构建变体,make 将无法确定哪些依赖项依赖于此类宏,因此在构建不同的变体时(例如从“调试”构建切换到“发布”构建), 重建所有以确保每个模块一致和兼容是个好主意。

我建议在 build/debug 周期中使用增量构建来提高预期的开发速度,并为发布或更改某些构建配置(例如 enabling/disabling 浮点数)执行重建例如硬件或切换到不同的处理器变体。

如果在调试期间您得到的结果似乎毫无意义,例如断点和代码步进与源代码不一致,或者崩溃或行为似乎与您可能所做的一些小更改无关(也许代码甚至还没有被执行),有时 这可能是由于构建不一致(出于各种原因,通常是复杂的构建),在这种情况下,至少 通过执行全部重建消除建立一致性的原因。

当然,如果您要将代码发布给第三方,例如客户或为了生产某些产品,您可能希望执行干净的构建以确保构建的一致性。您不希望用户报告您无法重现的错误,因为给他们的构建是不可重现的。

重建完整的软件是一个很好的做法,因为在这里您将生成所有依赖项和符号文件路径以及您的本地计算机路径。
如果您需要使用调试器调试任何应用程序,那么您可能需要符号文件和存在源代码的路径,如果您直接闪存应用程序而不重建,那么您可能无法调试某些路径,因为您没有得到了解应用程序是在哪个路径编译的,您可能会错过符号相关信息。