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來包含我們可能會使用到的頭文件,當編譯完成,連接的時候,連接器會首先從我們提供的路徑中去搜索需要的頭文件,如果沒有找到就會去默認路徑下搜索頭文件;如果找到了,就中止該文件的搜索行為,忽略后面的路徑。

     其實可以把文件連接看作是填坑。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM