【问题标题】:Keeping all libraries in the Arduino sketch directory将所有库保存在 Arduino 草图目录中
【发布时间】:2011-01-16 14:09:49
【问题描述】:

我知道您应该将任何外部库放在 arduino 安装目录的“库”文件夹下,但我有一个项目使用我为项目创建的几个库,主要是为了保留所有代码自己包含在主 pde 文件之外。但是,我尝试将库与主 PDE 文件放在同一目录中,以便我可以更轻松地在 subversion 中保持所有内容同步(我在多台计算机上工作)并且我不想继续分别备份和同步库。此外,只是为了能够轻松压缩草图文件夹并知道它包含所需的一切。

我已经尝试将头文件作为新选项卡添加到草图中,但这似乎根本不起作用......甚至不在乎它们是否应该在 arduino IDE 中。

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

#include "mylib/mylib.h"

#include <mylib/mylib.h>

但这两者都会导致文件未找到错误。

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

【问题讨论】:

标签: c++ c header arduino


【解决方案1】:

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

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

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

最后在你的草图中引用:

#include "src/yourLib/yourLib.h"  

否则在我的情况下 - 如果我缺少“src”文件夹 - 我会收到错误消息,它无法找到 yourLib.cpp 文件。

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

参考资料: https://forum.arduino.cc/index.php?topic=445230.0

【讨论】:

  • 适用于 1.8.7。
  • 有没有人让这种模式与相互包含的库一起工作?我将ESPAsyncWiFiManager 用于ESP32,它依赖于另一个库ESPAsyncWebServer。它不会找到它,我不想更改第三方代码文件。
  • 对于需要包含其他库的库,只需在#include 中使用相对路径,例如“../ESPAsyncWebServer/ESPAsyncWebServer.h”或类似的。但这需要您修改第一个库中的路径。
【解决方案2】:

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

【讨论】:

  • 如果您将它们放在同一个文件夹中,您可以像 #include "libName.h" 一样包含它们。但它接缝你必须重新加载 IDE 才能编译代码。
  • @LeandroTupone 听起来有问题,但显然做到了。
【解决方案3】:

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

为了解决这个问题,我使用make 将我的.h.cpp 源中的单个.h 文件放在一起 - 你可以在this Makefile 中看到这个使用:

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、@987654331 的任何内容@ 或 .h - 所以这是唯一的方法。

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

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

【讨论】:

    【解决方案4】:

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

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

    这是一个示例生成文件:

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

    【讨论】:

      【解决方案5】:

      我也遇到了同样的问题(我也喜欢保持代码独立),所以我只是记下一些笔记;说我有一个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 溢出问题: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(在这种情况下,速写本文件的组织可能会有所松动)..

      【讨论】:

        【解决方案6】:

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

        您有一个名为 MYPROJ_FOLDER 的项目文件夹,并且您想要包含一个 Libraries 文件夹,其中包含您的自定义库的更多子文件夹。

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

        -MyProjFolder
        -MyProjFolder/MyProjFolder        
        

        然后创建一个文件夹名称为 .ino 扩展名的文件 -MyProjFolder/MyProjFolder/MyProjFolder.ino

        2- 创建库文件夹: -MyProjFolder/libraries

        3- 然后创建自己的库 -MyProjFolder/libraries/lib1 -MyProjFolder/libraries/lib1/lib1.cpp -MyProjFolder/libraries/lib1/examples example1

        根据需要重复第 3 步

        也检查http://arduino.cc/en/Guide/Libraries

        【讨论】:

          【解决方案7】:

          对我有用的是在草图目录下创建一个目录,例如“src”,并在该目录下为每个个人图书馆创建一个目录。

          例子:

          我有一个名为 ObstacleRobot 的项目,在该文件夹下是我的草图,名为障碍机器人(由 IDE 自动创建),还有我的草图“obstacleRobot.ino”

          到目前为止,我们有:

           /ObstacleRobot
              /obstaclerobot
                 obstacleRobot.ino
          

          然后我想包含一个与该项目完全相关的个人库,并且将其包含在 IDE 库中没有任何意义,事实上我想为机器人的每个部分都这样做,但我仍在工作就可以了。

          最终对我有用的是:

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

          那么你在主草图中要做的就是编写包含如下:

          #include "src/Sonar/Sonar.h"
          

          仅此而已。

          【讨论】:

            【解决方案8】:

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

            视觉上这是目录布局

            ~/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
            

            【讨论】:

              【解决方案9】:

              按照 Hefny 的思路,将您的项目作为库的示例。

              例如(Unix 环境),假设库在 ~arduino/libraries 中

              你创建你的项目 ~arduino/libraries/MyProject,你的库去那里(例如 ~/arduino/libraries/MyProject/module1.h ~/arduino/libraries/MyProject/module1.cpp ~/arduino/libraries/MyProject /module2.h ~/arduino/libraries/MyProject/module2.cpp

              现在: mkdir -p ~arduino/libraries/MyProject/examples/myproj

              编辑~arduino/libraries/MyProject/examples/myproj/myproj.ino (注意这里不是examples/myproj.ino,而是examples/myproj/myproj.ino)

              重新启动 IDE,您应该在菜单 File/Example/MyProject 中找到您的项目。

              另请注意,您使用#include 进行包含

              【讨论】:

                【解决方案10】:

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

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

                这样的东西对我有用:

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

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

                希望这对某人有所帮助。这包括我未来的自己,我打赌在不久的将来会读到这篇文章……像往常一样!

                J

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-07-28
                  • 2013-10-09
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多