Nun, Du solltest Dir erstmal über die Begrifflichkeiten im Klaren
werden.
Eine Headerdatei deklariert ein Interface zu irgendwas. Diese muß vom
Compiler beim Compilieren all derjenigen C-Quelldateien auffindbar
sein, die darin deklarierte Funktionalität benutzen wollen.
Deine Methode, sie ins Systemverzeichnis (für Headerdateien) zu
werfen, ist eher brutal. Die normale Methode wäre es, dem Compiler
mit -I zu erzählen, wo er überall seine Headerdateien suchen soll. Im
Makefile-Template ist der Makro CINCS dafür reserviert, daß man in ihm
alle -I Anweisungen für den Compiler aufführt. (Wenn Du Dir einen
Gefallen tun willst, trennst Du die Pfadnamen nicht mit \ sondern mit
/, andernfalls müßtest Du alle \ als \\ notieren, weil die
Interpretation der make-erzeugten Kommandos von einer Unix-Shell
vorgenommen wird. Windows versteht aber auch die Vorwärtsstriche
intern anstandslos.)
Eine Bibliothek im landläufigen Sinne ist eine Objektmodulbibliothek,
Endung .a (Mnemonik: archive). Diese enthält vorcompilierte
Objektmoduln, die vom Linker bei Bedarf hinzugefügt werden können.
Man gibt dem Linker nur den Namen der Bibliothek mit an, und anhand
der Endung .a weiß er, daß er aus dem Archiv nur das nehmen soll, was
gebraucht wird.
Auf diese Weise ist die Standardbibliothek (libc.a) aufgebaut.
Angelegt werden sie mit dem Kommando avr-ar.
Der Nachteil ist, daß Du eine solche Bibliothek praktisch für jeden
AVR-Typ separat compilieren mußt, da in aller Regel die C-Programme
viele Hardwareabhängigkeiten aufweisen.
Alternativ kannst Du gleich Deine C-Quelldatei (ggf. mit vollem
Pfadnamen) dem Compiler mit angeben. Dann wird sie für Dein konkretes
Projekt (und mit dessen -mmcu= Option) in eine Objektdatei compiliert
und mit hinzugelinkt. Das dauert zwar theoretisch etwas länger als
das Extrahieren aus einer Bibliothek, aber der Unterschied ist bei
heutigen Compiler-/Computergeschwindigkeiten zu vernachlässigen.