ide - library - lcd atmel studio
¿Cómo agregar archivos.c y.h a Atmel Studio 6? (2)
Sé que hay muchas preguntas sobre este tema, y he examinado un buen número de ellas. Sin embargo, todavía estoy teniendo problemas.
Comencé a escribir un programa de prueba para un PCB prototipo, y ahora que ha crecido a casi 1000 líneas, estoy tratando de dividirlo en bibliotecas que puedo usar para funciones particulares.
Pensé que esto sería muy simple. Haga archivos .c y .h para cada biblioteca que necesito. Es decir, tendría OLED.h y OLED.c para las funciones que controlan una pantalla OLED. Copie las funciones / definiciones apropiadas en cada archivo. Luego copie estos archivos en la solución en Atmel Studio. Los puse en la carpeta src debajo del nombre del proyecto.
Sin embargo, esto no funciona! Obtuve una lista extremadamente larga de errores. Todas las cosas que se definen en el archivo .h aparentemente no están definidas en lo que respecta al compilador. También recibo muchos mensajes de error del tipo "nombre de tipo desconocido int16_t / uint16_t / uint8_t / etc ..." Esa parte me resulta realmente desconcertante. ¿Por qué debería importar que las funciones estén en una biblioteca externa, ahora el compilador no entiende qué significan esos tipos de datos?
Entonces, este es probablemente un problema estúpido de tener. No quiero que Atmel Studio controle mis bibliotecas envolviéndolas en algún "proyecto de biblioteca" o algo así, quiero ponerlas en una carpeta de mi elección y agregarlas cuando las necesite. He buscado respuestas a este problema y encuentro largos tutoriales sobre cómo cambiar la configuración del compilador para el proyecto, la configuración del enlazador, etc. Probé este tutorial y todavía no hay dados: http://www.engblaze.com/ tutorial-using-avr-studio-5-with-arduino-projects / # setup
Tampoco puedo encontrar una forma de agregar algo haciendo clic con el botón derecho en el proyecto y haciendo clic en "Agregar". Quiere que encuentre .a archivos. El cuadro de diálogo "Agregar biblioteca" en Atmel Studio es horrible, parece.
¡Seguramente no puede ser tan complicado simplemente agregar una biblioteca a un proyecto existente y hacer que funcione normalmente! He usado PIC en el pasado y, al llegar a Atmel, he encontrado documentación horrible y una extraña interfaz super-slick super-slick whizz bang que no se puede dejar solo y ofusca una función simple. ¿Qué puedo hacer para agregar estas bibliotecas?
ACTUALIZACIÓN: Parecía responder mi propia pregunta. Resulta que necesitaba incluir todas las bibliotecas para reconocer tipos de datos y otras cosas en el archivo .c. De alguna manera asumí que esto solo tenía que hacerse en el archivo principal, pero obviamente estaba equivocado. Agregar asf.h parece funcionar bien ya que incluye todas las definiciones / nombres de puertos específicos de MCU y todo eso. Todo bien por ahora!
Agregar archivos de biblioteca a una solución debe ser simple. Vaya al Explorador de soluciones, haga clic derecho en su solución y vaya a "Agregar-> Artículo existente". Si desea agregar una biblioteca preexistente y guardarla en una carpeta separada de su solución, haga clic en la flecha al lado de "Agregar" y elija "Agregar como enlace". Eso ahorra muchos dolores de cabeza debido a tener una copia duplicada de su biblioteca en la carpeta de la solución, y los archivos no se mantienen actualizados.
Tiene razón al decir que necesita incluir los archivos de encabezado necesarios en los archivos .c
donde se usan.
El compilador compila cada archivo C por separado, y luego los vincula al final, por lo que obtuvo el error unknown typename int_*
porque el compilador no había visto el encabezado relevante en el contexto de la compilación de ese archivo C.
También parece confundirse en cuanto a la diferencia entre definición y declaración.
Una función es:
- Declarado en el archivo de encabezado. Esto significa que hay un prototipo de función, por ejemplo,
int some_func(char some_var);
que le dice al compilador que la función existe, pero no le dice qué es . Esto es necesario porque el compilador solo mira un archivo C a la vez, por lo que debe informarse que existen otras funciones. - Definido en el archivo C. Este es el cuerpo de la función real, es decir,
int some_func(char some_var) { do_stuff(some_var); }
int some_func(char some_var) { do_stuff(some_var); }
. Después de la compilación de cada archivo C individual de forma aislada, se llama al enlazador para unir todas las piezas y darle su binario final, que se muestra en el dispositivo.
Una función puede (y debe) definirse solo una vez, pero puede declararse muchas veces, incluso en el mismo archivo, siempre que las declaraciones no sean contradictorias.