[newbie] Jak tworzyć

Witam, w jaki sposób tworzycie biblioteki - moduły dla AVR. Jestem zielony w tym temacie, korzystam z WinAVR i chciałbym sobie podzielić projekt na mniejsze moduły dołączane w razie potrzeby. Nie bardzo wiem jakie parametry muszę zapodać ,żeby skompilowac bibliotekę. Kompilacja przy użyciu makefile kończy sie komunikatem : ... C:/WinAVR/BIN/../lib/gcc/avr/3.4.5/../../../../avr/lib/avr5/crtm162.o: In function `__vectors': ../../../../../avr-libc-1.4.3/crt1/gcrt1.S:51: undefined reference to `main' make.exe: *** [*.elf] Error 1 Pozdrawiam i serdecznie dziękuję za pomoc.

Reply to
Torx
Loading thread data ...

Biblioteki czy po prostu pliki naglowkowe? Tak czy owak, piszesz w C, bez funkcji main().

Mozesz w glownym programie dolaczyc przez #include <plik>. Lub mozesz skompilowac uzywajac gcc z opcja -o, a pozniej zlinkowac wszystko.

Tak czy owak, w "bibliotece" nie ma funkcji main(). I tylko tym sie rozni.

m.

Reply to
Martin Lukasik

Martin Lukasik napisał(a):

nie chodzi przypadkiem o opcję -c?

w.

Reply to
Wojtek Kaniewski

Torx napisał(a):

Biblioteki linkowane statycznie to z punktu widzenia kompilatora po prostu zebrane w jeden plik (zwykle z rozszerzeniem .a) wiele plików obiektowych (.o). Sposób postępowania:

- tworzysz jeden lub więcej plików źródłowych .c, najlepiej każdą znaczącą funkcję w oddzielnym pliku (dla biblioteki obsługi LCD będą to np. lcd_gotoxy.c, lcd_putchar.c, lcd_puts.c, lcd_clear.c itp),

- kompilujesz każdy plik oddzielnie do postaci obiektowej (.o)

- zapuszczasz archiwer sklejający te pliki .o w jeden plik .a poleceniem np: avr-ar -rc mojabiblioteka.a plik1.o plik2.o plik3.o

Teraz jeżeli chcesz użyć biblioteki w programie, po prostu dołączasz plik mojabilioteka.a do listy plików dla linkera. Linker inteligentnie wybierze z biblioteki tylko pliki zawierające funkcje, których używasz (dlatego najlepiej jak najbardziej "podziabać" źródła biblioteki na oddzielne pliki .c aby niepotrzebne rzeczy nie musiały się dołączać).

Reply to
Adam Dybkowski

Torx napisał(a):

Aha, jeszcze oczywiście dla biblioteki musisz utworzyć plik nagłówkowy z prototypami funkcji bibliotecznych i dołączać go tam, gdzie masz zamiar używać funkcji z biblioteki. Warto definicje stałych itp. rzeczy "prywatne" dla biblioteki trzymać w oddzielnym pliku nagłówkowym, a w oddzielnym prototypy funkcji i definicje potrzebne "na zewnątrz" czyli w programie wykorzystującym bibliotekę.

Reply to
Adam Dybkowski

Adam Dybkowski snipped-for-privacy@amwaw.edu.pl> wrote in news:e2vdtv$2h8$ snipped-for-privacy@atlantis.news.tpi.pl:

Witam, wielkie dzięki za pomoc :-). Trochę się jeszcze motam z makfile a wystarczyło wydać polecenie 'make lib' i by się ładnie skompilowało :-). Oczywiście musiałem wcześniej lekko zmodyfikować makefile ponieważ autor wzorca zapomniał dodać parametry dla ar ,który sypał błędami o brakujących lub nieznanych parametrach :-). Mam jeszcze jeden problem , mianowicie nie za bardzo wiem jak dodać swoją nowo utworzoną bibliotekę :-(. Zakładając ,że bibliotekę mam w katalogu F:\MojeProjekty\AVR\Lib\Atmega8 a projekt np w katalogu F:\MojeProjekty\AVR\src\prj1 ,którą sekcję makfila muszę zmodyfikować i co muszę dodać ?? Dodanie parametru -L ../../lib/atmega8 i -l ../../lib/atmega8/tst skutkuje wywaleniem komunikatu o niemożności odnalezienia biblioteki tst.a . Może mnie ktoś naprowadzić na właściwy trop. Pewnie zapomniałem o jakimś drobiazgu. Dziękuję serdecznie za pomoc i pozdrawiam.

Reply to
Torx

Torx napisał(a):

Są dwie szkoły: albo określasz katalogi poszukiwania bibliotek (opcja

-L) i z opcją -l już tylko nazwy skrócone bibliotek (np. -ltst spowoduje dołączenie biblioteki libtst.a - zauważ że biblioteka musi się nazywać libCOŚTAM.a). Albo można prościej wpisując pliki .a ze ścieżkami [najlepiej względnymi] do listy plików wejściowych w wywołaniu linkera, bez żadnych magicznych opcji.

Reply to
Adam Dybkowski

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.