vid*_*ina 2 reference arduino undefined avr-gcc static-linking
我的目录中有一些自定义源文件,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 $@
Run Code Online (Sandbox Code Playgroud)
正如你可以看到它会编译src/tacho.c到obj/bot_tacho.o和src/base/wiring_analog.c到obj/core_wiring_analog.o.
在我的makefile中,我编译所有源文件没有任何问题.在其中一个文件(即src/tacho.c)中我添加了以下include:
#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
Run Code Online (Sandbox Code Playgroud)
毋庸置疑,我首先确保此规则的先决条件是有序的.
这没有问题; 但问题是,尝试生成我的二进制文件会给我留下"未定义的引用"错误.
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
Run Code Online (Sandbox Code Playgroud)
我做了core_%.o对象的objdump ,我注意到core_wiring_analog.o提到了analogRead.如果我认为它的工作方式是正确的core.a,那么包含core_wiring_analog.o应该包含的定义analogRead.我回去编译src/tacho.c使用该函数,analogRead并且每次我尝试编译都很好(预处理器没有看到需要抱怨我的include).我认为这是导致问题的联系.
我在线阅读了很多东西,但我似乎仍然无法自己解决这个问题.可能是一个愚蠢的错误,但我只是看不到它.我怎么解决这个问题?
为了完整起见,我已将我的整个项目放在这里:我的项目的googlecode存储库
我花了将近一整天来弄清楚我错过了链接器参数-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
Run Code Online (Sandbox Code Playgroud)
花了很多时间,似乎浪费了很多时间,但却吸取了宝贵的教训,所以我觉得这值得我花时间.
细节,细节,细节......
| 归档时间: |
|
| 查看次数: |
11767 次 |
| 最近记录: |