是否可以使用Arduino IDE从其他库中包含库?

时间:2011-06-28 09:16:03

标签: c++ ide include arduino

我正在尝试编写一个Arduino库(实际上是一个C ++类),它本身引用了我在Mac的〜/ Documents / Arduino / libraries目录中安装的另一个库。

在我正在写的图书馆的.cpp顶部,我试过了

#include <ReferencedLibrary.h>

#include "ReferencedLibrary.h"

......两者都不起作用。我可以在〜/ Documents / Arduino目录中的草图中成功#include <ReferencedLibrary.h>。我错过了什么或者这是Arduino IDE / makefile的限制吗?有解决方法吗?

5 个答案:

答案 0 :(得分:11)

此处的文档http://www.arduino.cc/en/Hacking/BuildProcess声明:

  

包含路径包括草图   目录,目标目录   (/ hardware / core //)和   avr包含目录   (/硬件/工具/ AVR / AVR /包含/),   以及任何库目录(在   / hardware / libraries /)哪个   包含一个头文件   包含在主草图文件中。

这意味着如果您从主草图文件中#include "ReferencedLibrary.h",则会导致该文件的libraries目录被添加到要包含的其他库的包含路径中。有点黑客,但它确实可以在我的Mac上运行。

答案 1 :(得分:11)

我已经能够通过使用相对路径在另一个Arduino库中包含一个库。例如,要将AbstractSwitch库包含到DigitalSwitch库中,假设这两个库都位于Arduino标准库文件夹中的各自单独的文件夹中,则可以使用以下include语句:

#include "../AbstractSwitch/AbstractSwitch.h"

换句话说,您的include语句应为:

#include "../LibraryFolder/LibraryHeaderFile.h"

答案 2 :(得分:6)

此问题已在Arduino 1.6.6版本中得到解决。 1.6.6的发行说明提到库到库的依赖关系已得到修复。

  

库到库依赖项:当草图导入库,并且该库使用另一个库时,IDE将在不必向草图添加无用的#include的情况下找到它

将您的版本更新为1.6.6或更高版本将解决您的问题。

答案 3 :(得分:3)

根据我的理解,使用Arduino环境,您无法从自己的另一个库访问自己的库。无法添加路径,因此编译器无法找到代码。这使得编写在您的另一个库中使用代码的库变得很困难。我的网络研究表明这已成为问题多年,但据我所知还没有解决。我怀疑在实现细节方面存在困难,或者希望以牺牲功能为代价来保持系统简单。

当然,您始终可以将代码剪切并粘贴到每个新库中,但这非常不理想。您还可以在一对.h和.cpp文件中编写一个包含所有代码的大型库。这也不是很令人满意,但我偶尔也会这样做。

但是,在您自己的库中使用标准Arduino库时,有一种方法可以放在sketchbook / libraries目录中。由于草图包含标准库位置的路径,并链接标准库代码,因此您可以在草图中包含感兴趣的标准库的头文件。在下面,也在您的草图中,包括您自己的库头文件。然后,标准库将可用于您的库以及草图。

答案 4 :(得分:1)

不推荐使用的方法:可以通过切boards.txt文件将基本上任何外部库代码添加到Arduino IDE构建中。 c / cpp标志中的标头和ld标志中的库。这对于使用外部工具(今天对我来说是cmake / QT创建者)的图书馆开发人员可能有用。

我通过在gcc包含路径和E_OS_arduino定义中添加“ / coderoot”,修改了/home/pekka/arduino-1.8.5/hardware/teensy/avr/boards.txt,修改行如下:

teensy36.build.flags.cpp = -fno-exceptions -felide-constructors -std = gnu ++ 14 -Wno-error = narrowing -fno-rtti -I / coderoot -DE_OS_arduino

teensy36.build.flags.c = -I / coderoot -DE_OS_arduino