【IAR】Error[Li005] no definition for "__program_start"

本文解决了一个IARforARM工程从低版本升级到高版本后遇到的编译错误问题。通过将函数名从void __program_start(void)修改为void __iar_program_start(void),成功解决了编译错误。
这段时间我编译IAR for ARM工程的时候出现了上述标题出现的错误信息,截图如下:

【IAR】Error[Li005] no definition for __program_start - Small.Box - 小盒子的小盒

出现上面错误的原因 是因为之前的工程是在较低版本下进行编译的,在高版本编译的时候,需要做一些修改,如下所示:
【IAR】Error[Li005] no definition for __program_start - Small.Box - 小盒子的小盒

原来的是:
void __program_start(void);
修改成:
void __iar_program_start(void);
 
这样编译就没有问题了。
<think>我们正在处理一个关于IAR编译器的错误报告:未定义'iar_builtin_no_operation'。根据错误信息,这可能是由于编译器内置函数未被正确识别或链接引起的。我们需要分析可能的原因并提供解决方案。首先,回顾用户提供的引用内容: 引用[1]提到了一个与`__nounwind`声明不兼容的错误,涉及`__iar_builtin_STREXB`函数。这暗示了内置函数在IAR编译器中的使用可能需要注意特定的声明或编译器设置。 引用[2]则提到了GCC和Intel编译器中的`__builtin_types_compatible_p`以及`__must_be_array`,这虽然与IAR不直接相关,但说明不同编译器有不同的内置函数处理方式。 针对'IAR_builtin_no_operation'未定义的错误,我们可以考虑以下步骤: 1. **检查编译器版本和文档**:IAR编译器通常提供一系列内置函数(intrinsics),这些函数通常以`__iar_builtin_`为前缀。`__iar_builtin_no_operation`可能是一个特定的内置函数,用于插入NOP(空操作)指令。用户应首先确认所使用的IAR版本是否支持该内置函数,并查阅对应版本的编译器参考手册。2.**检查头文件包含**:某些内置函数可能需要包含特定的头文件。例如,在IAR中,对于ARM内核,可能需要包含`intrinsics.h`。用户可以尝试包含该头文件:```c#include<intrinsics.h>```3.**检查编译器选项**:确保编译器选项正确,特别是与目标架构和优化级别相关的选项。有时候,某些内置函数只在特定的优化级别下可用,或者需要启用特定的指令集扩展。 4. **替代方案**:如果确定编译器版本不支持`__iar_builtin_no_operation`,可以尝试使用等效的内置函数或内联汇编。例如,对于NOP操作,在ARM架构中可以使用`__NOP()`(在IAR中,通常定义在`intrinsics.h`中)。或者,直接使用内联汇编:```casm("nop");```5. **检查拼写和大小写**:确保函数名拼写正确。IAR内置函数通常使用小写字母,并且前缀为`__iar_builtin_`。例如,正确的可能是`__iar_builtin_no_operation`(注意是两个下划线开头)?但根据错误信息,用户写的是'IAR_builtin_no_operation'(注意这里是大写IAR,且只有一个下划线?)。实际上,IAR的内置函数通常以两个下划线开头,并且是`__iar_builtin_`(小写)。所以,正确的函数名可能是`__iar_builtin_no_operation`。用户需要确认是否写错了函数名(比如大小写或下划线数目)。6.**更新编译器**:如果当前使用的IAR版本较旧,可能该内置函数是在新版本中加入的。考虑更新到最新版本。7.**联系IAR支持**:如果以上方法都无效,建议联系IAR的技术支持。根据用户提供的错误信息,我们注意到错误信息中写的是“IAR_builtin_no_operation”,而IAR通常的内置函数命名风格是`__iar_builtin_`(两个下划线,小写)。因此,很可能是用户使用了错误的函数名。正确的函数名可能是`__iar_builtin_no_operation`。另外,在IAR中,插入NOP指令的标准内置函数是`__no_operation()`(在`intrinsics.h`中定义)。所以,用户也可以尝试使用:```c#include<intrinsics.h>__no_operation(); ```总结解决方案:-确认函数名正确:尝试使用`__iar_builtin_no_operation`或`__no_operation`。 -包含头文件`intrinsics.h`。 -如果仍然不行,检查编译器版本并更新。如果用户的问题仍未解决,请提供更多上下文信息,例如目标平台(ARM?)和IAR版本。</think>### IAR编译器错误:未定义 `iar_builtin_no_operation` 的解决方案 这个错误通常发生在使用IAR编译器时调用了未定义的内置函数。以下是逐步分析和解决方案: #### 1. **确认函数名称正确性** - IAR内置函数均以`__iar_builtin_`开头(双下划线),检查是否拼写错误: ```c // 正确写法(注意双下划线) __iar_builtin_no_operation(); ``` - 错误提示中的`IAR_builtin_no_operation`(单下划线+大写)不符合规范[^1]。 #### 2. **包含必需的头文件** - 添加IAR内置函数专用头文件: ```c #include <intrinsics.h> // IAR内置函数声明 ``` - 该头文件定义了`__iar_builtin_no_operation()`等核心函数[^1]。 #### 3. **检查编译器兼容性** - 该函数仅适用于特定架构: - **ARM Cortex-M/M0+**:直接支持 - **RISC-V/其他架构**:需替换为等效指令 - 验证项目设置的`Target core`是否匹配(IAR IDE中:Project > Options > General Options) #### 4. **替代方案** - **方案1:直接使用NOP指令** ```c asm("nop"); // ARM架构通用汇编指令 ``` - **方案2:使用标准库宏** ```c #include <cmsis_compiler.h> __NOP(); // CMSIS标准接口 ``` #### 5. **编译器设置验证** 在IAR IDE中检查: ```plaintext Project > Options > C/C++ Compiler > Language [√] Enable IAR extensions // 必须勾选 ``` 未启用扩展会导致内置函数无法识别[^1]。 #### 6. **版本兼容性处理** - **IAR 9.x+**:函数已标准化,无需特殊处理 - **IAR 8.x或更早**: ```c #if __VER__ < 9000000 #define __iar_builtin_no_operation() asm("nop") #endif ``` > **根本原因分析**:此错误通常由三方面导致: > 1. 函数名拼写错误(大小写/下划线错误) > 2. 缺少`<intrinsics.h>`头文件 > 3. 编译器扩展未启用或架构不兼容[^1][^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值