logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

AVR Studio - dodawanie bibliotek

tehaceole 24 Sty 2010 22:12 7874 6
  • #1 7586756
    tehaceole

    Poziom 28  
    Witam Kolegów

    Może nieco lamerskie pytanie...
    Piszę sobie program w C. Mam kilka róznych bloków programu odpowiedzialnych za różne elementy działania. Teraz chciałbym te moduły wywalić z głównego pliku .c do pojedynczych plików .h zamiast wszystkie mieć w głownym pliku z funkcją main().
    W głównym pliku mam zapisane definicje np pinów itp. Gdy wywalę moje bloki do pojedynczych plików .h to kompilator wywala mi szereg błędów, typu niezdefiniowana etykieta itp. Jak to obejść?
    Drugim zbliżonym problemem jest coś takiego: w głównym pliku mam import bibliotek avr takich jak eeprom, interrupts itp. Gdy moje bloki są w pojedynczych plikach .h to tak jakby ich zawartość nie widziała tych wczytanych w głównym pliku bibliotek.

    Dzięki serdeczne za pomoc.
  • #2 7586982
    tmf
    VIP Zasłużony dla elektroda
    Przenoszenie rzeczy z plikow zrodlowych d naglowkowych jest pomyslem slabym. Mozesz je przeniesc do inych plikow .c, a naglowki zdefiniowanych i eksportowanych poza plik funkcji, zmiennych i definicji umiescic w stosownym pliku naglowkowym inkludowanych we wszystkich plikach w ktorych sie do nich odnosisz. W tym przypadku dobrym pomyslem moze byc przeniesienie na poczatek definicji pinow itd. Nie zapomnij zabezpioeczyc sie przed wielokrotnym oincludowaniem plikow naglowkowych.
  • #3 7587000
    acid12
    Poziom 21  
    w plikach .h (header) zwykło sie pisać tylko naglowki funkcji, a cała tresc w pliku .c

    np. oprocz pliku main.c

    lcd.h, lcd.c

    gdzie w pliku lcd.c dajesz tylko include "lcd.h" podobnie jak w pliku main dolaczasz tylko naglowki a pliki z kodem dolacza sie same :)

    zeby uniknac bledow, ze dolaczasz pliki np eeprom itd w main a musisz uzywac np w lcd.h, ja zazwyczaj stwarzam jeden plik includes.h ktory dolaczam do wszystkich innych, ale wtymze pliku poprzedzam wszystkie includy instrukcja "pragma once" ktora wymusza aby biblioteka nie byla dolaczana, gdy jakis inny plik już ją dołączył. Wykorzystuje sie tez instrukcje 'if not define ... define'

    jezeli zrobi sie to dobrze od poczatku, nawet skomplikowany program z kilkunastoma bibliotekami, ktore wykorzystują funkcje pisane w roznych innych plikach naprzemiennie nie powoduje wyrzucania zadnych warningów
  • #5 7587055
    tehaceole

    Poziom 28  
    Dziękuję za odpowiedzi. Wyjaśniły mi co robię źle. Nie mam problemów z napisaniem nawet bardzo skomplikowanego kodu, jednak chciałbym ze swojej radosnej twórczości usunąć pewne złe nawyki takie jak np wrzucanie większości kodu do jednego pliku. Nadszedł już czas, aby mój kod był zrozumiały nie tylko dla mnie, ale także dla osób postronnych. A obecne przyzwyczajenia niestety mocno to ograniczają.
    Ostatnio bardzo boleśnie przekonałem się np o wyższości stosowania sizeof() nad ręcznym czuwaniem nad wielkością tablicy.
  • #6 7809996
    neo73
    Poziom 10  
    Ja zaś mam taki problem z dodaniem biblioteki.
    Skompilowałem bibliotekę z potrzebnymi mi funkcjami.
    Kompilacja bez żadnych błędów.
    Dodałem w opcjach konfiguracji tą bibliotekę do projektu.
    Niestety przy kompilacji projektu występuje błąd.
    Wygląda na to że kompilator nie widzi tej biblioteki.
    Poniżej zamieszczam log z kompilacji.

    Build started 9.3.2010 at 22:33:33
    avr-gcc -mmcu=atmega32 -Wl,-Map=testlcd.map testlcd.o -lE:\testlcd\source\testlcd\lcd -o testlcd.elf
    c:/winavr-20090313/bin/../lib/gcc/avr/4.3.2/../../../../avr/bin/ld.exe: cannot find -lE:\testlcd\source\testlcd\lcd
    make: *** [testlcd.elf] Error 1
    Build failed with 1 errors and 0 warnings...


    Jak widać kompilator nie może odnaleźć pliku lcd, chociaż plik z biblioteką dodany w projekcie to lcd.a

    Nie mam pojęcia o co chodzi.

    Z góry dziękuje za pomoc.
    Pozdrawiam.
    Marcin.
  • #7 7810241
    szelus
    Poziom 34  
    Widocznie źle dodałes.
    Niestety, nie znam się na konfiguracji AVR Studio, ale chodzi o składnię opcji kompilatora gcc. Opcja dodawania bibliotek -l po pierwsze nie akceptuje scieżek. Po drugie, konwencja jest taka, że biblioteka powinna nazywać się libxxx.a. Opcja -lxxx nakazuje kompilatorowi uwzględnić bibliotekę o nazwie libxxx.a. Zatem powinienes odpowiednio nazwać tę bibliotekę.

    Natomiast scieżki do poszukiwania bibliotek specyfikuje się (dla gcc) opcją -L. AVR Studio powinno mieć też gdzies do tego opcję.
REKLAMA