我的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.c
到obj/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.o
由analogRead
提。如果我認爲它的工作方式是正確的core.a
其中包含core_wiring_analog.o
因此應該包含analogRead
的定義。 我回去編譯src/tacho.c
,它使用函數analogRead
,並且每次嘗試都編譯好(預處理程序沒有看到需要抱怨我的include)。我想這是造成問題的鏈接。
我已經在線閱讀了很多東西,但我仍然無法自己弄清楚這一個。可能是一個愚蠢的錯誤,但我不能看到它。我怎麼解決這個問題?
爲了完整起見,我在這裏落下我的整個項目:googlecode repository for my project
這當您沒有Makefiles的「模板」時常見錯誤。我建議你去尋找其他的Makefiles,併爲你創建一個,你可以在其中設置所有你需要的東西,然後單獨解決其餘的問題。 – webbi 2011-11-02 20:18:09