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

[Rozwiązano] {ATMEGA328P} Program nie kompiluję się mimo wielu prób.

krycha1764 01 Cze 2020 13:36 909 8
REKLAMA
  • #1 18732090
    krycha1764
    Poziom 8  
    Posty: 9
    Pomógł: 1
    Ocena: 4
    Dzień dobry.
    Jest to mój pierwszy temat na forum więc proszę o odrobinę wyrozumiałości. Ostatnio postanowiłem nauczyć się programować mikrokontrolery avr i w końcu postanowiłem podłączyć wyświetlacz LCD 16x2 z dołączonym ekspanderem PCF8574 (tylko taki miałem pod ręką). W internecie znalazłem program jednak nie chcę mi się on skompilować mimo wielu prób, wszystko kompiluję przy pomocy pliku makefile. Mikrokontroler to ATmega328p a system operacyjny to Linux ubuntu 20.04.
    Po wpisaniu w terminalu "make all" otrzymuję taki efekt:
    avr-gcc -Wall -Os -DF_CPU=16000000 -mmcu=atmega328p  -I./ -c twi.c -o twi.o
    avr-gcc -Wall -Os -DF_CPU=16000000 -mmcu=atmega328p  -I./ -c lcdvtwi.c -o lcdvtwi.o
    avr-gcc -Wall -Os -DF_CPU=16000000 -mmcu=atmega328p  -I./  -c main.cpp -o main.o
    In file included from lcdvtwi.c:1:0,
                     from main.cpp:5:
    lcdvtwi.h:66:6: error: redefinition of ‘char lcdvtwi_status’
     char lcdvtwi_status;
          ^
    In file included from main.cpp:4:0:
    lcdvtwi.h:66:6: note: ‘char lcdvtwi_status’ previously declared here
     char lcdvtwi_status;
          ^
    In file included from main.cpp:5:0:
    lcdvtwi.c:3:6: error: redefinition of ‘char lcdvtwi_status’
     char lcdvtwi_status;
          ^
    In file included from main.cpp:4:0:
    lcdvtwi.h:66:6: note: ‘char lcdvtwi_status’ previously declared here
     char lcdvtwi_status;
          ^
    main.cpp: In function ‘int main()’:
    main.cpp:13:24: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
       lcdvtwi_write_text("");
                            ^
    make: *** [makefile:96: main.o] Błąd 1


    Niestety nie mam pomysłu jak to naprawić.
    Aby nie było problemów dołączam wszystkie pliki programu
    progra..zip (4.41 kB)Musisz być zalogowany, aby pobrać ten załącznik.
    Z góry dziękuję za wszelką pomoc.
  • REKLAMA
  • Pomocny post
    #2 18732134
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 18732185
    krycha1764
    Poziom 8  
    Posty: 9
    Pomógł: 1
    Ocena: 4
    khoam napisał:
    W obu plikach nagłówkowych, lcdvtwi.h oraz twi.h brak jest "zabezpieczenia" przed ich dołączaniem więcej niż jeden raz.
    Jak to należy zrobić, jest opisane np. tutaj:
    https://pl.wikipedia.org/wiki/Plik_nag%C5%82%C3%B3wkowy


    Dziękuję za przydatną poradę. Jeśli dobrze zrozumiałem takie "zabezpieczenie" powinno wyglądać mniej więcej tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Po wpisaniu tych "zabezpieczeń" dla każdego pliku ilość błędów się zmniejszyła jednak niestety nadal występują:
    avr-gcc -Wall -Os -DF_CPU=16000000 -mmcu=atmega328p  -I./ -c twi.c -o twi.o
    avr-gcc -Wall -Os -DF_CPU=16000000 -mmcu=atmega328p  -I./ -c lcdvtwi.c -o lcdvtwi.o
    avr-gcc -Wall -Os -DF_CPU=16000000 -mmcu=atmega328p  -I./  -c main.cpp -o main.o
    In file included from main.cpp:19:0:
    lcdvtwi.c:6:6: error: redefinition of ‘char lcdvtwi_status’
     char lcdvtwi_status;
          ^
    In file included from main.cpp:14:0:
    lcdvtwi.h:69:6: note: ‘char lcdvtwi_status’ previously declared here
     char lcdvtwi_status;
          ^
    main.cpp: In function ‘int main()’:
    main.cpp:28:24: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
       lcdvtwi_write_text("");
                            ^
    make: *** [makefile:96: main.o] Błąd 1
  • #4 18732203
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #5 18732232
    amgam
    Poziom 1  
    Posty: 1
    @khoam niestety to nie jest to.

    @krycha1764
    1. Nie includuj plików .c

    Cytat:
    #include "twi.h"
    #include "twi.c" <-żle
    #include "lcdvtwi.h"
    #include "lcdvtwi.c" <- źle


    2. Nie definiuj danych w plikach .h

    w Twoim przypadku w pliku lcdvtwi.h musisz zmienić

    Cytat:
    char lcdvtwi_status;
    na
    Cytat:
    extern char lcdvtwi_status;


    a swoją daną definiujesz w pliku .c

    Aby otrzymać program musisz skompilować wszystkie pliki .c należace do projektu a następnie otrzymane pliki obiektowe zlinkować ze sobą (+biblioteki)

    PS przy okazji Twój main.cpp powinien się nazywać main.c jako że nie ma on nic wspólnego z C++
  • REKLAMA
  • #6 18732277
    krycha1764
    Poziom 8  
    Posty: 9
    Pomógł: 1
    Ocena: 4
    amgam napisał:

    1. Nie includuj plików .c

    Cytat:
    #include "twi.h"
    #include "twi.c" <-żle
    #include "lcdvtwi.h"
    #include "lcdvtwi.c" <- źle



    Spodziewałem się że może to nie być poprawna konstrukcja jednak bez tego mam taki wynik (poprawki wymienione przez Pana w punkcie 2 dodane):
    avr-gcc -Wall -Os -DF_CPU=16000000 -mmcu=atmega328p  -I./ -o main.elf  .//twi.o .//lcdvtwi.o main.o .//main.o
    .//main.o: In function `main':
    main.cpp:(.text.startup+0x0): multiple definition of `main'
    main.o:main.cpp:(.text.startup+0x0): first defined here
    main.o: In function `main':
    main.cpp:(.text.startup+0x0): undefined reference to `twi_init()'
    main.cpp:(.text.startup+0x4): undefined reference to `lcdvtwi_init()'
    main.cpp:(.text.startup+0x8): undefined reference to `lcdvtwi_led_on()'
    main.cpp:(.text.startup+0x10): undefined reference to `lcdvtwi_set_cursor(char, char)'
    main.cpp:(.text.startup+0x18): undefined reference to `lcdvtwi_write_text(char*)'
    .//main.o: In function `main':
    main.cpp:(.text.startup+0x0): undefined reference to `twi_init()'
    main.cpp:(.text.startup+0x4): undefined reference to `lcdvtwi_init()'
    main.cpp:(.text.startup+0x8): undefined reference to `lcdvtwi_led_on()'
    main.cpp:(.text.startup+0x10): undefined reference to `lcdvtwi_set_cursor(char, char)'
    main.cpp:(.text.startup+0x18): undefined reference to `lcdvtwi_write_text(char*)'
    collect2: error: ld returned 1 exit status
    make: *** [makefile:100: main.elf] Błąd 1
  • Pomocny post
    #7 18732381
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #8 18732430
    dasej
    Poziom 32  
    Posty: 1905
    Pomógł: 165
    Ocena: 265
    Witam.

    Pliki kompilują się poprawnie.
    Załączniki:
    • kompiluje.zip (22.87 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #9 18734161
    krycha1764
    Poziom 8  
    Posty: 9
    Pomógł: 1
    Ocena: 4
    Dziękuję wszystkim za pomoc, problem rozwiązany. Temat zamykam

Podsumowanie tematu

✨ Użytkownik napotkał problemy z kompilacją programu dla mikrokontrolera ATmega328P, używając systemu Linux Ubuntu 20.04 oraz pliku makefile. Problemy wynikały z wielokrotnego dołączania plików nagłówkowych, co prowadziło do redefinicji zmiennych. Użytkownik został poinstruowany, aby dodać zabezpieczenia w plikach nagłówkowych oraz unikać dołączania plików .c w innych plikach. Po wprowadzeniu poprawek, w tym zmianie nazwy pliku main.cpp na main.c, kompilacja zakończyła się sukcesem, a kod źródłowy został poprawnie skompilowany.
Wygenerowane przez model językowy.
REKLAMA