0

如果代码在多个文件中,我在为 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在该目录中运行,该代码也可以正常编译,但如果它们位于包含包含的单独文件中,则不能。

4

1 回答 1

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 前缀告诉链接器不要进行新的实例化,而是链接到其他地方的外部实例。

于 2013-02-14T20:41:38.807 回答