avr-gcc + rklibavr - problemy przy kompilacji

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

Reply to
__rafal__
Loading thread data ...

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

Reply to
Tomasz Pyra

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

Reply to
MoonWolf

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 ;

Reply to
__rafal__

__rafal__ denied rebel lies:

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

Reply to
MoonWolf

MoonWolf napisał(a):

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

Reply to
__rafal__

__rafal__ denied rebel lies:

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

Reply to
MoonWolf

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ć?

Reply to
__rafal__

__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?

Reply to
MoonWolf

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

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

Reply to
__rafal__

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

Reply to
MoonWolf

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

Jeszcze raz dzięki,

Reply to
__rafal__

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.