Cargando bibliotecas locales

14

Soy nuevo en el desarrollo de Arduino / C (proveniente de un entorno JavaScript / Ruby), pero me preguntaba si era posible incluir una biblioteca de una carpeta personalizada dentro de un boceto.

Entonces esta es mi situación;

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

Ahora mi pregunta es: ¿cómo puedo incluir mi biblioteca personalizada? He intentado varias variaciones en esto;

# project.ino

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

Pero ninguno de ellos funciona. ¿Alguien puede decirme si esto es posible? He examinado esta pregunta en la web, pero no puedo encontrar ninguna respuesta satisfactoria. Espero que ustedes puedan ayudar.

Salud.

ACTUALIZAR

Soy consciente de que puede colocar sus bibliotecas en su carpeta de bibliotecas globales, pero las quiero en mi carpeta de proyecto local. Quiero compartirlos a través de git con mi equipo.

Stefan
fuente
3
Por favor lea mi pregunta nuevamente @Tyson. Soy consciente de la solución global de bibliotecas, pero las quiero dentro de mi proyecto.
Stefan
Primero debe decirle al IDE dónde encontrar la biblioteca (ver enlace anterior) y luego, dentro de su boceto, llama a la biblioteca. `#include <LibraryName.h>` AFAIK no puede combinar los dos en uno solo includeespecificando la ruta / a / library / que es lo que supongo que está preguntando.
Tyson
Está bien, así que no puedo incluir archivos de subcarpetas ... Es una pena ...
Stefan
2
Estás tropezando con el hecho de que las herramientas de Arduino son fundamentalmente incompatibles con las prácticas de software reales, maduras o profesionales. Probablemente también se quejarán incesantemente de ese directorio .git, aunque en realidad no interrumpirá la compilación.
Chris Stratton el

Respuestas:

7

Bien, así es como funciona, y lo revisé para asegurarme.

Claro que puedes usar rutas difíciles, pero cada programador odia usar rutas difíciles. No son portátiles en absoluto y bloquean su programa en su lugar. Utiliza enlaces suaves o duros a los archivos en el proyecto (busque las páginas de manual en "ln"). Pero, ... hablamos de feo! ¿Entonces la pregunta es cómo hacerlo "correctamente"? La clave es aprender con qué parámetros y en qué ruta se ejecuta el compilador C / C ++.

Encontrará que la conclusión NO es intuitiva en absoluto. Corte al grano: los caminos relativos no funcionan correctamente. ¿Ahora por qué?

Pero primero, permítanme explicar por qué alguien querría colocar archivos de programa fuera del directorio del proyecto. A los programadores les gusta escribir clases de programas, estructuras, métodos, funciones, macros, etc., una vez. Tan pronto como el programador solidifique el fragmento del programa, él / ella quiere poner los archivos en un árbol común y seguir adelante. Todos los programas posteriores podrían usar esa biblioteca privada. Además, al tener los archivos en un lugar central, no tendrá múltiples copias y versiones de cada uno. Una biblioteca privada para muchos programas privados.

A partir del 1.6.13 (Teensy aún no es compatible con 1.8. *), El relativo incluye el inicio desde la biblioteca , no desde su directorio. Parece que el filtro de ano a C (recuerde que Arduino hace una "conversión" al objetivo y luego llama al compilador C / C ++) comienza donde instaló su árbol Arduino. En mi caso, lo instalé en "~ / bin / arduino". La casa de Teensy es "./hardware/teensy". La ruta de inicio completa para las bibliotecas es "~ / bin / arduino / hardware / teensy / avr / bibliotecas", donde encontrará todos los árboles de programas de soporte.

En un archivo fuente, la instrucción '#include "test.hpp"' selecciona correctamente el archivo de su directorio actual. SIN EMBARGO, si usa '#include "../test.hpp", la ruta de inclusión no comienza en el directorio de su proyecto. En cambio, comienza en "./bibliotecas". Entonces la ruta resultante es:

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

En conclusión, no hay una forma limpia de hacer su propio árbol de herramientas en un directorio cercano. El único curso es comprometer su trabajo en la biblioteca Arduino y estar al tanto de esas reglas también.

Sean Walton
fuente
2

Acabo de volver a usar el arduino después de un tiempo y estoy un tanto desconcertado por problemas similares y confundido por información diferente de diferentes sitios y para diferentes versiones del ide.

Lo que he encontrado es que si tiene un boceto en un directorio, apague el Ide, puede soltar archivos .h, .cpp ... en el directorio y el ide, cuando se reinicie, los abrirá con el boceto.

Inclúyalos usando comillas simples en los nombres de archivo, sin ruta, sin corchetes angulares.

Estoy seguro de que esto es solo una parte de la respuesta completa, pero me ha ayudado a comenzar.

russ_hensel
fuente
2

Hasta donde yo sé, puede incluir sus bibliotecas desde una ubicación personalizada utilizando su ruta absoluta.

Dado que las rutas absolutas pueden ser aburridas desde el punto de vista de la portabilidad del código, puede definir algunas macros para obtener la ruta absoluta de un pariente determinado. De esta manera, solo tendría que arreglar la ruta de 'raíz del proyecto' al pasar de un dispositivo a otro.

Defina la carpeta raíz de su proyecto:

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

Defina una macro 'transformación' relativa a absoluta:

    #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)

Incluya sus archivos usando la ruta relativa:

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

Espero que te sea útil.

Lorenzo Addazi
fuente
2

El complemento Arduino para Visual Studio admite bibliotecas locales. Puede encontrar el complemento aquí.

Micro visual
fuente
2

Recientemente probé esta estructura de biblioteca local. Funciona con:

#include "libs/MyNewLib/MyNewLib.h"

El preprocesamiento de compilación Arduino IDE 1.6.7 incluso recogerá el código fuente de la biblioteca.

¡Salud!

Mikael Patel
fuente
1
Debe ser nuevo en 1.6.7
James Newton
Parece que, de hecho, las versiones más nuevas son más flexibles y puede incluir bibliotecas en rutas relativas. Sin embargo, todavía tuve problemas cuando los archivos incluidos también incluyen otros archivos relativos a su ubicación.
Sebastian
Hmm, los problemas de inclusión que acabo de escribir no están relacionados con las rutas. Parece que el IDE de Arduino no maneja bien los archivos * .ipp. Ver este hilo del foro de arduino
Sebastian
No funciona para mí en 1.8.1 en Windows.
Violet Giraffe
1

La forma más sencilla que he encontrado para hacer esto es almacenar las bibliotecas en su directorio de croquis local y crear un enlace simbólico en el directorio [INICIO] / Arduino / bibliotecas. Luego puede registrarlos en Git fácilmente con su boceto / proyecto y Arduino todavía está contento porque las bibliotecas están accesibles en la carpeta global.

Tal vez incluso cree un script de instalación que cree estos enlaces automáticamente y verifique eso en Git también.

Matt Ball
fuente
0

Otra solución realmente mala: cree un archivo llamado libraries.cpp, que contenga:

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

Por supuesto, esto solo funciona si la biblioteca no contiene ningún incluye ...

Eric
fuente