我知道你应该在arduino安装目录的“libraries”文件夹下放置任何外部库,但我有一个项目,它使用我为项目创建的几个库,主要是为了保持所有代码自我包含和出主pde文件。但是,我试图将库放在与主PDE文件相同的目录中,以便我可以更容易地将所有内容保存在subversion中(我在多台计算机上处理这个)并且我不想继续返回并分别同步库。此外,只是为了能够轻松拉链草图文件夹,并知道它包含所需的一切。
我已尝试将标题文件添加到草图中作为新标签,但这似乎根本不起作用...甚至不关心它们是否应该在arduino IDE中。
我也尝试将库添加到子目录中的sketch目录(我更喜欢),然后链接到它们:
#include "mylib/mylib.h"
和
#include <mylib/mylib.h>
但是这两个都导致文件找不到错误。
这可能吗?如果是这样,我如何将它们包含在主文件中进行构建?最好是在他们自己的子目录中。
答案 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都用这种结构编译它。
答案 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:
答案 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步
答案 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/.
请注意,路径是相对于我自己的文件结构。
希望这有助于某人。这包括我未来的自我,我打赌将在不久的将来阅读...像往常一样!
Ĵ