对于 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"***" 问题之连接的更多相关文章

  1. 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 ...

  2. 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/ 下新建 ...

  3. 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: ...

  4. IAR ERROR --- [Li006]

    今天移植代码时遇到一个比较奇葩的问题,记录如下: Error[Li006]: duplicate definitions for "Uart3"; in "E:\IAR_ ...

  5. 痞子衡嵌入式:浅析IAR下调试信息输出机制之硬件UART外设

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR下调试信息输出机制之硬件UART外设. 在嵌入式世界里,输出打印信息是一种非常常用的辅助调试手段,借助打印信息,我们可以比较容易地 ...

  6. Error reporting for dbus

    D-Bus 1.13.14 目录 Detailed Description Function Documentation ◆ dbus_error_free() ◆ dbus_error_has_na ...

  7. 解决 Error: getaddrinfo EADDRINFO 错误

    安装npm失败,提示Error: getaddrinfo EADDRINFO,原因在于虚拟机未连接互联网,悲剧.

  8. python-socket.error[10054]:对象的复制

    1.socket.error[10054],对方强制关闭了连接 在用socket.recvfrom时,若事先没有bind时, 先使用socket.sendto,socket.recvfrom 有时会出 ...

  9. 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 ...

随机推荐

  1. js中常用属性备忘

    . onsubmit一般用来做验证的,用来控制表单提交的. 之前使用数据提交基本上使用ajax做数据提交,在数据验证的时候,只有通过数据验证之后,才会post/get数据到对应api文件,但是这次涉及 ...

  2. java中文件操作

    例一:从一个文件读入数据,然后写入另外一个文件 package lipika; import java.io.FileInputStream; import java.io.FileNotFoundE ...

  3. Starship Troopers

    Problem Description You, the leader of Starship Troopers, are sent to destroy a base of the bugs. Th ...

  4. Android OkHttp详解

    来源 http://frodoking.github.io/2015/03/12/android-okhttp/ 编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技 ...

  5. 贴心小技能——纯CSS实现的帮助提示

    1. 新技能传授---哒哒哒哒 我们经常会接到这样的小需求,鼠标放在某个位置实现一段小提示. 你还在用js实现这样一个小功能,你就太out了,来看看我们用纯CSS打造的帮助提示. 2. html &l ...

  6. windows下使用VirtualEnv

    在开发Python应用程序的时候,有时会开发多个应用程序,那这些应用程序都会共用一个Python.如果应用A需要jinja 2.7,而应用B需要jinja 2.6怎么办?这种情况下,每个应用可能需要各 ...

  7. KMP模版

    #include<iostream> #include<cstdio> #include<cstring> using namespace std; ]; void ...

  8. (转)9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路

    原文:http://www.cnblogs.com/figure9/archive/2013/01/09/2853649.html 1,简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也 ...

  9. C#基础性问题

    解决方案.项目.类之间的关系: 一个解决方案可以包含多个项目.一个项目可以包含多个类 解决方案:公司 项目:部门 类:员工 .sln:解决方案文件,里面包含着整个解决方案的信息,可以双击运行. .cs ...

  10. OSI七层模型:TCP/IP && HTTP && WebSocket && MQTT

    OSI七层模型分为 物理层:  建立.维护.断开物理连接 处理bit流 数据链路层,将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正 处理数据帧 Frame 网络层,进行逻辑地址 ...