Error: L6218E: Undefined symbol **(referred from sys_main.o).
【情景还原】
file1
/****************************************************************************
* main.c
****************************************************************************/
#include "user.h"
// ...
extern int val;
int main()
{
// ...
val = 8;
// ...
return 0;
}
file2
/****************************************************************************
* app.c
****************************************************************************/
// ...
#ifdef USER_APP
int val = 0;
#endif
// ...
file3
/****************************************************************************
* user.h
****************************************************************************/
// ...
#define USER_APP
// ...
【直接原因】extern
声明的变量没有定义。
【间接原因】app.c
文件未包含头文件user.h
,因为宏
#ifdef USER_APP
int val = 0;
#endif
的存在,导致app.c
文件中val
的定义并未执行,仅在main.c
文件中进行extern int val;
声明,就造成了仅有声明而无定义的情况,且使用该变量的地方在程序编译时并不会报错(因为存在声明),但会在编译完成后报出Undefined symbol
的错误信息。
【解决方案】在定义变量var
的文件app.c
中包含进行相关宏定义的头文件user.h
,而不是在声明外部变量externa int val;
或者使用变量val=8;
的文件中包含相关宏定义的头文件user.h
。