是否可以使用Arduino IDE包含来自另一个库的库

Is it possible to include a library from another library using the Arduino IDE?

本文关键字:另一个 包含 可以使 Arduino IDE 是否      更新时间:2023-10-16

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

在我正在编写的库的.cpp顶部,我尝试了

#include <ReferencedLibrary.h>

#include "ReferencedLibrary.h"

两者都不起作用。我可以成功地从我的~/Documents/Arduino目录中的草图中#include <ReferencedLibrary.h>。我是遗漏了什么,还是这是Arduino IDE/makefile的限制?有变通办法吗?

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

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

换句话说,您的包含声明应该是:

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

此处的文档https://github.com/arduino/Arduino/wiki/Build-Process状态:

包含路径包括草图的directory,目标目录(/硬件/核心//)和avr include目录(硬件/工具/avr/avr/include/),以及任何库目录(在/硬件/库/)包含一个头文件包含在主草图文件中。

这意味着,如果从主草图文件中#include "ReferencedLibrary.h",则会将该文件的libraries目录添加到要包含的其他库的包含路径中。有点破解,但它确实适用于我的Mac。

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

库到库的依赖关系:当草图导入一个库,而该库使用另一个库时,IDE会发现,而无需在草图中添加无用的#include

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

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

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

然而,在你自己的库中使用标准的Arduino库是有问题的,你可以把它放在你的sketchbook/libraries目录中。由于草图包含到标准库位置的路径,并链接标准库代码,因此可以在草图中包含感兴趣的标准库的头文件。在其下方,也在草图中,包括您自己的库头文件。然后,标准库将可用于库和草图。

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

我修改了/home/pekka/arduino1.8.5/hardware/teensy/avr/boards.txt,在gcc include path和E_OS_arduino define中添加了"/coderoot",修改了以下行:

teensy36.build.flags.cpp=-fno异常-flide构造函数-std=gnu++14-Wno错误=缩小-fno rtti-I/coderoot-DE_OS_arduino

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