如何解决“'__vector_32'的多重定义”错误?
Posted
技术标签:
【中文标题】如何解决“\'__vector_32\'的多重定义”错误?【英文标题】:How to solve "multiple definition of `__vector_32'" error?如何解决“'__vector_32'的多重定义”错误? 【发布时间】:2017-06-06 16:34:59 【问题描述】:我正在从事一个涉及红外信号处理和控制伺服系统的 Arduino Mega 2560 项目。但是下面这个简单的草图会产生一个错误,说某个字段被多次定义。
涉及的库:Servo 和 IRremote。
重现错误的代码:
#include <Servo.h>
#include <IRremote.h>
void setup()
void loop()
错误描述:
libraries\IRremote\IRremote.cpp.o (symbol from plugin): In function `MATCH(int, int)':
(.text+0x0): multiple definition of `__vector_32'
libraries\Servo\avr\Servo.cpp.o (symbol from plugin):(.text+0x0): first defined here
c:/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.9.2/../../../../avr/bin/ld.exe: Disabling relaxation: it will not work with multiple definitions
collect2.exe: error: ld returned 1 exit status
exit status 1
Error compiling for board Arduino/Genuino Mega or Mega 2560.
我该如何解决这个问题?
更新/解决方案:
伺服库在ServoTimers.h
中有如下定义:
typedef enum _timer5, _timer1, _timer3, _timer4, _Nbr_16timers timer16_Sequence_t;
基本上,前 12 个舵机由 timer 5
控制。如果您需要更多舵机,还可咨询timer 1
以获取舵机 13-24 等。Arduino Mega 2560 上的标准舵机库最多可以控制 48 个舵机(每个定时器 12 个)。
IRremote 库使用定时器 2 来接收 IR 信号。这与Servo库基本不冲突。但是我已经将 IRremoteInt.h 更改为使用 timer 3
而不是 timer 2
,因为我还使用了中断驱动的超声波传感器(在 timer 2
上)。这就是我遇到上述问题的原因。
由于我的项目使用的伺服系统不超过 12 个,我只是禁用了伺服库中的计时器 1、3、4,从而产生以下行(cp. 到上面的原始行):
typedef enum _timer5, _Nbr_16timers timer16_Sequence_t;
这会导致更多错误,因为枚举不再完整...如果您想这样做,只需注释掉尝试编译草图时弹出的错误代码行。然后重新编译,一切都会好起来的。
现在一切正常,超声波传感器、伺服系统和红外接收。谢谢。
【问题讨论】:
【参考方案1】:Servo.h 和 IRremote.h 都在尝试使用 Timer1。他们不能都拥有它,因此会出现错误。您可以尝试使用 ServoTimer2 库来运行关闭计时器 2 的伺服系统,但请确保您阅读了它的文档,因为它与 Servo 的工作方式不同。
【讨论】:
感谢您的回答。帮助我解决了问题。 IIRC,IRremote 库在 Mega 2560 上默认使用计时器 2。伺服库在前 12 个伺服器中使用计时器 5。 为我的初始问题添加了一些解释和解决方案。感谢您的帮助! 对不起,我错过了这是 2560。我为 328P 写了答案。以上是关于如何解决“'__vector_32'的多重定义”错误?的主要内容,如果未能解决你的问题,请参考以下文章