嵌入式C/C++编译常见问题与分析

#1

   kcx.c:112:89: error: format specifies type 'unsigned int' but the argument has type 'u32 *' (aka 'unsigned int *') [-Werror,-Wformat]

报错原因:

int kcx(u32 *trigger)

{

ERR_MSG("%s:failed. attr=%d, trigger=%u\n", __func__, attr_enable, trigger);

传入的参数为 u32 * 类型,执行打印时格式不对。

#2

ERROR! Defconfig fragment did not apply as expected

报错原因:+# CONFIG_MEM_OFFLINE_FAIL is not set

正确的形式: #CONFIG_MEM_ONLINE_FAIL=y 

 #3

drivers/scsi/mmc/Kconfig:217:warning: no new line at end of file

C语言显示“warning: no newline at end of file ”具体原因,是因为在文件尾必须的新增一行空行,以避免include文件时,展开后与后面的文件连为一行,造成错误。

解决方法:

在*.c文件最后面添加上一个回车,独立成一行。(在程序代码的最后面多敲一个空行,也就是说在右括号后打个回车键。因为gcc对源文件有要求,就是.c or .cpp文件后面要有一个空行)。

#4

ERROR: do not initialise globals to NULL

在scsi.h 中定义:

bool disable_lpm;

在scsi.c 中:

disable_lpm = true;

#5

device.mk:108: error: commands commence before first target.

可能的原因: “Makefile可能是以命令行开始:以[Tab]字符开始,但不是一个合法的命令行(例如,一个变量的赋值)。命令行必须和规则一一对应。”

  1. 多行书写中,反斜线之后不能有空格(这种错误比较隐蔽)。

  2. 通过.PHONY特殊目标将”clean”目标声明为伪目标。避免当磁盘上存在一个名为”clean”文件时,目标clean所在的规则的命令无法执行。

只需在makefile中增加.PHONY clean,即可正常运行clean目标。

  1. 在命令行之前使用”-”,意思是忽略命令的执行错误。

  2. 包含其他的makefile:

include 指示符告诉make暂停读取当前的makefile,而转去读取include指定的一个或多个文件,完成以后在继续当前makefile的读取。

./test/config配置文件。

#6

drivers/scsi/Kconfig:216:warning: ignoring unsupported character '.'

经过搜索发现:

此处出现的符号,有可能是中文,或者是Kconfig文件中不支持的符号类型。找到该符号,然后重新修改为英文;或者,找到该符号,然后删除。

编译报错英文描述

  WARNING: Prefer 'unsigned int' to bare use of 'unsigned'

  ERROR: space required before the open parenthesis '('

  ERROR: switch and case should be at the same indent

  ERROR: open brace '{' following function definitions go on the next line

  WARNING: Possible unnecessary 'out of memory' message

#7

error: expected '=', ',', ';

原先的: /* #define ERR_INJECTION */

#ifdef ERR_INJECTION 在修改时候,没有注意, 直接把# 也一起去掉了

写成了 define ERR_INJECTION, 导致编译报错

#8

函数返回值类型错误

error: static declaration of 'scsi_exec_req' follows non-static declaration : 调用的静态函数没有先声明一下,就是它定义在你调用之后。

原因分析:调用的静态函数在调用之后声明的。

解决方法:把静态函数声明放在调用前面。

一般情况下,把函数声明放在 .h头文件,把代码实现放在 .c文件,这就不多说了。要看具体使用场景。另外如果你定义的函数,不想给外部文件使用,可以在函数前面加上static。

#9

Char 20: error: cannot initialize a variable of type 'ListNode *' with an rvalue of type 'int'

14 | ListNode * mody(-1), *cur = mody;

原因:

  1. 果你不需要这个对象的地址,而只是想要复制它,你可以修改初始化语句为:

ListNode* node = new ListNode(someFunction());

这将创建一个新的ListNode实例,并用someFunction()返回的临时对象来初始化它。记得在不需要这个新创建的实例时,要手动释放内存,防止内存泄露。

#10

ERROR! Defconfig fragment did not apply as expected 
在config文件中,需要补全信息,最后需要多空出一行,否则会出现编译报错。

欢迎关注我的小站:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaosanxian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值