如何解决“'__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'的多重定义”错误?的主要内容,如果未能解决你的问题,请参考以下文章

android的getResources()报错如何解决?

安装python模块时报错如何解决

Composer要求的PHP版本报错如何解决?

Loadrunner之https协议录制回放报错如何解决?

如何解决在Win10上配置Office365时报错80090034?

robot framework ride 在添加Resource时报错,应如何解决