解决makefile中“未定义的引用”错误

时间:2011-06-02 11:59:15

标签: reference undefined arduino static-linking avr-gcc

我的src目录中有一些自定义源文件,我src/base目录中的Arduino项目有一些源文件。

我使用以下make规则将所有源文件编译成存储在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 $@)
    $(GCC) $(ALL_CORE_CFLAGS) -c $< -o $@

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

正如您所见,它会将src/tacho.c汇编为obj/bot_tacho.osrc/base/wiring_analog.c汇编为obj/core_wiring_analog.o

在我的makefile中,我编译所有源文件没有任何问题。在其中一个文件(即src/tacho.c)中,我添加了以下内容: #include "base/wiring.h"包含analogRead的原型。

有趣的是wiring.h只包含'analogRead'函数的原型。它甚至都不想包含实际定义函数的文件,但是一些注意事项使我发现函数的定义可以在src/base/wiring_analog.c中找到。

我认为编译声明该函数的文件并将其与所有其他必要的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个对象进行了调查,我注意到core_wiring_analog.o提到了analogRead。如果我认为它的工作方式是正确的core.a,其中包含core_wiring_analog.o应该包含analogRead的定义。 我回去编译使用函数src/tacho.c的{​​{1}},并且每次我尝试编译都很好(预处理器没有看到需要抱怨我的包含)。我认为这是导致问题的联系。

我在线阅读了很多内容,但我似乎还是无法自己解决这个问题。可能是一个愚蠢的错误,但我只是看不到它。我该如何解决这个问题?

为了完整起见,我放弃了整个项目:googlecode repository for my project

2 个答案:

答案 0 :(得分: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

花了很多时间,似乎浪费了很多时间,但却吸取了宝贵的教训,所以我觉得这值得我花时间。

细节,细节,细节......

答案 1 :(得分:-1)

我写了这个Makefile,你可能会发现它有用:

http://code.google.com/p/asadchev/source/browse/trunk/work/arduino/Makefile

基本上创建dir结构,如:

sketch/sketch.pde
sketch/Makefile

并尝试make / make upload / etc