ubuntu22系统下解决编译Linux内核出现:usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss+0x50): multiple definition o

       本人新手小白按照正点原子imx6ull-mini 开发板教程《01.I.MX6ULL用户快速体验V2.6》中4.4节编译出厂源码内核和模块时出现错误:/usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss+0x50): multiple definition of `yylloc‘;scripts/dtc/dtc-lexer.lex.o:(.bss+0x0):first defined here.

       因为我用的ubuntu系统22版本高于教程的16.04版本,出现问题在意料之中。

1.问题分析

        根据错误提示,是原文件dtc-parser.tab.c和dtc-lexer.lex.c文档重复定义了yylloc变量,而且首次定义在dtc-lexer文件中。因此打算将dtc-parser.tab.c中定义变量的地方改为引用,即加extern。
2.解决步骤

        1).打开文件  gedit  scripts/dtc/dtc-parser.tab.c  ,搜索找到变量yylloc。

       2). 引用变量。

        3).保存文件,重新编译。
3. 未解决问题,重新分析现象

        根据上面步骤发现问题仍未解决,后来请教了同事大神,经过一番查找偶然发现修改的dtc-parser.tab.c 文件在编译过程中被还原,修改后的部分又被变回原来的。现象如下:

        察看了编译过程发现有一条指令这样的:

        猜测编译过程是有一份备份文件将文件还原,造成修改后的文件被覆盖,查找了文件目录果然发现了备份文件:

        将备份文件中的变量定义改为引用,终于编译通过。

4.总结

        1)出现问题要明确问题的内容再试着解决,不要急。自己解决不了上网查资料和请教身边能力高的人是一个不错的主意,能快速给出解决思路。 
        2)在无计可施时再现一次问题,关注一些过程细节可能会有收获。这次就是本来要放弃了无意中发现文件被覆盖才找到了问题的根本原因。

        3)这种使用备份文件覆盖原文件的提高系统稳定性的方法,可能能运用到以后的项目中。