将所有库保存在Arduino sketch目录中

时间:2011-01-16 14:09:50

标签: c++ c header arduino

我知道你应该在arduino安装目录的“libraries”文件夹下放置任何外部库,但我有一个项目,它使用我为项目创建的几个库,主要是为了保持所有代码自我包含和出主pde文件。但是,我试图将库放在与主PDE文件相同的目录中,以便我可以更容易地将所有内容保存在subversion中(我在多台计算机上处​​理这个)并且我不想继续返回并分别同步库。此外,只是为了能够轻松拉链草图文件夹,并知道它包含所需的一切。

我已尝试将标题文件添加到草图中作为新标签,但这似乎根本不起作用...甚至不关心它们是否应该在arduino IDE中。

我也尝试将库添加到子目录中的sketch目录(我更喜欢),然后链接到它们:

#include "mylib/mylib.h"

#include <mylib/mylib.h>

但是这两个都导致文件找不到错误。

这可能吗?如果是这样,我如何将它们包含在主文件中进行构建?最好是在他们自己的子目录中。

10 个答案:

答案 0 :(得分:11)

我有同样的问题。为Arduino IDE解决了这个问题&gt; 1.8。根据参考资料(参见下面的链接),似乎是较新的IDE(?)的专长。

你必须添加一个&#34; src&#34;创建库文件夹之前的子目录。所以基本上你的项目应该是这样的:

/SketchDir (with *.ino file)  
/SketchDir/src  
/SketchDir/src/yourLib (with .h and .cpp file)  

最后在你的草图中引用:

#include "src/yourLib/yourLib.h"  

否则就我而言 - 如果我错过了&#34; src&#34;文件夹 - 我收到错误消息,它找不到yourLib.cpp文件。

注意:我使用的是Windows系统,以防它不同,实际上是VS Code作为Arduino IDE的包装器。但是这两个IDE都用这种结构编译它。

参考文献: https://forum.arduino.cc/index.php?topic=445230.0

答案 1 :(得分:9)

对于我的草图,"*.h""*.cpp"库文件实际上与草图位于同一文件夹中,我称之为"someheader.h"。我还注意到,如果我进入sketch菜单并add file...,则在我关闭并重新打开草图之前文件不会出现。

答案 2 :(得分:8)

我同意你的意见;这是开发软件的一种无法容忍的方式:它需要您需要的每个文件都与主程序位于同一目录中!

为了解决这个问题,我使用make汇总了.h.h来源的单个.cpp文件 - 您可以在{{3 }}:

PREPROCESS=gcc -E -C -x c -iquote ./src
# -E : Stop after preprocessing.
# -C : Don't discard comments.
# -x c : Treat the file as C code.
# -iquote ./src : Use ./src for the non-system include path.

TARGETS=sketches/morse/morse.h

all: $(TARGETS)

clean:
    rm $(TARGETS)

%.h: %.h.in
    $(PREPROCESS) $< -o $@

Arduino对文件结尾非常挑剔 - 如果你在其目录中放置一个.cpp.cc文件,它会自动在源代码中使用它,你不能包含任何不是.cpp的文件。 1}},.cc.h - 所以这是唯一的方法。

我也使用类似的技巧将JavaScript文件放在一起this Makefile

这要求您在编辑文件后运行make,但由于我正在使用外部编辑器(Emacs),这对我来说是麻烦。

答案 3 :(得分:4)

不幸的是,Arduino IDE非常糟糕,并没有任何改进的迹象。没有真正的构建系统,因此它只允许您构建驻留在单个目录中的程序。

唯一真正的解决方案是编写一个makefile,然后就可以使用真正的IDE。我希望有一天会有人为QtCreator写一个Arduino插件。

这是一个示例makefile:

http://volker.top.geek.nz/arduino/Makefile-Arduino-v1.8

答案 4 :(得分:3)

我遇到了同样的问题(我也想保持代码自包含),所以我只记下一些笔记;说我MyPdeSketch.pde使用MyLibClass.cpp;然后我就像这样组织了

/path/to/skdir/MyPdeSketch/MyPdeSketch.pde
/path/to/skdir/MyPdeSketch/MyLibClass/MyLibClass.cpp
/path/to/skdir/MyPdeSketch/MyLibClass/MyLibClass.h

(原则上,/path/to/skdir/此处相当于~/sketchbook/

对我有用的是:

mkdir /path/to/arduino-0022/libraries/MyLibClass
ln -s /path/to/skdir/MyPdeSketch/MyLibClass/MyLibClass.* /path/to/arduino-0022/libraries/MyLibClass/

重新启动IDE后,MyLibClass应显示在“草图/导入库”下。

请注意,到目前为止,我可以看到库类文件引用其他库文件的唯一方法是相对地(从“当前位置”)包含它们,假设它们都在同一个主arduino-0022/libraries中文件夹(可能与Stack Overflow问题相关: Is it possible to include a library from another library using the Arduino IDE? )。

否则,还应该可以将MyLibClass目录直接符号链接到arduino-0022/libraries(而不是手动创建目录,然后对文件进行符号链接)。出于同样的原因,符号链接到备用位置~/sketchbook/libraries也可能存在问题。

最后,一个可能更好的组织可能是:

/path/to/skdir/MyLibClass/MyLibClass.cpp
/path/to/skdir/MyLibClass/MyLibClass.h
/path/to/skdir/MyLibClass/MyPdeSketch/MyPdeSketch.pde

...在符号链接到libraries之后,会强制MyPdeSketch显示在Arduino IDE中MyLibClass库的示例下(但是,如果你的话,它可能不适用想在一个目录下自包含多个类文件夹。)

编辑:或者只使用Makefile - 它可以直接使用avr-gcc,绕过Arduino IDE(在这种情况下,速写本文件组织可能会有所松动)..

答案 5 :(得分:1)

想想我知道你到底需要什么。

您有一个项目文件夹说 MYPROJ_FOLDER ,并且您希望包含一个 Libraries 文件夹,其中包含更多自定义库的子文件夹。

您需要执行以下操作: 1-创建文件夹,如下所示:

-MyProjFolder
-MyProjFolder/MyProjFolder        

然后使用.ino扩展名创建文件夹名称的文件     -MyProjFolder / MyProjFolder / MyProjFolder.ino

2-创建库文件夹:     -MyProjFolder / libraries&lt;&lt;&lt;&lt;&lt; name不是一个应该被调用的选项。

3-然后创建自己的库     -MyProjFolder /库/的 LIB1     -MyProjFolder /库/ LIB1 / lib1.cpp     -MyProjFolder / libraries / lib1 / 示例&lt;&lt;&lt;&lt;这是一个文件夹     -MyProjFolder / libraries / lib1 / examples / example1

根据需要重复第3步

还要检查http://arduino.cc/en/Guide/Libraries

答案 6 :(得分:0)

对我有用的是创建一个目录,例如&#34; src&#34;在草图目录下,并在每个个人图书馆的目录下。

示例:

我有一个名为ObstacleRobot的项目,在我的草图的文件夹下,名为obstaclerobot(由IDE自动创建),然后是我的草图&#34; obstacleRobot.ino&#34;

到目前为止,我们已经:

 /ObstacleRobot
    /obstaclerobot
       obstacleRobot.ino

然后我想要包含一个与这个项目完全相关的个人库,将它包含在IDE库中是没有意义的,事实上我想为机器人的每个部分做这个,但是我是仍在努力。

最终为我工作的是:

 /ObstacleRobot
    /obstaclerobot
       obstacleRobot.ino
       /src
          /Sonar
             Sonar.h
             Sonar.cpp

然后你在主草图中要做的就是按如下方式编写include:

#include "src/Sonar/Sonar.h"

就是这样。

答案 7 :(得分:0)

我的做法有点不同。这是我的设置。

视觉上这是目录布局

~/Arduino/Testy_app/  <- sketch dir
                   /Testy_app.ino <- has a #include "foo.h"
                   /foo           <- a git repo
                   /foo/foo.h
                   /foo/foo.cpp

这是我的构建方式:

~/Arduino/Testy_App/$ arduino-cli compile --library "/home/davis/Arduino/Testy_app/foo/" --fqbn arduino:samd:mkrwan1310  Testy_app

如果您希望更详细并指定 libs 和 src 目录,这也适用

~/Arduino/Testy_app/  <- sketch dir
                   /Testy_app.ino <- has a #include "foo.h"
                   /lib           <- a git repo
                   /lib/foo/src/foo.h
                   /lib/foo/src/foo.cpp

构建方法是:

~/Arduino/Testy_App/$ arduino-cli compile --library "/home/davis/Arduino/Testy_app/lib/foo/src" --fqbn arduino:samd:mkrwan1310  Testy_app

需要再做一点调整以将 lib 目录中的文件包含到主目录中。如果您需要这样做,这就是解决方法:

~/Arduino/Testy_app/  <- sketch dir
                   /Testy_app.ino <- has a #include 
"foo.h"
                   /inc/Testy_app.h
                   /foo           <- a git repo
                   /foo/foo.h
                   /foo/foo.cpp   < has a "include testy_app.h"

然后像这样编译

~/Arduino/Testy_App/$ arduino-cli compile \
--library "/home/davis/Arduino/Testy_app/inc" \ 
--library "/home/davis/Arduino/Testy_app/foo/src" \ 
--fqbn arduino:samd:mkrwan1310  Testy_app

答案 8 :(得分:-1)

Following the lines of Hefny, make your project an example for your library.

For example (Unix env), let's say the libraries are in ~arduino/libraries

Your create your project ~arduino/libraries/MyProject, your libraries go there (for example ~/arduino/libraries/MyProject/module1.h ~/arduino/libraries/MyProject/module1.cpp ~/arduino/libraries/MyProject/module2.h ~/arduino/libraries/MyProject/module2.cpp

Now: mkdir -p ~arduino/libraries/MyProject/examples/myproj

edit ~arduino/libraries/MyProject/examples/myproj/myproj.ino (note that this is not examples/myproj.ino but examples/myproj/myproj.ino)

Restart the IDE, you should find your project in the menu File/Example/MyProject.

Also note that you do the include with #include

答案 9 :(得分:-3)

为什么我们不用一个复制命令编写脚本,将我们的库从我们的库所在的位置复制到arduino IDE库文件夹中?

这样我们就可以保留我们想要的文件结构,并且可以毫不费力地使用IDE库。

这样的事情对我有用:

cp -r mylibs/* ~/Documents/programs/arduino-1.5.8/libraries/.

请注意,路径是相对于我自己的文件结构。

希望这有助于某人。这包括我未来的自我,我打赌将在不久的将来阅读...像往常一样!

Ĵ