[newbie] Jak tworzyć

Apr 26, 2006 6 Replies

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.


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.

Martin Lukasik napisał(a):

nie chodzi przypadkiem o opcję -c?

w.

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ć).

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ę.

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.

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.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required