6.5. 为什么编译得到的文件不一致

一些情况下,会发现编译出来的文件(即、sdk.elf, app.bin)不一样,例如,文件的大小或者校验码发生了变化。这有几种可能的情况。

6.5.1. 同一个工程编译出来的文件不一致

有些情况下,同一个工程(即,同一个 cbp 工程、或者同一个 Makefile 工程),编译出来的文件不一致。

有下面几种可能:

  1. 工程本身的设置(编译参数等)、库文件(.a)文件、文件的链接顺序等或者源文件本身被修改了

  2. 工程内的源代码中,使用了例如 __DATE__, __TIME__ 之类的与时间相关的宏

  3. 工程所在的路径被修改了(即,移动了工程的位置),而源代码中使用了例如 __FILE__ 之类与文件路径有关的宏

6.5.2. cbp 工程与 Makefile(VSCode) 工程编译出来的结果不一致

cbp 工程与 Makefile 工程在编译链接的过程中,使用的都是同样的工具链(编译器、链接器、下载工具等)。 他们的区别在于,cbp 工程是通过 Code::Blocks 来调用工具链,Makefile 工程是通过 make 来调用工具链。

也就是说,这两者最终使用的工具链,是一致的,只是面向用户的界面有所差异。

如果两者的设置是等价的,则应该得到同样的结果。

cbp 工程并不是和 Makefile 天然同步的,两个是独立的东西,如果修改了其中一个,另外一个需要对应设置。 例如,在 cbp 工程中增加了一个文件,也需要在 Makefile 中对应增加这个文件,否则两边得到的结果是不一样的。

如果发现两者的结果不一样,考虑下面的可能:

  1. 上一节中提到的可能性

  2. cbp 工程和 Makefile 工程的设置不一致。例如,可能只修改了 cbp 工程的设置,但是未对应修改 Makefile。 如果修改了 cbp 工程,需要更新 Makefile,可以手动对应修改,也可以参考:如何将 Code::Blocks 工程转换为 make/VSCode 工程 重新生成 Makefile。