Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[AVR][C-GCC WINAVR][AVR-STUDIO]Błąd "undefined referenc

JarekC 31 Oct 2010 23:08 3434 4
  • #1
    JarekC
    Level 32  
    Witam,

    Mam projekt który "przeportowałem" z C-IAR na C-GCC WINAVR.
    Jednak mam problemy z kompilacją pod AVR-Studio z WinAVR.
    Gdy wszystkie funkcje są w jednym pliku program się kompiluje, natomiast gdy program mam w kilku plikach pojawia się problem z kompilacją.

    Problem ten występuje nawet w przypadku najprostszego projektu, który przygotowałem dla zobrazowania problemu:
    plik main.c - program główny, spi.c - funkcja, spi.h - definicja prototypu funkcji
    Obydwa pliki źródłowe są umieszczone w projekcie (są widoczne w drzewie projektu)
    plik main.c
    #include "spi.h"
    
    int main (void)
    {
     SPI_Init();
    
     while(1);
     return (0);
    }
    

    plik spi.c
    #include "spi.h"
    
    void SPI_Init (void)
    {
    }
    

    plik spi.h
    #ifndef _SPI_H_
    #define _SPI_H_
    
    void SPI_Init (void);
    
    #endif
    


    Przy próbie kompilacji pojawia się błąd:
    H:\Work\GCC-TEST\default/../MAIN.C:5: undefined reference to `SPI_Init()'
    
    co sugeruje iż brakuje definicji funkcji lub jej prototypu lecz zarówno prototyp jak i funkcja są zdefiniowane. Możliwe iż nie mam zaznaczonej jakieś opcji w kompilatorze ale do tej pory nie korzystałem z GCC i szukam trochę na ślepo.


    Na wszelki wypadek umieszczam również makefile wygenerowany automatycznie przez AVR-Studio.
    ###############################################################################
    # Makefile for the project test
    ###############################################################################
    
    ## General Flags
    PROJECT = test
    MCU = atmega16
    TARGET = test.elf
    CC = avr-gcc
    
    CPP = avr-g++
    
    ## 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"H:\Work\GCC-TEST\." 
    
    ## Objects that must be built in order to link
    OBJECTS = MAIN.o spi.o 
    
    ## Objects explicitly added by the user
    LINKONLYOBJECTS = 
    
    ## Build
    all: $(TARGET) test.hex test.eep test.lss size
    
    ## Compile
    MAIN.o: ../MAIN.C
    	$(CC) $(INCLUDES) $(CFLAGS) -c  $<
    
    spi.o: ../spi.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/*)
    


    Pozdrawiam
    JarekC
  • #2
    mirekk36
    Level 42  
    Plik makefile proponuję ci odpuścić tzn zajmowanie się jego ręcznym dzierganiem ;) .... wszystko zrobi za ciebie AVRStudio w tym względzie.

    Jeśli chodzi o pliki to masz drzewko po lewej stronie ale musisz umieścić odpowiednie plilki w odpowiednich gałęziach drzewka. Nie widzisz np gałęzi o nazwie która wyraźnie wskazuje, że tam np trza umieszczać pliki nagłówkowe (HeaderFiles) albo pliki źródłowe (SourceFiles) ????

    Można nawet tworzyć foldery w katalogu projektu żeby się nie pomieszało jak będziesz miał już milion plików ;)
  • #3
    JarekC
    Level 32  
    Witam,

    Makefile został automatycznie wygenerowany przez AVR-Studio i nic w nim nie zmieniałem,umieściłem go tylko aby ktoś biegły mógł sprawdzić czy nie brakuje jakiejś opcji.
    Pliki są umieszczone w odpowiednich gałęziach drzewa projektu. Poniżej zdjęcie pokazujące drzewo projektu.

    [AVR][C-GCC WINAVR][AVR-STUDIO]Błąd "undefined referenc
    Pomimo takich ustawień projekt nie kompiluje się. Cały czas zgłaszany jest błąd:
    H:\Work\GCC-TEST\default/../MAIN.C:5: undefined reference to `SPI_Init()' 


    Pozdrawiam
    JarekC
  • #5
    JarekC
    Level 32  
    Witam,

    Zmiana MAIN.C na main.c pomogła ! Dzięki.

    Tak myślałem,że będzie to jakiś "kruczek".

    Pozdrawiam
    JarekC