如果代码在多个文件中,我遇到了编译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
,代码也会编译好,但如果它们在包含的单独文件中则不会。
答案 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前缀告诉链接器不进行新的实例化,而是链接到其他地方的外部实例。