El manual del usuario de AVR-Libc tiene un capítulo completo sobre cómo construir una biblioteca . Yo sugeriría comenzar allí. Si usa un IDE como eclipse, habrá configuraciones de proyecto aplicables si desea compilar como una biblioteca en lugar de un ejecutable.
Editar
Esto es lo que hace eclipse cuando lo configuro para su ejemplo:
Para que no pueda compilarse de forma trivial, cambié su función de prueba a:
#include "test.h"
void test_function()
{
volatile int i = 0;
i++;
}
Construyendo la biblioteca:
avr-gcc -Wall -g2 -gstabs -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega328p -DF_CPU=16000000UL -MMD -MP -MF"test.d" -MT"test.d" -c -o"test.o" "../test.c"
avr-ar -r "libtest.a" ./test.o
avr-objdump -h -S libtest.a >"libtest.lss"
avr-size --format=avr --mcu=atmega328p libtest.a
Construyendo el programa principal
avr-gcc -I"C:\path\to\my\workspace\test" -Wall -g2 -gstabs -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega328p -DF_CPU=16000000UL -MMD -MP -MF"program.d" -MT"program.d" -c -o"program.o" "../program.c"
avr-gcc -Wl,-Map,MainProgram.map -L"C:\path\to\my\workspace\test\Release" -mmcu=atmega328p -o"MainProgram.elf" ./program.o -ltest
avr-objdump -h -S MainProgram.elf >"MainProgram.lss"
avr-size --format=avr --mcu=atmega328p MainProgram.elf
... y se construye sin error. Mi conjetura es que necesita incluir rutas especificadas en las líneas de comando. Seguir las convenciones de nomenclatura adecuadas también es muy importante, intente y siga el patrón anterior. Obviamente, los comandos avr-objdump y avr-size son solo para obtener más información y no son necesarios si solo estás compilando.
Estoy bastante seguro de que si necesita recompilar su biblioteca para arquitecturas de destino específicas y velocidades de reloj también.