C 外部全局变量

C 外部全局变量,c,linker,global-variables,extern,cpu-registers,C,Linker,Global Variables,Extern,Cpu Registers,我目前正在为AVR ATMega8微控制器开发一个项目。假设我有多个文件: 初始c: __no_init __regvar unsigned char flags@ 4; __no_init __regvar unsigned char tb_flags@ 5; __no_init __regvar unsigned char st_flags@ 6; __no_init __regvar unsigned char dp_flags@ 7; __no_init __regvar uns

我目前正在为AVR ATMega8微控制器开发一个项目。假设我有多个文件:

初始c:

__no_init __regvar unsigned char flags@ 4; 
__no_init __regvar unsigned char tb_flags@ 5; 
__no_init __regvar unsigned char st_flags@ 6; 
__no_init __regvar unsigned char dp_flags@ 7; 
__no_init __regvar unsigned char g83_flags@ 8; 
__no_init __regvar unsigned char ms_flags@ 9; 
__no_init __regvar unsigned char co_flags@ 10; 
__no_init __regvar unsigned char tm_cs5460@ 11; 
__no_init __regvar unsigned char tm_noZX@ 12; 
__no_init __regvar unsigned char tm_state@ 13;
通过这些代码,我告诉编译器我想使用寄存器来存储全局变量(memmory优化)。此文件包括下一个文件Defines.h

定义.h:

extern __no_init __regvar unsigned char flags@ 4; 
extern __no_init __regvar unsigned char tb_flags@ 5; 
extern __no_init __regvar unsigned char st_flags@ 6; 
extern __no_init __regvar unsigned char dp_flags@ 7; 
extern __no_init __regvar unsigned char g83_flags@ 8; 
extern __no_init __regvar unsigned char ms_flags@ 9; 
extern __no_init __regvar unsigned char co_flags@ 10; 
extern __no_init __regvar unsigned char tm_cs5460@ 11; 
extern __no_init __regvar unsigned char tm_noZX@ 12; 
extern __no_init __regvar unsigned char tm_state@ 13;
我这样做是因为defines.h包含在我项目中的每个文件中。因此,我认为所有全局变量的范围都是整个项目,但我得到了一个奇怪的错误:

Error[e46]: Undefined external "st_flags" referred in main ( C:\Users\Alex\Desktop\CentroStirling\Progreso\MSUIAR\Debug\Obj\main.r90 ) 
Error[e46]: Undefined external "dp_flags" referred in main ( C:\Users\Alex\Desktop\CentroStirling\Progreso\MSUIAR\Debug\Obj\main.r90 ) 
Error[e46]: Undefined external "g83_flags" referred in main ( C:\Users\Alex\Desktop\CentroStirling\Progreso\MSUIAR\Debug\Obj\main.r90 ) 
Error[e46]: Undefined external "flags" referred in main ( C:\Users\Alex\Desktop\CentroStirling\Progreso\MSUIAR\Debug\Obj\main.r90 ) 
Error[e46]: Undefined external "co_flags" referred in main ( C:\Users\Alex\Desktop\CentroStirling\Progreso\MSUIAR\Debug\Obj\main.r90 ) 
Error[e46]: Undefined external "tm_noZX" referred in main ( C:\Users\Alex\Desktop\CentroStirling\Progreso\MSUIAR\Debug\Obj\main.r90 ) 
Error[e46]: Undefined external "tm_state" referred in main ( C:\Users\Alex\Desktop\CentroStirling\Progreso\MSUIAR\Debug\Obj\main.r90 )
如果仔细看,有10个全局变量,只有7个错误。这意味着他们中的一些人正在被认可


我能做些什么来解决这个问题?

您确定其中一些问题已被识别吗?也许你没有在它们的定义文件之外使用这些变量,因此它们不需要被链接。大体上,我给所有变量一个值只是为了测试是否需要通知编译器你想“锁定”一定数量的寄存器,也许你没有这样做。