avr-gcc + rklibavr - problemy przy kompilacji

Aug 24, 2007 11 Replies

Witam!



Czy istnieje gdzieś w sieci jakaś strona gdzie opisane byłoby jak skompilować przykłady z biblioteki rklibavr? Ściągnąłem sobie paczkę z

formatting link
ą się w niej dwa katalogi: lib oraz przykład. W przykład jest kilkanaście innych katalogów z programami demonstrującymi działanie. Są to moje pierwsze kroki z kompilacją programów w języku C, tymbardziej pierwsze przy wykorzystaniu kompilatora avr-gcc. Czy jest konieczne przekopiowanie plików z katalogu lib do katalogu przykąłdu? jeśli tak to których? wydaje mi się, że w plikach makefile czy innych *.h niby są ścieżki do ../../lib ale mimo to kompilator wyrzuca błędy.


W pliku testlcd.c na początku:



Kod: #include <avr/io.h>



#include <avr/pgmspace.h>



#include "lcd.h"


ale lcd.h jest w katalogu ../../lib - czy należy ten wpis zmienić lub lcd.h przekopiować do katalogu przykłądu?



przy próbie kompilacji avr-gcc -mmcu=atmega16 testlcd.c dostaję:


Cytat: testlcd.c:7:17: error: lcd.h: No such file or directory testlcd.c: In function ‘progressbar’: testlcd.c:15: error: ‘u08’ undeclared (first use in this function) testlcd.c:15: error: (Each undeclared identifier is reported only once testlcd.c:15: error: for each function it appears in.) testlcd.c:15: error: expected ‘;’ before ‘i’ testlcd.c:17: error: ‘i’ undeclared (first use in this function) testlcd.c: In function ‘chartable’: testlcd.c:29: error: ‘u08’ undeclared (first use in this function) testlcd.c:29: error: expected ‘;’ before ‘x’ testlcd.c:30: error: expected ‘;’ before ‘ch’ testlcd.c:32: error: ‘z’ undeclared (first use in this function) testlcd.c:32: error: ‘LCD_X’ undeclared (first use in this function) testlcd.c:32: error: ‘LCD_Y’ undeclared (first use in this function) testlcd.c:34: error: ‘y’ undeclared (first use in this function) testlcd.c:37: error: ‘x’ undeclared (first use in this function) testlcd.c:38: error: ‘ch’ undeclared (first use in this function) testlcd.c: In function ‘main’: testlcd.c:82: error: expected ‘)’ before ‘_z’


Jak wpiszę make to dostaję:



- Cytat:


------- begin -------- ../../lib/counter.sh: 9: Syntax error: end of file unexpected (expecting "then") make: *** [counter] Błąd 2


Jak skopiuję wszysttkie potrzebne pliki *.h do katalogu projektu to dostaję:



Cytat: /tmp/cc4sEFwG.o: In function `progressbar': testlcd.cSad.text+0x14): undefined reference to `LCD_progressbar_init' testlcd.cSad.text+0x20): undefined reference to `LCD_progressbar' testlcd.cSad.text+0x28): undefined reference to `LCD_xy' testlcd.cSad.text+0x32): undefined reference to `LCD_putint' testlcd.cSad.text+0x38): undefined reference to `LCD_putchar' testlcd.cSad.text+0x44): undefined reference to `delayloop32' /tmp/cc4sEFwG.o: In function `chartable': testlcd.cSad.text+0x7c): undefined reference to `LCD_PL_chars_init' testlcd.cSad.text+0x8c): undefined reference to `LCD_xy' testlcd.cSad.text+0x9e): undefined reference to `LCD_putchar itd...


Ogólnie nie mam pojęcia jak skompilować te przykładowe programy i prosiłbym o napisanie jakiegoś krótkiego przewodnika. Podejrzewam, że mój problem to jakiś banał... z góry dziękuję za podpowiedzi - od czego zacząć.



__rafal__ pisze:

Powinny tam być pliki "Makefile" zawierające reguły kompilacji - kompilujesz poleceniem "make".

Jeżeli chcesz kompilować ręcznie za pomocą gcc to powyższe błędy oznaczają: testlcd.c:7:17: error: lcd.h: No such file or directory

Nie może znaleźć pliku lcd.h - powinieneś podczas kompilacji podać gcc do niego ścieżkę za parametrem -I (np. -I/jakis/katalog/) Ewentualnie inną metodą, ale mniej elegancką jest skopiowanie plików .h do bieżącego katalogu (co zrobiłeś).

Dostajesz teraz: testlcd.cSad.text+0x14): undefined reference to `LCD_progressbar_init'

Czyli linker nie może znaleźć deklaracji funkcji której definicję znalazł w tym pliku .h który skopiowałeś. Musisz wcześniej skompilować plik z tą funkcją (pewnie lcd.c albo podobnie) i dołączyć wynikowe binaria do swojego programu podczas procesu linkowania. Jednak "Makefile" (który pewnie tam jest) powinien robić to wszystko sam.

Jeżeli lubisz się uczyć na przykładach poszukaj w internecie artykułów o pierwszych krokach w c/c++ które pokazują w jaki sposób tworzyć pliki "Makefile" (na początek takie nieskomplikowane), oraz kompilować za pomocą narzędzi GNU (gcc, make itd...).

Tomasz Pyra denied rebel lies:

E - to mordęga IMO. Generowanie plików Makefile lepiej powierzyć autotoolsom (w przypadku Linuksa) ewentualnie (lepiej) jakiemuś IDE (zarówno Win* jak i Linuks - w tym przypadku pewnie jako 'nakładka' na autotools). Tworzenie tego z palca ograniczyłbym do jakichś naprawdę banalnych przypadków...

Tak, każdy przykład ma w swoim katalogu plik makefile który zawiera także taką linijkę:

include $(USRLIB)/avr_make

i w tym pliku są dalsze jak się domyślam reguły kompilacji.

Ogólnie nie zmieniając nic - po rozpakowaniu archiwum i wejściu do jakiegokolwiek projektu wpisując make otrzymuję zawsze ten sam błąd:

-------- begin -------- ../../lib/counter.sh: 9: Syntax error: end of file unexpected (expecting "then") make: *** [counter] Błąd 2

plik counter.sh ma treść:

if [ -f counter.txt ] ; then echo $((`cat counter.txt`+1)) > counter.txt ; else echo "1" > counter.txt ; fi echo "unsigned int version PROGMEM = `cat counter.txt`;" > version.h ;

__rafal__ denied rebel lies:

To na pewno cały plik? Bo ja tu błędu nie widzę (u mnie ten skrypt działa).

MoonWolf napisał(a):

tak, jest to pełna treść pliku i pełna treść komunikatu błędu.

__rafal__ denied rebel lies:

Przyczyna znaleziona. Zapuść dos2unix na tym pliku, albo ręcznie usuń windowsowskie znaki końca linii.

MoonWolf napisał(a):

super, ruszyło...

co prawda w konsoli pod sam koniec wywala chyba jakiś błąd:

make: *** [testlcd.cof] Błąd 1

ale tworzy się plik hex :)

Mam się czym przejmować?

__rafal__ denied rebel lies:

U mnie pojawia się make: *** [testlcd.eep] Błąd 1 bo nie ma zmiennych w eepromie - tym się nie ma co przejmować. Natomiast ten błąd co u Ciebie nie wyskakuje. To jest chyba plik do emulacji w AVR Studio - jeśli tak to ja by się nie przejmował. Tworzy się w ogóle ten plik?

Pogubiłem się. Po wydaniu polecenia make dzieją się następujące rzeczy:

http://83.15.126.146/~rafal/make.txt

__rafal__ denied rebel lies:

Binarka generuje się poprawnie, hex powstaje. Ten komunikat: testlcd.cof: Invalid bfd target oznacza, że jest problem przy generowaniu pliku. Ale - jak wyczytałem w avr_make (w tym pakiecie): # Konwersja ELF na COFF dla symulacji w AVR Studio więc, jeśli nie używasz AVR studio i nie chcesz w nim symulować, to możesz to spokojnie olać.

Swoją drogą to dziwne. Ten sam projekt u mnie generuje błąd dotyczący eeproma (nie generuje się, ale też można olać), a plik .cof w ogóle nie jest (nie próbuje być) generowany. No, ale to tak na marginesie.

Bardzo Ci dziękuję za pomoc. Pliki hex są generowane i działają ;)

Jeszcze raz dzięki,

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required