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.
[newbie] Jak tworzyć
Apr 26, 2006
6 Replies
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