我的目录中有一些自定义源文件,我的src
目录中有一些来自 Arduino 项目的源文件src/base
。
obj
我使用以下 make 规则将所有源文件编译为存储在我的目录中的对象:
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.o
和src/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
不用说,我首先确保此 make 规则的先决条件是有序的。
这没有问题。但是,问题是尝试生成我的二进制文件会给我留下“未定义的引用”错误。
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
我做了一个对象的 objdump core_%.o
,我确实注意到core_wiring_analog.o
提到了analogRead
. 如果我认为它的工作方式是正确core.a
的,那么 containscore_wiring_analog.o
应该包含analogRead
. 我回去编译src/tacho.c
它使用该函数analogRead
并且每次我尝试编译都很好(预处理器没有看到需要抱怨我的包含)。我想这是导致问题的链接。
我已经在网上阅读了很多东西,但我似乎仍然无法自己弄清楚这一点。可能是一个愚蠢的错误,但我只是看不到它。我怎么解决这个问题?
为了完整起见,我把我的整个项目放在这里:googlecode repository for my project