Die slash zeichenim pfad stimmen nicht uberein. Bist du sicher die pfad angabe im makefile sind correct? Welchen libs meinst du? Was hast du genau geandert?C:\....\default/../test.c:4: undefined reference to `Init'
Hallo,
ich bin absoluter Anfänger was den Asuro angeht. Und zwar hab ich folgendes Problem: Ich weiß nicht wieso, aber irgendwie klappt es nicht mehr dass ich Programme compiliere wo Init(); vorkommt. Für folgendes einfaches Programm bekomme ich folgende Fehlermeldung:
#include "asuro.h"
int main()
{
Init();
MotorDir(FWD,FWD);
MotorSpeed(255,255);
while(1);
return 0;
}
Fehlermeldung:
C:\....\default/../test.c:4: undefined reference to `Init'
was läuft hier verkehrt? hab schon Winavr, die libs usw. alles einmal neu installiert und es kommt immer wieder. Bevor ihr laut loslacht- ich hab echt noch nicht sooo den Durchblickund über die Suchfunktion hab ich nichts gefunden, was ich hier weiterbringen würde
Ich danke euch schon mal für eure Hilfe
gruß
Dittay
edit: es hat auch schon mal funktioniert, deshalb frage ich mich wieso es jetzt auf einmal nicht mehr funzt ...
Die slash zeichenim pfad stimmen nicht uberein. Bist du sicher die pfad angabe im makefile sind correct? Welchen libs meinst du? Was hast du genau geandert?C:\....\default/../test.c:4: undefined reference to `Init'
Servus,
Ich glaube nicht das dieses Programm einmal funktioniert hat, du hast es sicherlich modifiziert. Veruche es einmal mal so:
Das While in eine Klammereben setzen, so am Ende macht das wenig Sinn (was man anfängt muß man immer korrekt auflösen, egal welche Sprache).Code:#include "asuro.h" int main () { do { Init (); MotorDir (FWD,FWD); MotorSpeed (255, 255); } while (1); return 0; }
Dein Programm wird eh nie die Main velassen, da immer True existiert. Denke aber das beabsichtigst du hier.
Grüße Wolfgang
Hallo,
@dittay
"undefined reference to ..." bedeutet, dass die Funktion Init nirgendswo gefunden wurde, was wahrscheinlich damit zusammenhängt, dass die Lib für den Asuro nicht eingebunden wurde. Hast Du das Makefile oder die Pfade zwischendurch irgendwie geändert? Soweit ich weiss, werden beim Asuro einige Bespielprogramme mitgeliefert. Versuch mal sie zu compilieren, wenn es klappt liegts definitiv an deinem Makefile.
@BlueNature
Warum sollte Init() und der Rest immer wieder aufegrufen werden? Es reicht doch, wenn es wie in seinem Programm nur einmal aufgerufen wird.
MfG Mark
das seh ich auch so. Das Programm von Dittay ist so vollkommen in Ordnung.
Nur scheinen die Pfadangaben im Makefile nicht zu passen. Daher findet der Compiler die Datei asuro.c nicht, in der Init() implementiert ist.
Gruß
Günther
das mit den slashes hat mich auch schon gewundert, hier ist das makefile:
aber im makefile sind alle slashes und so doch correct oder nicht?Code:############################################################################### # Makefile for the project test ############################################################################### ## General Flags PROJECT = test MCU = atmega8 TARGET = test.elf CC = avr-gcc ## Options common to compile, link and assembly rules COMMON = -mmcu=$(MCU) ## Compile options common for all C compilation units. CFLAGS = $(COMMON) CFLAGS += -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d ## Assembly specific flags ASMFLAGS = $(COMMON) ASMFLAGS += $(CFLAGS) ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2 ## Linker flags LDFLAGS = $(COMMON) LDFLAGS += -Wl,-Map=test.map ## Intel Hex file production flags HEX_FLASH_FLAGS = -R .eeprom -R .fuse -R .lock -R .signature HEX_EEPROM_FLAGS = -j .eeprom HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load" HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0 --no-change-warnings ## Include Directories INCLUDES = -I"C:\Dokumente und Einstellungen\Dittay\Eigene Dateien\..\..\..\AsuroLib-v280rc1\lib\inc" ## Library Directories LIBDIRS = -L"C:\AsuroLib-v280rc1\lib" ## Libraries LIBS = -lasuro ## Objects that must be built in order to link OBJECTS = test.o ## Objects explicitly added by the user LINKONLYOBJECTS = ## Build all: $(TARGET) test.hex test.eep test.lss size ## Compile test.o: ../test.c $(CC) $(INCLUDES) $(CFLAGS) -c $< ##Link $(TARGET): $(OBJECTS) $(CC) $(LDFLAGS) $(OBJECTS) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) -o $(TARGET) %.hex: $(TARGET) avr-objcopy -O ihex $(HEX_FLASH_FLAGS) $< $@ %.eep: $(TARGET) -avr-objcopy $(HEX_EEPROM_FLAGS) -O ihex $< $@ || exit 0 %.lss: $(TARGET) avr-objdump -h -S $< > $@ size: ${TARGET} @echo @avr-size -C --mcu=${MCU} ${TARGET} ## Clean target .PHONY: clean clean: -rm -rf $(OBJECTS) test.elf dep/* test.hex test.eep test.lss test.map ## Other dependencies -include $(shell mkdir dep 2>/dev/null) $(wildcard dep/*)
also ich benutze generell das AVR Studio, heißt das makefile wird von da aus ja direkt umgesetzt oder?
was ich mit den Libs verändert hab, war schlicht und ergreifend dass ich denen mal einen anderen pfad gegeben habe, nachdem ich mir die AsuroLib-v280rc1 runtergeladen hab.
Irgendwann hab ich auch mal versucht ein makefile selbst zu schreiben, was allerdings nicht so recht funktioniert hat. Ich hab dann hier und da ein wenig rumgefummelt mit dem ergebnis, dass ich auch diese Fehlermeldung bekam... Seitdem funzt es irgendwie nicht mehr, allerdings hab ich auch vergessen, was ich da gemacht habeAber kann man es sich damit so versauen, dass es generell nicht mehr geht?
@wolfgang: das Programm lief vorher so wie es da steht
Wie binde ich denn die Libs richtig ein? Also ich hab die Libs über die Properties im AVR Studio versucht einzubinden.
Also das AVR-Studio benutzt standardmäßig ein eigenes Makefile. Dass das vorhandene Makefile verwendet werden soll muss man manuell angeben!
Ich habe kein AVR-Studio installiert, aber um die Lib einzubinden muss man da wahrscheinlich erstmal den Prad eintragen, wo die Lib liegt, denn standardmäßig sucht GCC nur in avr/include des Win-AVR Ordners. Diesen Pfad kann man mit -L"PFAD" angeben (kein Leerzeichen nach -L).
MfG Mark
Wie das mit AVRStudio und die Asurolib v280rc1 geht weis ich auch nicht. Ich nutze die .bat datei-en im projekt mappen zum compilieren. Vieleicht steht da noch etwas uber compilieren mit AVRstudio im lib280rc1 readme.
Und die slashes im makefiles sind anders herum (sollte / sein). Ähnlich wich die slashs im URLs oder UNIX. Windows/msdos nutzt \ (backslash) im pfaden.
so ich bins nochmal. Also ich hab mich jetzt mal mit der asuro.c beschäftigt und geschaut wo oder wie sie eingebunden ist. Sie war nicht eingebunden. Beim Kompilieren allerdings bekomme ich jetzt allerdings andere Fehler und zwar diese(natürlich nach dem Einbinden von asuro.c):
C:\Asuro Programme\..\AsuroLib-v280rc1\lib\inc/asuro.h:426: warning: inline function 'StatusLED' declared but never defined
avr-gcc -I"C:\Asuro Programme\..\AsuroLib-v280rc1\lib\inc" -mmcu=atmega8 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT asuro.o -MF dep/asuro.o.d -c ../../AsuroLib-v280rc1/lib/asuro.c
../../AsuroLib-v280rc1/lib/asuro.c: In function 'Init':
../../AsuroLib-v280rc1/lib/asuro.c:145: error: 'F_CPU' undeclared (first use in this function)
../../AsuroLib-v280rc1/lib/asuro.c:145: error: (Each undeclared identifier is reported only once
../../AsuroLib-v280rc1/lib/asuro.c:145: error: for each function it appears in.)
../../AsuroLib-v280rc1/lib/asuro.c: At top level:
C:\Asuro Programme\..\AsuroLib-v280rc1\lib\inc/asuro.h:466: warning: inline function 'MyMotorSpeed' declared but never defined
C:\Asuro Programme\..\AsuroLib-v280rc1\lib\inc/asuro.h:457: warning: inline function 'MotorSpeed' declared but never defined
C:\Asuro Programme\..\AsuroLib-v280rc1\lib\inc/asuro.h:449: warning: inline function 'MotorDir' declared but never defined
C:\Asuro Programme\..\AsuroLib-v280rc1\lib\inc/asuro.h:432: warning: inline function 'FrontLED' declared but never defined
C:\Asuro Programme\..\AsuroLib-v280rc1\lib\inc/asuro.h:426: warning: inline function 'StatusLED' declared but never defined
make: *** [asuro.o] Error 1
Build failed with 3 errors and 15 warnings...
ist ja schon mal was anderes... jemand eine idee? Auch hier sind die slashes wieder anders zum Teil, aber ich hab keine Ahnung woher das kommt...
Was du mit der Zeile:
bewirken möchtest, verstehe ich auch nicht.Code:INCLUDES = -I"C:\Dokumente und Einstellungen\Dittay\Eigene Dateien\..\..\..\AsuroLib-v280rc1\lib\inc"
Du gehst vom Root-Verzeichnis aus in drei Unterverzeichnisse und gibst dort das drei Ebenen höher liegende Verzeichnis "AsuroLib-v280rc1" an von dem es dann wieder zwei Ebenen tiefer geht. Komische Logik.
Mit:würde man das doch viel einfacher erreichen - oder?Code:INCLUDES = -I"C:\AsuroLib-v280rc1\lib\inc" bzw. in richtiger UNIX- Schreibweise: INCLUDES = -I"C:/AsuroLib-v280rc1/lib/inc"
Ich kenn mich aber mit Makefiles auch nicht so gut aus.
Mein Vorschlag:
schnapp dir z.B. das komplette FirstTry-Projekt von der Installations- CD und kopiere es für jedes neue Projekt in einen eigenen Ordner.
Dann änderst du jeweils nur die Datei test.c und rufst den Compiler über Test-all.bat auf. Wenn es keine Fehler gibt, hast du anschließend eine Datei test.hex in diesem Verzeichnis und die kannst du dann auf den ASURO flashen.
Um die modifizierte Asuro Lib 280rc1 zu verwenden, kopierst du eben die asuro.c und asuro.h aus dem neuen 280rc1-Lib-Verzeichnis in deine eigenen Projektverzeichnisse.
Ist vielleicht nicht die eleganteste Methode, aber bei mir funktionierts so.
Gruß
Günther
Lesezeichen