无法为Arduino编译多个文件

时间:2013-02-14 18:00:01

标签: c makefile arduino avrdude

如果代码在多个文件中,我遇到了编译Arduino代码的问题。我过去一直在做的是有一个脚本连接另一个目录中的文件和make那里的项目。我希望能够直接从我的构建文件夹编译,而不必跳过确保所有内容都以正确的顺序定义的箍等。

我正在使用avrdude从Linux命令行编译,因为Arduino IDE与我的窗口管理器不能很好地协同工作。当我使用多个文件(使用适当的#include语句时,我会得到以下性质的错误,但是对于我的所有方法和变量。

./../lib/motor.ino:3:21: error: redefinition of ‘const long unsigned int MOVE_DELAY’
./../lib/motor.ino:3:21: error: ‘const long unsigned int MOVE_DELAY’ previously defined here

使用MOVE_DELAY的唯一其他位置是void loop()函数内部,并且它不会在那里重新定义它。如果将代码连接到一个文件并在该目录中运行make,代码也会编译好,但如果它们在包含的单独文件中则不会。

1 个答案:

答案 0 :(得分:2)

我相信你的问题可以通过声明具有“extern”前缀或外部的对象来解决。例如。我经常使用SdFat库,它包含在我的主草图和其他库中的实例中。

/**
 * \file test.ino
 */
#include <SdFat.h>
#include <foo.h>
SdFat sd;
...

我在其他库中也使用相同的对象,例如foo.h.

/**
 * \file foo.h
 */
#include <SdFat.h>
extern SdFat sd;
...

如果它不是“extern”的前缀,它会像你的错误一样,因为“sd”不能存在两次。 extern前缀告诉链接器不进行新的实例化,而是链接到其他地方的外部实例。