PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Pure Verzweifelung: ... undefined reference to 'Init'



dittay
15.03.2009, 02:03
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 Durchblick :) und ü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 ...

Valen
15.03.2009, 02:17
C:\....\default/../test.c:4: undefined reference to `Init'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?

BlueNature
15.03.2009, 03:33
Servus,

Ich glaube nicht das dieses Programm einmal funktioniert hat, du hast es sicherlich modifiziert. Veruche es einmal mal so:



#include "asuro.h"
int main () {
do {
Init ();
MotorDir (FWD,FWD);
MotorSpeed (255, 255);
} while (1);
return 0;
}


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).
Dein Programm wird eh nie die Main velassen, da immer True existiert. Denke aber das beabsichtigst du hier.

Grüße Wolfgang

p_mork
15.03.2009, 10:17
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

orusa
15.03.2009, 10:40
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

dittay
15.03.2009, 10:43
das mit den slashes hat mich auch schon gewundert, hier ist das makefile:



################################################## #############################
# 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/*)

aber im makefile sind alle slashes und so doch correct oder nicht?

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 habe 8-[ Aber 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.

p_mork
15.03.2009, 12:47
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

Valen
15.03.2009, 13:34
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.

dittay
15.03.2009, 14:46
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...

orusa
15.03.2009, 14:48
Was du mit der Zeile:


INCLUDES = -I"C:\Dokumente und Einstellungen\Dittay\Eigene Dateien\..\..\..\AsuroLib-v280rc1\lib\inc"

bewirken möchtest, verstehe ich auch nicht.
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:

INCLUDES = -I"C:\AsuroLib-v280rc1\lib\inc"

bzw. in richtiger UNIX- Schreibweise:
INCLUDES = -I"C:/AsuroLib-v280rc1/lib/inc"
würde man das doch viel einfacher erreichen - oder?

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

dittay
15.03.2009, 14:54
Diese Logik hab ich auch nicht verstanden, hatte es manuell auch schon umgestellt, mit gleichem effekt...


allerdings konnte ich das obige problem jetzt beheben:
Es lag an der Frequenz, da stand noch nichts drin und hab dann als wert 80000000 angegeben, jetzt funktioniert alles problemlos.

Ich danke Euch auf jeden Fall :) Jetzt kann es ja losgehen!

Valen
15.03.2009, 14:55
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üntherWirkt das wirklich gut? Dah sind doch eine ganze menge mehr .c und .h datein fur dem erweitertem lib notwendig?