解决Linux下交叉编译U-Boot源码时报'multiple definition of `yylloc''的错误
解决Linux下交叉编译U-Boot源码时报’multiple definition of `yylloc’’的错误。。。
一、编译环境
环境 | 值 |
---|---|
操作系统 | Fedora release 35 (Thirty Five) |
交叉编译环境 | gcc-linaro-6.1.1-2016.08-x86_64_aarch64-linux-gnu |
Linux 内核版本 | 5.14.16 |
U-Boot版本 | 1.7.4(板子厂商特供版) |
二、问题描述
我们可以从报错信息看到,dtc-parser.tab.o
和scripts/dtc/dtc-lexer.lex.o
这两个中间文件中对yylloc
多重定义了,导致在链接时,产生了报错。
1 |
|
我百度了一下,有文章说可以通过修改scripts/dtc/dtc-parser.tab.h
,将里面的yylloc
定义去掉就好了[1],但是我发现我找不到这个文件。其实是因为我先执行了make distclean
,清除了构建信息,这个文件就没有了,所以说这个改法不是永久的,就算是临时的,我发现我改了也没有作用😅。
也有文章说,是因为版本使用了gcc-10
,对其进行降版本就行了[2],但是我交叉编译版本本来就是低于10的,所以说也是解决不了😫。
三、🎉解决方案
3.1 🎈方法一
在问题描述那里,我已经指出,这是多重定义的原因。多重定义的出现是因为 gcc
中的-fcommon
将它们合并为一个了[3][4][5],尽管添加了extern
还是会导致多重定义,故这就说明这个定义完全就是多余的,可以直接去掉也不影响程序的运行。
所以,你可以选择:
- 下载最新的U-Boot版本,最新的已经删掉了。
- 前往
scripts/dtc/dtc-lexer.l
文件,找到YYLTYPE yylloc;
并注释掉即可。
至于
-fcommon
是什么东西?,可以参考-fcommon, -fno-common
3.2 🎈方法二
换个系统试试,感觉交叉编译器在不同系统的编译行为有点奇怪😓目前还没找到原因….我是Fedora
切换到了Ubuntu
,构建成功了,人麻了。
3.3 🎈方法三
文章是通过在顶层文件Makefile
中添加HOSTCFLAGS += -fcommon
[6],亲测有效,具体细节可以参考文章6。
四、参考
- 荔枝派编译uboot时出现错误multiple definition of `yylloc‘_zhvngchvng的博客 ↩
- multiple definition of `yylloc’ - 永明 ↩
- Remove redundant YYLOC global declaration (018921ee) · Commits · U-Boot / U-Boot · GitLab (denx.de) ↩
- scripts/dtc: Remove redundant YYLOC global declaration · torvalds/linux@e33a814 (github.com) ↩
- Multiple definition of yylloc in u-boot and linux-kernel - githubmemory ↩
- 编译itop4412 uboot失败,提示multiple definition of `yylloc‘; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first_ZLK1214的专栏-CSDN博客 ↩
解决Linux下交叉编译U-Boot源码时报'multiple definition of `yylloc''的错误
http://1291945816.github.io/2021/12/01/解决Linux下交叉编译U-Boot源码时报'multiple definition of `yylloc''的错误/