2011-06-02 139 views
2

我的src目錄中有幾個自定義源文件,我的src/base目錄中有來自Arduino項目的一些源文件。在生成文件中解決「undefined reference to」錯誤

我編譯所有的源文件爲對象,其使用下列訂立規則保存在我的obj目錄:

PATHOBJ := obj/ 
PATHSRC := src/ 
PATHBIN := bin/ 
PATHLIB := lib/ 
PATHTMP := tmp/ 
PATHARDUINO = $(PATHSRC)base/ 
enter code here 
$(PATHOBJ)core_%.o : $(PATHARDUINO)%.c 
    @mkdir -p $(dir [email protected]) 
    $(GCC) $(ALL_CORE_CFLAGS) -c $< -o [email protected] 

$(PATHOBJ)bot_%.o : $(PATHSRC)%.c 
    @mkdir -p $(dir [email protected]) 
    $(GCC) $(CFLAGS)-c $< -o [email protected] 

正如你可以看到它會編譯src/tacho.cobj/bot_tacho.o和​​到obj/core_wiring_analog.o

在我的makefile中,我編譯了所有源文件,沒有任何問題。在其中一個文件中(即src/tacho.c),我添加了以下內容: #include "base/wiring.h"其中包含原型爲analogRead

有趣的是wiring.h只包含'analogRead'函數的原型。它甚至不費力地包含實際定義該功能的文件,但是一些嘮叨導致我發現該函數的定義可以在​​中找到。

我認爲這足以編譯聲明該函數的文件,並將其與所有其他必需的Arduino目標文件一起鏈接到單個庫中。我任意選擇它的名字lib/core.a。我通過執行下面的步驟進行lib/core.a

avr-ar rcs lib/core.a obj/core_wiring.o \ 
    obj/core_wiring_analog.o \ 
    obj/core_wiring_digital.o \ 
    obj/core_wiring_pulse.o \ 
    obj/core_wiring_shift.o 

不用說,我首先確信,對於本作的規則的前提條件是爲了。

這工作沒有問題;但是,問題是試圖生成我的二進制文件留下了一個「未定義的參考」錯誤。

avr-g++ lib/core.a \ 
    obj/bot_life.o \ 
    obj/bot_port.o \ 
    obj/bot_serial.o \ 
    obj/bot_time.o \ 
    obj/bot_tacho.o \ 
    obj/bot_main.o \ 
    -o bin/bot.elf 
/home/david/src/botPMA/src/tacho.c:13: undefined reference to `analogRead' 
/home/david/src/botPMA/src/tacho.c:14: undefined reference to `analogRead' 
make[1]: *** [bin/bot.elf] Error 1 
make[1]: Leaving directory `/home/david/src/botPMA' 
make: *** [all] Error 2 

我做了core_%.o對象的objdump的,而且我也注意到,core_wiring_analog.oanalogRead提。如果我認爲它的工作方式是正確的core.a其中包含core_wiring_analog.o因此應該包含analogRead的定義。 我回去編譯src/tacho.c,它使用函數analogRead,並且每次嘗試都編譯好(預處理程序沒有看到需要抱怨我的include)。我想這是造成問題的鏈接。

我已經在線閱讀了很多東西,但我仍然無法自己弄清楚這一個。可能是一個愚蠢的錯誤,但我不能看到它。我怎麼解決這個問題?

爲了完整起見,我在這裏落下我的整個項目:googlecode repository for my project

回答

5

我已經花費近我整天弄清楚,我錯過了連接參數-L. TARGET。在我的情況,我的最終連接路由結束了看起來像:

avr-g++ lib/core.a \ 
    obj/bot_life.o \ 
    obj/bot_port.o \ 
    obj/bot_serial.o \ 
    obj/bot_time.o \ 
    obj/bot_tacho.o \ 
    obj/bot_main.o \ 
    -o bin/bot.elf \ 
    -L. lib/core.a 

很多時間花費的,看似浪費了不少時間,但一個寶貴的教訓,所以我想它成爲值得我。

細節,細節,細節...

+0

這當您沒有Makefiles的「模板」時常見錯誤。我建議你去尋找其他的Makefiles,併爲你創建一個,你可以在其中設置所有你需要的東西,然後單獨解決其餘的問題。 – webbi 2011-11-02 20:18:09