-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Pure Verzweifelung: ... undefined reference to 'Init'

  1. #1

    Pure Verzweifelung: ... undefined reference to 'Init'

    Anzeige

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

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.169
    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?

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.08.2004
    Ort
    Stuttgart
    Alter
    42
    Beiträge
    849
    Servus,

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

    Code:
    #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

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.03.2006
    Ort
    Darmstadt
    Alter
    26
    Beiträge
    522
    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

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    16.01.2009
    Ort
    Rosenfeld
    Beiträge
    57
    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

  6. #6
    das mit den slashes hat mich auch schon gewundert, hier ist das makefile:

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

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.03.2006
    Ort
    Darmstadt
    Alter
    26
    Beiträge
    522
    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

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.169
    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.

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

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    16.01.2009
    Ort
    Rosenfeld
    Beiträge
    57
    Was du mit der Zeile:
    Code:
    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:
    Code:
    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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •