GCC AVR链接报undefined reference到同文件特定函数问题咨询
问题原因分析
该现象完全匹配声明语法异常导致第一个函数未被正确识别的特征,核心原因大概率出自两处:
- 两个目标函数声明的第一行末尾遗漏分号
若MemPool_Memory_Alloc_Func的声明末尾未写分号,编译器会自动将下一行的MemPool_Memory_ReAlloc_Func声明合并为上一行的语法片段,导致第一个函数完全未被正确声明,编译器会默认生成返回值为int的隐式函数声明,和实际库中函数的符号不匹配,链接时就会报未定义引用。互换两个函数的声明顺序后,第一行变成MemPool_Memory_ReAlloc_Func的声明,语法错误就会转移到后者身上,完全符合你遇到的现象。 MEMPOOL_API_CALL宏定义存在语法错误
该宏通常是用来指定函数调用约定、符号可见性的属性宏,比如AVR GCC下常见的__attribute__((far))、extern "C"等。如果宏定义的末尾多写了多余的分号,比如:
展开后第一个函数的声明就会变成无效的空声明,// 错误的宏定义,末尾多了分号 #define MEMPOOL_API_CALL __attribute__((section(".sram_text")));MemPool_Memory_Alloc_Func的声明没有被正确加上对应属性,甚至被编译器判定为无效声明,同样会触发隐式声明导致符号不匹配。
解决步骤
- 首先检查两个目标函数声明的末尾是否都正确添加了分号,补全遗漏的分号即可
- 打印
MEMPOOL_API_CALL宏的展开结果,确认宏定义末尾没有多余分号,展开后语法合法,可在声明位置附近加代码临时验证:#define STRINGIFY(x) #x #define TOSTRING(x) STRINGIFY(x) #pragma message "MEMPOOL_API_CALL 展开结果: " TOSTRING(MEMPOOL_API_CALL) - 额外检查两个函数声明所在的头文件是否存在
#ifdef条件编译分支未闭合的问题,避免声明被错误裁剪
内容的提问来源于stack exchange,提问作者Scavanger
相关产品推荐
相关产品推荐

