该报错是基于 demo_DevKitBoard
这个工程
解决 C/C++ 链接器报错:symbol from plugin || first defined here
在C/C++的开发过程中,编译阶段经常会遇到各种错误,其中符号重定义是较为常见的错误之一。最近我在构建一个嵌入式项目时遇到了以下报错:
obj\Release\apps\common\example\peripheral\gpio\gpio.o (symbol from plugin) || In function `__initcall_c_main':
obj\Release\apps\common\example\peripheral\adc\adc_test.o (symbol from plugin) || first defined here
这篇博客将详细分析这个错误的原因,以及如何有效解决符号重定义问题。
一、错误的含义
让我们首先拆解一下错误信息:
-
symbol from plugin
:这是编译器或链接器提示的一部分,意思是符号(如函数、变量)来自某个插件或模块。在嵌入式项目中,这个“符号”通常指的是某个硬件驱动或功能模块相关的定义。 -
first defined here
:这个提示意味着某个符号在一个模块(这里是adc_test.o
)中第一次被定义,而链接器发现另一个模块(这里是gpio.o
)也尝试定义同样的符号。 -
符号重定义:链接器不能接受同一个符号(函数名或全局变量)被多次定义,这种情况下会导致链接错误。
在我的例子中,__initcall_c_main
这个符号在 gpio.o
和 adc_test.o
中被定义了两次。这就导致了链接失败。
二、问题解决
/**外设类**/
#define USE_GPIO_TEST_DEMO
#define USE_ADC_TEST_DEMO
//#define USE_UART_TEST_DEMO
//#define USE_TIMER_TEST2_DEMO
//#define USE_TIMER_TEST1_DEMO
发现在 demo_config.h 中打开了两个宏,尝试关闭一个,错误就解决了,所以,用 demo_DevKitBoard
这个工程时,谨慎同一类型的宏打开多个,可能会导致某些函数重复定义