Se me ocurre que, más allá de mi problema actual, debería preguntar: "¿Qué debo saber al hacer una biblioteca para el Arduino?"
Primero, lo que estoy haciendo:
Estoy usando Eclipse como mi editor y escribiendo código en C ++. He escrito una aplicación Arduino simple que incluye mi archivo de encabezado y estoy trabajando a través de errores.
Primer problema: ¿cómo hago una 'construcción limpia'? Veo errores que creo que he solucionado, casi como si el archivo de encabezado estuviera en caché. (Sí, es muy probable que esté haciendo algo estúpido [ editar : estaba], pero todavía me gustaría saber cómo limpiar la biblioteca y no sé dónde están los archivos de objetos).
En segundo lugar: ¿qué convenciones debo tener en cuenta? No he usado el Arduino tanto como me gustaría, y se siente tan bien programar en C ++, pero sé que la intención de las bibliotecas es mantener las cosas agradables y simples para los usuarios. ¿Existen convenciones para los nombres de funciones? ¿Creando constantes (parece que el espacio de nombres global está contaminado con #defines)? Y así.
Por último, ¿hay algo más que deba saber?
Debo mencionar que he visto el Tutorial de la Biblioteca Arduino , que es bueno, pero no va muy lejos. También he echado un vistazo a algunas de las bibliotecas que están instaladas en mi sistema.
Respuestas:
Haré una puñalada. No he escrito código para Arduino, pero he hecho mucha programación en C y C ++. Sería útil si realmente viera sus errores, pero no obstante.
Lo principal que debe recordar siempre al usar C ++ con código C es que su código C ++ necesita funciones declaradas con "C" externo si desea que el código C pueda vincularse con el código C ++. La "C" externa "es lo que le dice al compilador de C ++ que estoy creando código enlazable para archivos C o estoy usando código de archivos C. Por lo tanto, todas sus funciones en el encabezado API de la biblioteca deben correlacionarse con una función en el archivo fuente definido como "extern" C "void dosomething ()". Si está intentando usar clases en C ++, recuerde que el código C no puede llamarlo, necesitará crear funciones (externo "C") para acceder al objeto. Ahora, si su código C está compilado con un compilador de C ++, entonces no se preocupe por la "C" externa.
Si desea llamar al código C dentro de su código C ++, debe ajustar el encabezado C con una construcción como esta:
Si trabaja en C ++, no use mucho un #defines a menos que esté creando indicadores de tiempo de compilación como "DEBUG" o "VERSION2" para crear conjuntos especiales de código. De lo contrario, use "const int / char / float" para definir el número para una verificación de tipo segura. Los compiladores suelen ser lo suficientemente inteligentes como para optimizarlos, por lo que terminan en ROM / espacio de código (aunque depende). Además, no cree MACROS, use funciones en línea. Además, no siempre siga la convención al programar si es estúpido, como el uso de muchas macros y la definición de números en C ++. Lo mismo se aplica a la versión C99 de C, ha agregado cosas como funciones en línea y concursos de C ++. La industria se da cuenta de cuánto código defectuoso y difícil de mantener proviene del uso excesivo del lenguaje del preprocesador.
Eclipse generalmente almacena los archivos obj en un directorio bajo su proyecto. Si está haciendo una compilación "Debug", se encuentra debajo de la carpeta "Debug" debajo de la carpeta de su proyecto. Si está haciendo una compilación "Release", busque en "Release", etc. Normalmente, una compilación limpia solo funciona para mí en Eclipse, por lo que no sé qué está mal con su configuración. Supongo que asegúrate de no estar creando encabezados precompilados.
fuente