Uboot 编译问题-
“xxx aliased to external symbol xxx”
编译器 arm-linux-gnueabi-gcc 7.4 (ubuntu1804)
Uboot 2010-03 (iTopeet4412)
编译时出现错误:
board.c:105:6: error: ‘coloured_LED_init’ aliased to external symbol ‘__coloured_LED_init’
void coloured_LED_init (void) attribute((weak, alias("__coloured_LED_init")));
以及几个同类错误问题。
找出源文件:
find -name board.c
定为到
./lib_arm/board.c 105行:
void inline __coloured_LED_init (void) {}
void coloured_LED_init (void) attribute((weak, alias("__coloured_LED_init")));
编译器提示结果是别名冲突,coloured_LED_init 函数为weak属性,可由外部重新定义,alias可对外别名为__coloured_LED_init ,而__coloured_LED_init申明为inline内联函数。
查阅资料,gcc中似乎有规定,内联(inline)函数是不能添加弱符号定义(weak)。
个人理解是,inline函数相当于宏替换。alias应该是函数别名,如果对外申明了函数别名(alias),那么coloured_LED_init即是函数__coloured_LED_init,而该函数申明为inline后,在编译时被宏替换,即没有改函数实体,如果外部程序需要条用,是找不到的,自然编译不会通过。因此,这两个属性(inline和weak)不能同时申明。
尝试解决:
1:去掉__coloured_LED_init 函数的inline修饰,函数效率略有降低,但对整个编译过程改动几乎不用改动。
2:保留inline,去掉weak修饰,保证原有效率,但所有c文件中引用alias修饰名的函数全部要修改(参考)
Tick:Vim 下使用dw可以在浏览模式下删除光标所在的单词的后面几个字母。。。