2011-06-28 4 views
15

Estoy tratando de escribir una biblioteca Arduino (efectivamente una clase C++) que a su vez hace referencia a otra biblioteca que he instalado en el directorio ~/Documents/Arduino/libraries de mi Mac.¿Es posible incluir una biblioteca de otra biblioteca usando el IDE de Arduino?

En la parte superior de la .cpp de la biblioteca que estoy escribiendo, he intentado

#include <ReferencedLibrary.h> 

y

#include "ReferencedLibrary.h" 

... ninguno de los cuales trabajo. Puedo con éxito #include <ReferencedLibrary.h> de bocetos en mi directorio ~/Documents/Arduino. ¿Me estoy perdiendo algo o es esto una limitación del Arduino IDE/makefile? ¿Hay alguna solución?

Respuesta

6

Este problema se resolvió en la versión 1.6.6 de Arduino. Las notas de la versión de 1.6.6 mencionan que las bibliotecas a las dependencias de la biblioteca se han corregido.

Biblioteca a dependencias de bibliotecas: cuando el boceto importa una biblioteca, y que la biblioteca utiliza otro, el IDE se enterará sin tener que añadir un #include inútil para su boceto

La actualización de su versión a 1.6.6 o posterior resolverá su problema.

10

La documentación aquí http://www.arduino.cc/en/Hacking/BuildProcess estados:

La ruta de inclusión incluye el directorio del boceto , el directorio de destino (/ hardware/núcleo //) y el AVR include (/ Accesorios/Herramientas/avr/avr/include /), , así como cualquier directorio de biblioteca (en /hardware/libraries /) que contiene un archivo de encabezado que es incluido en el archivo de boceto principal.

Esto significa que si #include "ReferencedLibrary.h" de su archivo principal boceto, esto hace que el directorio de ese archivo libraries que se añaden a la ruta de inclusión de otras bibliotecas para incluir. Un poco de hack pero funciona en mi Mac.

+1

Puede parecer un truco, pero va en línea con todo el paradigma de procesamiento. Básicamente, un boceto es algo que se utiliza para fusionar todas las piezas de trabajo, por lo que es muy apropiado proporcionar toda la lógica de pegamento en el boceto. – SRM

+14

Esto es "malo". La idea de una biblioteca es resumir la funcionalidad y proporcionar una API concisa para su uso. '#include" lib.h "' debería ser todo lo que se necesita para obtener la biblioteca (suponiendo que esté en la ruta de carga). Exigir al cliente de la biblioteca que conozca el funcionamiento interno de la biblioteca es simplemente erróneo. –

+0

Existe una discusión que dice que el usuario debe incluir todas las bibliotecas a las que se hace referencia en el boceto principal. Sin embargo, incluso hacer esto parece producir múltiples errores de definición para macros o matrices que se definen en el encabezado de biblioteca dependiente y excluir el encabezado en los resultados del archivo fuente dependiente al no poder encontrar esos mismos símbolos. La única forma de satisfacer las dependencias de la biblioteca es incluir todos los encabezados y fuentes en el mismo directorio (o ejecutar todas las declaraciones include y cambiar la ruta a relativa, una gran molestia cuando envuelve una lib de terceros y apenas portátil). –

3

Utilizando el entorno Arduino, según tengo entendido, no puede acceder a su propia biblioteca desde otra de sus propias bibliotecas. No hay forma de agregar rutas, por lo que simplemente no hay forma de que el compilador encuentre el código. Eso hace que sea difícil escribir bibliotecas que usan código en otra de sus bibliotecas. Mi investigación web indica que esto ha sido un problema durante años, pero que, a mi entender, no se ha resuelto. Sospecho que hay dificultades en los detalles de la implementación o quizás un deseo de mantener el sistema simple a expensas de la capacidad.

Por supuesto, siempre se puede cortar y pegar el código en cada biblioteca nueva, pero eso es excesivamente subóptimo. También puede escribir una gran biblioteca con todo su código en un par de archivos .h y .cpp. Eso tampoco es muy satisfactorio, pero lo he hecho de vez en cuando.

Sin embargo, existe un problema para usar bibliotecas Arduino estándar en su propia biblioteca que está colocando en el directorio de su cuaderno de bocetos/bibliotecas. Como los bocetos incluyen rutas a las ubicaciones de biblioteca estándar y vinculan el código de biblioteca estándar, puede incluir el archivo de encabezado para la biblioteca estándar de interés en su boceto. Debajo de eso, también en su boceto, incluya su propio archivo de encabezado de biblioteca. La biblioteca estándar estará disponible para su biblioteca y para su boceto.

+0

Ver la respuesta de @ julioterra, funcionó para mí. – vadipp

11

He podido incluir una biblioteca en otra biblioteca Arduino usando una ruta relativa.Por ejemplo, para incluir la biblioteca AbstractSwitch en la biblioteca DigitalSwitch, suponiendo que ambas bibliotecas viven en sus propias carpetas separadas dentro de la carpeta de la biblioteca estándar de Arduino, puede utilizar la siguiente sentencia de inclusión:

#include "../AbstractSwitch/AbstractSwitch.h" 

En otras palabras, su estado de cuenta incluirá debe decir:

#include "../LibraryFolder/LibraryHeaderFile.h" 
+1

Obtengo errores 'referencia indefinida' durante la fase del enlazador. Parece que el encabezado está incluido pero los archivos fuente no están compilados o vinculados. – Justin808

+1

Lo mismo aquí ... Arduino 1.0.5 .. una característica tan simple - no hay solución. – flyandi

+0

@ Justin808 también puede #incluir archivos .cpp de la misma manera, lo que funcionó para mí. –

Cuestiones relacionadas