IAR:Error [Li005]:no definition for"***" 问题之连接
对于 IAR 出现的 Error[Li005] 链接错误,网上已经给出了比较详尽的解决方法,而对于这次记录,主要是记录解决问题的思路。
网上给出的方法:http://blog.csdn.net/yueniaoshi/article/details/7844653
问题的本质都是一样的,这在问题给出的描述中已经说的很清楚了,是某个函数或者变量没有定义。
新来的同事在将一个工程从keil移植到iar时,出现了上述的连接错误,第一次遇到这样的文体,我也很纳闷,因为根据提示 是有两个库函数没有定义,可是定位到相应的库函数,发现都有定义和实现,对应的头文件也都包含了。在网上搜索到了类似的问题,按照网上找到的方法无法解决。想到是工程移植,会不会是文件路径不对?于是就尝试着去更改头文件的路径,当我删掉第一个头文件的路径后,工程竟然编译连接成功了;当我恢复这个路径,工程又出现刚才的连接错误;如果把这个路径放在最后面,工程竟也能编译连接成功。
问题解决了,知其然当知其所以然,进入到删掉的头文件路径(工程路径)下,里面只有一个头文件 lpc17xx_libcfg.h,而这个头文件在另一个路径(drivers\include)中也存在,include路径下的头文件才是正版的,但这个正版的在工程中并没有被应用。下面进入到本次博文的正题:
1.lpc17xx_libcfg.h 与上述连接错误的关系
追根溯源,iar给出的错误是:Error[Li005]:no define for "GPIO_SetDir",意思就是说GPIO_SetDir()这个函数没有定义,而根据搜索的信息显示GPIO_SetDir()这个函数是在lpc17xx_gpio.c中定义和实现的,在lpc17xx_gpio.h申明,这两个文件都在编译文件中,但是问题是lpc17xx_gpio.c被编译需要一个条件 #ifdef _GPIO,而这个条件需要在lpc17xx_libcfg.h中给出,工程路径下的lpc17xx_libcfg.h是原始的头文件外围功能相关的宏都是被注释了,所以lpc17xx_gpio.c并没有被编译。如果要正常使用外围功能,应该是这样的一个流程:lpc17xx_libcfg.h 放开需要的外围功能宏注释(如_GPIO),相关外围功能库文件(.c文件)编译条件成立被成功编译(如lpc17xx_gpio.c)
2.工程路径下的lpc17xx_libcfg.h 在前和在后的区别
在前面我们说过,当这个路径在前面时,连接是不成功的,但是放在最后面连接是可以通过的。这就关系到连接器在遇到同名的头文件是的处理方式,一般在我们的程序中都使用了#include来包含我们可能会使用到的头文件,当编译完成,连接的时候,连接器会首先从我们提供的路径中去搜索需要的头文件,如果没有找到就会去默认路径下搜索头文件;如果找到了,就中止该文件的搜索行为,忽略后面的路径。
其实可以把文件连接看作是填坑。
IAR:Error [Li005]:no definition for"***" 问题之连接的更多相关文章
- kinaba 安装踩坑: FATAL Error: [elasticsearch.url]: definition for this key is missing
操作系统:Linux kibana 版本: 7.4.0 1. 在/etc/yum.repos.d/ 下新建 kibana.repo 配置 yum 源地址 内容如下: [root@localhost ...
- kinaba 安装踩坑: FATAL Error: [elasticsearch.url]: definition for this key is missing 转
安装 https://www.jianshu.com/p/875457cb8da6 操作系统:Linux kibana 版本: 7.4.0 1. 在/etc/yum.repos.d/ 下新建 ...
- spring+ibatis问题1—— 程序报错:java.sql.SQLException: Io 异常: Connection reset by peer, socket write error; ”或“java.sql.SQLException 关闭的连接”异常
转自:http://blog.sina.com.cn/s/blog_1549fb0710102whz2.html spring+ibatis程序测试时报错:java.sql.SQLException: ...
- IAR ERROR --- [Li006]
今天移植代码时遇到一个比较奇葩的问题,记录如下: Error[Li006]: duplicate definitions for "Uart3"; in "E:\IAR_ ...
- 痞子衡嵌入式:浅析IAR下调试信息输出机制之硬件UART外设
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR下调试信息输出机制之硬件UART外设. 在嵌入式世界里,输出打印信息是一种非常常用的辅助调试手段,借助打印信息,我们可以比较容易地 ...
- Error reporting for dbus
D-Bus 1.13.14 目录 Detailed Description Function Documentation ◆ dbus_error_free() ◆ dbus_error_has_na ...
- 解决 Error: getaddrinfo EADDRINFO 错误
安装npm失败,提示Error: getaddrinfo EADDRINFO,原因在于虚拟机未连接互联网,悲剧.
- python-socket.error[10054]:对象的复制
1.socket.error[10054],对方强制关闭了连接 在用socket.recvfrom时,若事先没有bind时, 先使用socket.sendto,socket.recvfrom 有时会出 ...
- IAR 1.3 for STM8 ST-Link无法调试 无法仿真 the debugging session could not be started
IAR 1.3 for STM8 ST-Link无法调试 the debugging session could not be started CPU型号是:STM8F103F3 首先要用ST Vis ...
随机推荐
- oracle 直接客户端使用
到oracle网站下载直接客户端,http://www.oracle.com/technology/software/tech/oci/instantclient/htdocs/winsoft.htm ...
- 小白日记9:kali渗透测试之主动信息收集(二)四层发现:TCP、UDP、nmap、hping、scapy
四层发现 四层发现的目的是扫描出可能存活的IP地址,四层发现虽然涉及端口扫描,但是并不对端口的状态进行精确判断,其本质是利用四层协议的一些通信来识别主机ip是否存在. 四层发现的优点: 1.可路由且结 ...
- HTTP 缓存策略
浏览器一般缓存图片.CSS.JS等静态文件,因为这些文件的更新频率相对来说比较低,合理利用浏览器的缓存对网站的性能提升有很大帮助.HTTP缓存分为两部分,分别是本地缓存和缓存协商,当本地缓存不生效时会 ...
- python邮件发送接收
接收邮件 import poplib,pdb,email,re,time from email import header POP_ADDR = r'pop.126.com' USER = '' PA ...
- linux命令行操作快捷键
在shell命令终端中,Ctrl+n相当于方向向下的方向键,Ctrl+p相当于方向向上的方向键. 在命令终端中通过它们或者方向键可以实现对历史命令的快速查找.这也是快速输入命令的技巧. 在命令终端中可 ...
- [改善Java代码]覆写equals方法必须覆写hashCode方法
覆写equals方法必须覆写hashCode方法,这条规则基本上每个Javaer都知道,这也是JDK API上反复说明的,不过为什么要这样做呢?这两个方法之间有什么关系呢?本建议就来解释该问题,我们先 ...
- ps扩大、缩小选区
用"套索工具""魔棒工具"或者等工具将选区选出来,创建出一个需要处理的选区. 点击ps菜单栏中的"选择",在下拉菜单中选择"修 ...
- ubuntu共享文件夹给virtualbox
在ubuntu或者linuxmint等linux系统下安装了virtualbox,可以通过共享文件夹的方式,把文件夹共享给virtualbox下的虚拟机系统,我这里的虚拟机系统是win7,共享过程如下 ...
- jqueryeasyui中文乱码问题
下载的Demo中charset=utf-8,手动改成gb3212,问题解决.
- AIDL进程间调用与Binder的简单介绍
Binder是安卓中特有的一种进程间通信(IPC)方式,从Unix发展而来的手段,通信双方必须处理线程同步.内存管理等复杂问题,传统的Socket.匿名通道(Pipe).匿名管道(FIFO).信号量( ...