logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega162][WinAVR]Błąd undefinied reference

peikman 02 Gru 2009 12:55 1868 5
  • #1 7335692
    peikman
    Poziom 12  
    Cześć. Mam problem z programem obsługi wyświetlacza. Pracuje na WinAVR 20090313

    W main.c mam:
    #include <avr/io.h>
    #include <inttypes.h>
    #include <stdio.h>
    #include <avr/pgmspace.h>
    #include <util/delay.h>
    
    #include "makra.h"
    #include "harddef.h"
    #include "lcd.h"
    #include "local.h"
    
    37   .....
    38   fputs_P(str_Hello, lcd_GetFile());
    39   ....
    
    
    
    
    w lcd.c mam:
    #include <avr/io.h>
    #include <inttypes.h>
    #include <util/delay.h>
    #include <string.h>
    #include <avr/pgmspace.h>
    
    #include "makra.h"
    #include "harddef.h"
    #include "lcd.h"
    #include "local.h"
    
    .....
    inline FILE* lcd_GetFile(void)
    {
    	return lcd_fLCD;
    }
    ......
    
    
    
    
    W lcd.h mam: 
    
    #include <avr/pgmspace.h>
    #include <stdio.h>
    
    .....
    inline FILE* lcd_GetFile(void);
    .....
    


    Błąd jaki mi wyskakuje to:
    c:\winavr-20090313\programy\lcd_dynamic/main.c:38: undefined reference to `lcd_GetFile'


    Tutaj jest kod całego programu:
    http://elportal.pl/n0017/c_materialy/_do_cz9.rar

    Poproszę o jakieś wskazówki.
  • #2 7336246
    _Robak_
    Poziom 33  
    Dolacz do projektu plik lcd.c pewnie tylko dolaczasz naglowek.
  • #3 7336915
    peikman
    Poziom 12  
    # List C source files here. (C dependencies are automatically generated.)
    SRC = main.c
    SRC += lcd.c \
    local.c
    


    Masz to na myśli :?:

    Cytat:

    Linking: LCD_dynamic.elf
    avr-gcc -mmcu=atmega162 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o -std=gnu99 -MMD -MP -MF .dep/LCD_dynamic.elf.d main.o lcd.o local.o --output LCD_dynamic.elf -Wl,-Map=LCD_dynamic.map,--cref -lm
    main.o: In function `main':
    c:\winavr-20090313\programy\lcd_dynamic/main.c:38: undefined reference to `lcd_GetFile'
    c:\winavr-20090313\programy\lcd_dynamic/main.c:46: undefined reference to `lcd_GetFile'
    make.exe: *** [LCD_dynamic.elf] Error 1

    > Process Exit Code: 2
    > Time Taken: 00:00
  • #4 7337890
    kordirko
    Poziom 22  
    Wywal definicję funkcji lcd_GetFile z pliku lcd.c, a zdefiniuj ją w pliku lcd.h
    funkcja inline to coś a'la makro, kompilator nie generuje dla niej jednego kodu
    do którego się "skacze" z różnych miejsc przez call,
    ale generuje wprost ten sam kod w każdym miejscu w którym jej użyjesz
    - tyle razy ten sam kod ile jest wywołań.
    Podczas kompilacji musi wiedzieć co ma tam wstawić,
    w lcd.h nie ma definicji, w main.c w której ją wołasz też nie ma definicji
    więc nie wie jaki kod ma tam wstawić i głupieje.
    Definicja jest w lcd.c - ale kompilator nie jest aż taki mądry żeby wiedzieć
    w którym pliku ma to znaleźć.
    Jak używasz funkcji inline, to włącz przy kompilacji opcję -Winline,
    będzie ci dawał warningi w tych miejscach gdzie sobie nie radzi.
  • #6 7339974
    peikman
    Poziom 12  
    markosik20 napisał:
    W pliku lcd.h dopisz extern.

    extern inline FILE* lcd_GetFile(void);


    Teraz wszystko działa. Rzeczywiście teraz podczas procesu linkowania dzięki komendzie extern plik main.c ma symboliczny dostęp do tej funkcji.

    kordirko napisał:

    Jak używasz funkcji inline, to włącz przy kompilacji opcję -Winline,
    będzie ci dawał warningi w tych miejscach gdzie sobie nie radzi.


    Gdzie jest ta opcja bo nie mogę jej znaleźć.
REKLAMA