加载本地库


14

我是Arduino / C开发的新手(来自JavaScript / Ruby环境),但我想知道是否可以在草图中包含来自自定义文件夹的库?

这就是我的情况;

project.ino
libs/
  MyNewLib/
    MyNewLib.h
    MyNewLib.ccp

现在我的问题是:如何包括我的自定义库?我对此进行了多种尝试;

# project.ino

#include <libs/MyNewLib/MyNewLib.h>
#include "libs/MyNewLib/MyNewLib.h"
#include <./libs/MyNewLib/MyNewLib.h>
#include "./libs/MyNewLib/MyNewLib.h"

但是它们都不起作用。谁能告诉我这是否可能?我已经在网上调查了这个问题,但找不到任何令人满意的答案。希望你们能有所帮助。

干杯。

更新

我知道您可以将您的库放在全局库文件夹中,但我希望将它们放在本地项目文件夹中。我想通过git与我的团队分享。


3
请再次阅读我的问题@Tyson。我知道全局库解决方案,但是我希望它们在我的项目中。
Stefan

您必须先告诉IDE在哪里可以找到该库(请参见前面的链接),然后在您的草图中调用该库。`#include <LibraryName.h>`AFAIK,您不能将两者合并为一个include指定路径/​​到/库/,这正是我想您要的。
泰森

好吧,所以我不能包含子文件夹中的文件。。太可惜
Stefan


2
您对Arduino工具与实际的,成熟的或专业的软件实践根本不兼容这一事实感到困惑。他们可能还会不停地抱怨那个.git目录,尽管它实际上不会破坏构建。
克里斯·斯特拉顿

Answers:


7

好的,这是它的工作方式,我检查了一下以确保。

当然可以使用硬路径,但是每个程序员都讨厌使用硬路径。它们根本不是可移植的,并且将您的程序锁定在适当的位置。您可以使用软链接或硬链接链接到项目中的文件(在“ ln”上查找手册页)。但是,...谈论丑陋!那么问题是如何“正确”地做到这一点?关键是要了解C / C ++编译器将使用哪些参数以及在哪种路径下运行。

您会发现结论根本不直观。追逐追逐:相对路径无法正常工作。现在,为什么呢?

但首先,让我解释一下为什么任何人都想将程序文件放在项目目录之外。程序员喜欢一次编写程序类,结构,方法,函数,宏等。一旦程序员巩固了程序片段,他/她便希望将文件放在公共树中并继续前进。此后的每个程序都可以使用该私有库。而且,通过将文件放在一个中央位置,您将不会有多个副本和版本。一个私有库,用于处理许多私有程序。

从1.6.13开始(Teensy尚不支持1.8。*),相对包括从开始,而不是从目录开始。似乎ano-to-C过滤器(请记住Arduino对目标进行了“转换”,然后调用C / C ++编译器)从安装Arduino树的位置开始。就我而言,我安装在“〜/ bin / arduino”中。Teensy的家位于“ ./hardware/teensy”。库的完整主目录是“〜/ bin / arduino / hardware / teensy / avr / libraries”,您将在其中找到所有支持程序树。

在源文件中,'#include“ test.hpp”'语句正确地从当前目录中选择文件。但是,如果你用“#包括‘../test.hpp’,”包含路径也不会在你的项目目录开始。而是从“ ./libraries”开始!因此,结果路径为:

#include "../test.hpp" ==> ./arduino/hardware/teensy/avr/libraries/test.hpp

总之,没有干净的方法可以在附近的目录中创建自己的工具树。唯一的过程是将您的工作提交到Arduino库中,并且也要了解这些规则。


2

经过一段时间后,我回到了使用arduino的位置,对类似的问题感到困惑,并且对来自不同站点和不同版本ide的不同信息感到困惑。

我发现,如果您在目录中有一个草图,然后关闭Ide,则可以将.h,.cpp ...文件拖放到该目录中,并且ide在重新启动后将使用草图打开它们。

通过在文件名上使用简单的引号包括它们,没有路径,没有尖括号。

我相信这只是完整答案的一部分,但这已经使我开始。


2

据我所知,您可以使用绝对路径从自定义位置包含库。

由于从代码可移植性的角度来看,绝对路径可能很无聊,因此您可以定义一些宏,以从给定的相对路径获取绝对路径。这样,从设备传递到另一个设备时,您只需要修复“项目根目录”路径即可。

定义项目的根文件夹:

    #define PROJECT_ROOT C:\path\to\your\project\folder

定义一个相对于绝对的宏“转换”:

    #define TO_STRING(s) #s
    #define ABSOLUTE_PATH(root, relative_path) TO_STRING(root\relative_path)
    #define RELATIVE_PATH(library) ABSOLUTE_PATH(PROJECT_ROOT, library)

使用相对路径包括文件:

    #include RELATIVE_PATH(some\file\relative\path.h)
    #include RELATIVE_PATH(another\file\relative\path.h)

我希望它会有用。



2

我最近测试了此本地库结构。它适用于:

#include "libs/MyNewLib/MyNewLib.h"

Arduino IDE 1.6.7构建预处理甚至会提取该库的源代码。

干杯!


1
必须是1.6.7的新功能
James Newton

似乎确实较新的版本更灵活,您可以在相对路径中包含库。但是,当包含的文件还包含相对于其位置的其他文件时,我仍然遇到问题。
塞巴斯蒂安

嗯,我刚才写的包含问题与路径无关。看来Arduino IDE无法很好地处理* .ipp文件。看到这个arduino论坛话题
Sebastian

在Windows 1.8.1中对我不起作用。
紫罗兰色长颈鹿

1

我发现最简单的方法是将库存储在本地草图目录​​中,并在[HOME] / Arduino / libraries目录中创建符号链接。然后,您可以在草图/项目中轻松将它们检入Git,而Arduino仍然很高兴,因为可以在全局文件夹中访问这些库。

甚至可能创建一个安装脚本,该脚本会自动创建这些链接,并将其也签入Git。


0

另一个非常糟糕的解决方案-创建一个名为的文件libraries.cpp,其中包含:

// force the linker to build the libraries
#include "libraries/LIB1/src/FILE1.cpp"
#include "libraries/LIB1/src/FILE2.cpp"
#include "libraries/LIB2/src/FILE1.cpp"

当然,这仅在库本身不包含任何包含项的情况下才有效...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.