reference - 解决 makefile 中的 "undefined reference to"错误

标签 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.cobj/core_wiring_analog.o

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

有趣的是,wiring.h 仅包含“analogRead”函数的原型(prototype)。它甚至不费心去包含实际定义该函数的文件,但经过一番摸索,我发现该函数的定义可以在 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 规则的先决条件符合要求。

没有问题;然而,问题是尝试生成我的二进制文件给我带来了“ undefined reference ”错误。

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_wiring_analog.ocore.a 应该包含 analogRead 的定义。 我回去编译 src/tacho.c ,它使用了 analogRead 函数,并且每次我尝试时都编译得很好(预处理器认为没有必要提示我的包括)。我想是链接引起了问题。

我在网上读了很多东西,但我自己似乎仍然无法弄清楚这一点。可能是一个愚蠢的错误,但我就是看不到。我该如何解决这个问题?

为了完整起见,我将整个项目放在这里:googlecode repository for my project

最佳答案

我几乎花了一整天的时间才发现我错过了链接器参数-L。目标。就我而言,我的最终链接例程最终看起来像这样:

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

花费了很多时间,看似浪费了很多时间,但学到了宝贵的教训,所以我想这值得我花时间。

细节,细节,细节...

关于reference - 解决 makefile 中的 "undefined reference to"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6214211/

相关文章:

将日期指针与日期进行比较

.net - 如何为解决方案中的所有项目引用一次程序集

c - 对数组变量的引用是什么类型?

c++ - undefined reference 复制ctor和ctor

c++ - 未定义对静态变量 Foo::a 的引用?

javascript - 如果我们设置未定义的值会发生什么?

c++ - 当类成员是引用时,无法生成默认赋值运算符?(在 C++ 中)

c++ - 声明对指针指向值的引用的开销

linux - 上传/Arduino 出现错误 : permission denied on Ubuntu 16. 04

python - 在 python 中计算 thd