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

Błąd kompilacji make: *** [pubny.elf] Error 1 po dodaniu nowych bibliotek

Egzi 07 Lis 2007 14:35 4760 8
REKLAMA
  • #1 4455353
    Egzi
    Poziom 14  
    Posty: 145
    Pomógł: 2
    Ocena: 13
    do tej pory nic mi to nie przeszkadzalo ale ostatnio dodalem nowe biblioteki zgodnie z:

    http://winavr.scienceprog.com/avr-gcc-tutoria...f--function-for-float-numbers-in-avr-gcc.html

    i teraz ten blad stal sie istotny. Nie tworzy mi sie plik *.elf co w konsekwencji uniemozliwia mi skompilowanie programu z uzyciem tych bibliotek.

    Obszukalem forum jak potrafilem i nie moge nic znalezc.
  • REKLAMA
  • #2 4455476
    szelus
    Poziom 34  
    Posty: 1508
    Pomógł: 315
    Ocena: 53
    A może byś wrzucił komplet komunikatów o błędach, albo i makefile-a? Bo ten komunikat oznacza tylko, że budowanie target-a pubny.elf nie powiodło się. Dokładniejsze informacje zawierają poprzednie komunikaty.
  • #3 4455856
    Egzi
    Poziom 14  
    Posty: 145
    Pomógł: 2
    Ocena: 13
    Build started 7.11.2007 at 14:19:44
    avr-gcc.exe -mmcu=atmega8 -Wl,-u,vfprintf -Wl,-Map=pubny.map pubny.o -lm -lprintf_flt -o pubny.elf
    c:/winavr-20070525/bin/../lib/gcc/avr/4.1.2/../../../../avr/lib/avr4\libc.a(fixsfsi.o): In function `__fixunssfsi':
    (.text.fplib+0x0): multiple definition of `__fixsfsi'
    c:/winavr-20070525/bin/../lib/gcc/avr/4.1.2/avr4\libgcc.a(_sf_to_si.o):(.text+0x0): first defined here
    make: *** [pubny.elf] Error 1
    Build succeeded with 0 Warnings...

    ---------------------------------


    ###############################################################################
    # Makefile for the project pubny
    ###############################################################################

    ## General Flags
    PROJECT = pubny
    MCU = atmega8
    TARGET = pubny.elf
    CC = avr-gcc.exe

    ## 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 -DF_CPU=1000000UL -O0 -fsigned-char
    CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d

    ## Assembly specific flags
    ASMFLAGS = $(COMMON)
    ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2

    ## Linker flags
    LDFLAGS = $(COMMON)
    LDFLAGS += -Wl,-u,vfprintf -Wl,-Map=pubny.map


    ## Intel Hex file production flags
    HEX_FLASH_FLAGS = -R .eeprom

    HEX_EEPROM_FLAGS = -j .eeprom
    HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load"
    HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0


    ## Libraries
    LIBS = -lm -lprintf_flt

    ## Objects that must be built in order to link
    OBJECTS = pubny.o

    ## Objects explicitly added by the user
    LINKONLYOBJECTS =

    ## Build
    all: $(TARGET) pubny.hex pubny.eep pubny.lss size

    ## Compile
    pubny.o: ../pubny.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 $< $@

    %.lss: $(TARGET)
    avr-objdump -h -S $< > $@

    size: ${TARGET}
    @Echo.
    @AVR-size -C --mcu=${MCU} ${TARGET}

    ## Clean target
    .PHONY: clean
    clean:
    -rm -rf $(OBJECTS) pubny.elf dep/* pubny.hex pubny.eep pubny.lss pubny.map


    ## Other dependencies
    -include $(shell mkdir dep 2>/dev/null) $(wildcard dep/*)




    ----------------------------------------
    Moje wersje oprogramowania to:
    AVR Studio 4.12
    WinAVR-20070525
  • REKLAMA
  • REKLAMA
  • #5 4457494
    Egzi
    Poziom 14  
    Posty: 145
    Pomógł: 2
    Ocena: 13
    nie bardzo wiem jak wykasowac jeden element tylko bo makefile sam sie generuje za kazdym razem zgodnie z ustawieniami w avrstudio. link jaki podalem na poczatku nakazywal dodanie w project/options/custom/linker options/"-Wl,-u,vfprintf"
    i jak z tego zapisku wykasuje -Wl to kompilacja przebiega ale program zamiast wyswietlac liczbe wyswietla "?" czyli to co te ustawienia maja zmienic pozostaje niezmienione. Poza tym i tak wyswietla sie to co w tytule postu napisalem. Tak naprawde to ja nie wiem czy to jest blad bo nie jest oznaczone czerwona kropka
    dodam jeszcze ze jak zrobie wszystko tak jak w opisie to mam takie cos w zakladce MESSAGE

    gcc plug-in: Error: Object file not found on expected location C:\Documents and Settings\krzycho\Moje dokumenty\AVR\pubny\default\pubny.elf


    po wykasowaniu -Wl makefile wyglada tak:

    ###############################################################################
    # Makefile for the project pubny
    ###############################################################################

    ## General Flags
    PROJECT = pubny
    MCU = atmega8
    TARGET = pubny.elf
    CC = avr-gcc.exe

    ## 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 -DF_CPU=1000000UL -O0 -fsigned-char
    CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d

    ## Assembly specific flags
    ASMFLAGS = $(COMMON)
    ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2

    ## Linker flags
    LDFLAGS = $(COMMON)
    LDFLAGS += -u,vfprintf


    ## Intel Hex file production flags
    HEX_FLASH_FLAGS = -R .eeprom

    HEX_EEPROM_FLAGS = -j .eeprom
    HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load"
    HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0


    ## Libraries
    LIBS = -lm -lprintf_flt

    ## Objects that must be built in order to link
    OBJECTS = pubny.o

    ## Objects explicitly added by the user
    LINKONLYOBJECTS =

    ## Build
    all: $(TARGET) pubny.hex pubny.eep size

    ## Compile
    pubny.o: ../pubny.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 $< $@

    %.lss: $(TARGET)
    avr-objdump -h -S $< > $@

    size: ${TARGET}
    @Echo.
    @AVR-size -C --mcu=${MCU} ${TARGET}

    ## Clean target
    .PHONY: clean
    clean:
    -rm -rf $(OBJECTS) pubny.elf dep/* pubny.hex pubny.eep

    ## Other dependencies
    -include $(shell mkdir dep 2>/dev/null) $(wildcard dep/*)

    -----------------------------------------

    dostaje takie komunikaty w zakladce:


    rm -rf pubny.o pubny.elf dep/* pubny.hex pubny.eep
    Build succeeded with 0 Warnings...
    avr-gcc.exe -mmcu=atmega8 -Wall -gdwarf-2 -DF_CPU=1000000UL -O0 -fsigned-char -MD -MP -MT pubny.o -MF dep/pubny.o.d -c ../pubny.c
    avr-gcc.exe -mmcu=atmega8 -u,vfprintf pubny.o -lm -lprintf_flt -o pubny.elf
    avr-objcopy -O ihex -R .eeprom pubny.elf pubny.hex
    avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex pubny.elf pubny.eep
    c:\WinAVR-20070525\bin\avr-objcopy.exe: there are no sections to be copied!
    c:\WinAVR-20070525\bin\avr-objcopy.exe: --change-section-lma .eeprom=0x00000000 never used
    make: *** [pubny.eep] Error 1
    Build succeeded with 0 Warnings...
  • REKLAMA
  • Pomocny post
    #6 4457911
    fantom
    Poziom 31  
    Posty: 1649
    Pomógł: 108
    Ocena: 41
    Nie miales wykasowywac wszystkich -Wl tylko drugi a jego opcje dodac do pierwszego wywolania.To sa opcje ktore przekazuje sie do linkera a w chwili obecnej nie przekazujesz do linkera zadnych opcji.Bledy zwiazane z eepromem moga wynikac z tego ze go nie uzwyasz i w elfie nie ma sekcji .eeprom ktora mozna by z niego wyciagnac.Generalnie czytaj uwazniej posty a bedzie mial mniej problemow.Bledy moga nie byc na czerwono bo nie sa to bledy kompilatora tylko linkera.
  • #7 4457978
    Egzi
    Poziom 14  
    Posty: 145
    Pomógł: 2
    Ocena: 13
    Czytam uwaznie i napisalem jaki mam z tym problem opcje do linkera podaje w AVRStudio w opcjach projektu i jak dodalem tam "-Wl,-u,vfprintf" to automatycznie w makefile'u pojawilo mi się to co podalem w drugim poście czyli 2x"-Wl" a jak dalem w ustawieniach "-u,vfprintf" to zniknely oba "-Wl" z makefile'a tak jak w trzecim moim poscie.
    To musial być jakis blad programu bo jak wrocilem do pierwszysch ustawien to bylo juz tylko:

    ## Linker flags
    LDFLAGS = $(COMMON)
    LDFLAGS += -Wl,-u,vfprintf


    Przy okazji doszedlem co powoduje blad. Dodajac biblioteki w opcjach dodalem najpierw libm.a a potem libprintf_flt.a. Jak odwrocilem kolejnosc to kompilacja przebiegla bez bledow. Bez sensu :!:

    Dzieki za posiecony czas.
  • #8 4458043
    szelus
    Poziom 34  
    Posty: 1508
    Pomógł: 315
    Ocena: 53
    Egzi napisał:

    Bez sensu :!:


    Pozornie. Kolejność dołączania bibliotek ma istotne znaczenie - linker przegląda biblioteki w podanej kolejności i (normalnie) tylko raz. Pozwala to na np. dołączanie do programu własnych wersji funkcji występujących w bibliotekach standardowych, wariantową implementacje bibliotek i tym podobne sztuczki.
    Dlatego zazwyczaj biblioteki dołącza się w kolejności, od najbardziej specjalizowanych, do najbardziej ogólnych (podstawowych). Czasami zdarza się, że trzeba też podać bibliotekę więcej niż raz (jeżeli biblioteki korzystaja z siebie nawzajem, ale takich konstrukcji należy raczej unikać).

    W tym konkretnym przypadku wygląda na to, że biblioteka libprinntf_flt implementuje po swojemu jakieś funkcje występujące też w libm - prawdopodobnie w celu zaoszczędzenia miejsca (spekuluję, nigdy w to nie wnikałem), albo ze względów "historycznych" :wink:. Dlatego dołączenie najpierw libm spowodowało wciągnięcie do programu najpierw funkcji z libm i ostatecznie konflikt.

    Uff... To była długa dygresja. :wink:
  • #9 4458074
    fantom
    Poziom 31  
    Posty: 1649
    Pomógł: 108
    Ocena: 41
    To raczej roznica w dolaczaniu domyslnych bibliotek libc i libgcc (patrz pierwszy post). libgcc powinna byc dolaczana na samiutkim koncu a widocznie przy takiej konfiguracji bibliotek pomocniczych ten proces jest zaklocony, po zamianie wszystko jest ok.Istotnie kolejnosc zalaczanych bibliotek mimo wszystko ma pewne znaczenie.

Podsumowanie tematu

✨ Problem dotyczył błędu kompilacji make: *** [pubny.elf] Error 1 po dodaniu nowych bibliotek do projektu AVR w AVRStudio, zgodnie z instrukcjami z tutoriala dotyczącego funkcji sprintf dla liczb zmiennoprzecinkowych. Komunikat błędu wskazywał na konflikt wielokrotnej definicji symbolu __fixsfsi pomiędzy bibliotekami libc.a i libgcc.a. Przyczyną problemu była nieprawidłowa kolejność dołączania bibliotek libm.a i libprintf_flt.a w opcjach linkera, co powodowało konflikt symboli podczas linkowania. Dodatkowo, błędna składnia opcji linkera z wielokrotnym użyciem -Wl powodowała, że tylko ostatnia opcja była brana pod uwagę, co uniemożliwiało poprawne przekazanie parametrów do linkera. Rozwiązaniem było poprawne połączenie opcji linkera w jednym wywołaniu -Wl oraz zmiana kolejności dołączania bibliotek, tak aby libprintf_flt.a była dołączona przed libm.a. Kolejność dołączania bibliotek ma istotne znaczenie, ponieważ linker przegląda je sekwencyjnie i bierze symbole tylko raz, co może powodować konflikty, jeśli biblioteki zawierają te same funkcje. Po tych zmianach kompilacja przebiegła bez błędów, a program poprawnie wyświetlał liczby zmiennoprzecinkowe.
Wygenerowane przez model językowy.
REKLAMA