BES代码常见编译错误
本文简单列举了几个BES代码中常见的编译错误, 对BES代码编译和链接还不太理解的朋友, 关于BES是怎样使用makefile进行编译和链接的, 可以参考另一篇文章: BES代码编译链接说明
编译报错 No such file or directory
比如下图这种错误, 这个错误表示系统无法找到指定的文件或目录
一般是引用此头文件的源文件目录中的makefile没有告诉编译器在编译时查找包含我们需要的头文件的目录
一般解决方法是makefile中ccflags-y或subdir-ccflags-y添加需要包含头文件的目录路径
编译报错 undefined reference to “xxx”
这种错误提示为在代码链接(预处理和编译这两个阶段已经通过了)的时候, 链接器找不到xxx函数的定义, .h文件已经找到了, 但是源文件链接不进去
源文件的符号(函数或变量)代码在.c文件中, 使用函数的文件为.cpp文件, 此地方为C和C++混合编程引用错误, 即.cpp文件不能直接引用.c文件的函数, 需要在使用的函数前加上extern “C”, 因为C++和C语言有不同的命名规则和内存管理方式, 如果不加extern “C”, 可能会导致链接错误, 可以直接在头文件中加入如图
编译报错 missing separator
"missing separator. Stop"错误通常是由于Makefile中制表符Tab的问题导致的。在Makefile中,每行命令之间必须用Tab键或空格键进行分隔,如果缺少分隔符,就会出现这个错误提示
这里我们发现是services下的Makefile行发生的错误, 查找makefile代码发现少输入了个换行符 ‘\’ 导致的
编译报错 not declared in this scope
这个错误通常表示在当前作用域中找不到声明的变量或函数
可能有以下几种原因:
- 变量或函数没有被正确声明或定义. 确保在使用变量或函数之前已经正确地声明和定义了它们
- 变量或函数的作用域不正确. 检查变量或函数是否在正确的作用域内, 或者是否已经被移动到另一个作用域中
- 拼写错误. 请检查变量或函数的名称是否正确拼写, 包括大小写和拼写错误
这里是没有包含头文件导致的函数没有被正确声明
编译报错 section xx is not within region FLASH
这种编译错误通常表示在编译时, 程序试图访问一个位于FLASH区域之外的xxx字段, 即xxx字段的数据已经超出FLASH区域, FLASH的空间大小已经放不下xxx字段了, 说明FLASH已经用超了
这种情况需要检查是什么地方占用了大量的FLASH空间, 一般提示音也是放在FLASH中的, 可以检查提示音的音频大小
编译报错 all warnings being treated as errors
“all warnings being treated as errors” 是一个编译器错误, 通常出现在使用某些编程语言的编译器时. 这个错误表示编译器将所有的警告都视为错误, 而不是仅仅忽略它们
警告是编译器在编译代码时发出的一种提示, 通常是为了帮助程序员发现潜在的问题或错误. 例如, 警告可能指示代码中存在未使用的变量、未定义的函数、不安全的代码等
当编译器将所有警告都视为错误时, 它会阻止程序继续编译, 因为它认为程序中存在严重的问题, 这里是变量定义了没有使用的警告. 应该手动消除警告或在.mk文件中允许代码警告来解决