我正在尝试编写一个Arduino库(实际上是一个C ++类),它本身引用了我在Mac的〜/ Documents / Arduino / libraries目录中安装的另一个库。
在我正在写的图书馆的.cpp顶部,我试过了
#include <ReferencedLibrary.h>
和
#include "ReferencedLibrary.h"
......两者都不起作用。我可以在〜/ Documents / Arduino目录中的草图中成功#include <ReferencedLibrary.h>
。我错过了什么或者这是Arduino IDE / makefile的限制吗?有解决方法吗?
答案 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