Tiancai
因为 eide 在编译前对源文件按名称进行了排序,因此最终链接顺序和 MDK 不一样,至于 mdk 怎么处理源文件的编译顺序,我不太清楚。
链接时,链接器按顺序处理传入的 obj 文件,并为符号分配地址(定义了绝对地址的符号除外),如果顺序和之前的不一样,某个符号的地址肯定和之前的也不一样,而 hex 按地址从低到高列出程序的内容,那两者肯定不一样了;
你可以在 Keil 项目配置 -> Output
上勾选 Create Batch File
,生成构建脚本,打开脚本里面会有 ArmLink --Via .\Objects\xxx.lnp
这条命令,然后打开这个 .lnp
文件,把里面的 .o 链接顺序打乱一下,再运行脚本进行编译,对比一下 Keil 两次编译后 hex 是不是一样的;