在Arduino IDE中,是否可以使用另一个库来包含一个库?

18

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

在我编写的库的.cpp文件顶部,我尝试了以下内容:

#include <ReferencedLibrary.h>

#include "ReferencedLibrary.h"

两种方法都没有奏效。我可以在我的~/Documents/Arduino目录下的示例中成功地使用#include <ReferencedLibrary.h>。我是漏掉了什么还是这是Arduino IDE / makefile的限制?有解决办法吗?

5个回答

12

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

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

换句话说,你的 include 语句应该写成:

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

1
在链接器阶段我遇到了“未定义的引用”错误。看起来头文件已经被包含,但源文件没有被编译或链接进去。 - Justin808
1
一样的问题...Arduino 1.0.5...如此简单的功能-没有解决方案。 - flyandi
@Justin808 你也可以以同样的方式#include .cpp文件,这对我起作用了。 - Robin Hartland
对于Arduino IDE 1.7,上述技巧不起作用。请使用以下代码:#include "../../libraries/LibraryName/LibraryName.h" - P.W.

11

这里的文档 https://github.com/arduino/Arduino/wiki/Build-Process 指出:

包含路径包括sketch的目录,目标目录(/hardware/core//),AVR的包含目录(/hardware/tools/avr/avr/include/)和任何库目录(在/hardware/libraries/中)。 如果main sketch文件中包含了一个头文件,该头文件由其他文件引用,则会将该文件的libraries目录添加到其他库的include路径中。

这意味着如果从主要的sketch文件中 #include "ReferencedLibrary.h",这会导致该文件的libraries目录被添加到其他库的包含路径中。这有点像一个hack,但在我的Mac上确实可以工作。


1
这可能看起来像是一个 hack,但它符合整个处理范式。基本上,草图是您用来将所有工作部件融合在一起的东西,因此在草图中提供所有粘合逻辑非常合适。 - SRM
16
这是“不好的”。图书馆的理念是抽象功能并提供简洁的API供使用。只需在加载路径中加入#include“lib.h”即可获得库。要求库的客户端了解库的内部工作原理是完全错误的。 - Nathan Lilienthal
有一些讨论认为用户必须在主要的草图中包含所有引用的库。然而,即使这样做,似乎也会产生多个定义错误,因为宏或数组在依赖库头文件中被定义,并且在依赖源文件中排除头文件会导致找不到相同的符号。满足库依赖关系的唯一方法是将所有头文件和源文件包含在同一个目录中(否则需要运行所有包含语句并更改路径为相对路径,这是一个巨大的痛苦,尤其是在包装第三方库时几乎不可移植)。 - Joey Carson
3
这是正确答案。它不是黑客行为,它避免了新用户需要知道库的位置,并避免了需要项目文件和其他更高级选项的复杂性。这也是Arduino如此简单易用的原因之一。Visual Studio和Atmel Studio插件也是以同样的方式运作。保持了所有内容的兼容性。 - Visual Micro

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

库与库之间的依赖关系:当您的草图导入一个库,并且该库使用另一个库时,IDE将自动发现,无需您在草图中添加无用的#include。

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

4
使用Arduino环境,据我所知,你无法从自己的库中访问另一个自己的库。没有添加路径的方法,因此编译器根本找不到代码。这使得编写使用另一个库中的代码的库变得困难。我的网络研究表明,这个问题已经存在多年,但据我所知还没有解决。我怀疑在实现细节方面存在困难,或者可能是为了保持系统简单而牺牲功能。
当然,您可以始终将代码剪切并粘贴到每个新库中,但这非常次优。您还可以编写一个包含所有代码的大型库,放在一对.h和.cpp文件中。这也不太令人满意,但我偶尔会这样做。
然而,有一种解决方法,可以在您将其放置在sketchbook/libraries目录中的自己的库中使用标准Arduino库。由于草稿包括标准库位置的路径,并链接标准库代码,因此您可以在草稿中包含感兴趣的标准库的头文件。在那之下,在您的草稿中也包含自己的库头文件。标准库将成为您的库以及您的草稿可用的。

1
不推荐的方法:可以通过修改boards.txt文件向Arduino IDE构建中添加基本上任何外部库代码。c / cpp标头在标志中,库在ld标志中。这对于使用外部工具(如cmake / QT creator)进行库开发可能很有用(今天是我)。 我通过将“/ coderoot”添加到gcc包含路径和E_OS_arduino定义来修改了/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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接