Forum: Mikrocontroller und Digitale Elektronik avr gcc update von 9.3.0-1 => 10.1.0.1 Linker Error


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Klemmen (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

erst einmal die Info: Nutze ich avr-gcc-9.3.0-1 wird alles korrekt 
gebaut dh. am Code liegt es nicht. (oder doch? :))

Seit dem Update von avr-gcc gibt mir mein Linker immer die Fehlermeldung

/usr/bin/avr-ld: obj/Release/_gemeinsam/AT42QT2160.o:(.bss+0x29): 
multiple definition of `rx_data'; 
obj/Release/_gemeinsam/AMG88.o:(.bss+0x11): first defined here

Diese Meldung kommt für diverse Variablen. Ich habe es nicht geprüft, 
aber ich denke für alle vorhandenen Variablen.

Ich nutze Code Bocks unter Arch Linux
Linker Optionen:
-Wl,-Map=$(TARGET_OUTPUT_DIR)$(TARGET_OUTPUT_BASENAME).map,--cref

avr-gcc-10.1.0-1
gcc-10.1.0-2
gcc-libs-10.1.0-2

Freue mich über jegliche Hinweise oder Bug Reports die ich nicht finde, 
leider.

von Μαtthias W. (matthias) Benutzerseite


Bewertung
1 lesenswert
nicht lesenswert
Hi

Globale Variablen im Header definiert?

GCC now defaults to -fno-common. As a result, global variable accesses 
are more efficient on various targets. In C, global variables with 
multiple tentative definitions now result in linker errors. With 
-fcommon such definitions are silently merged during linking.

Matthias

Beitrag #6285142 wurde vom Autor gelöscht.
von Klemmen (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Klasse! Das ists. Danke dir! -fcommon

von Yalu X. (yalu) (Moderator)


Bewertung
4 lesenswert
nicht lesenswert
Klemmen schrieb:
> -fcommon

-fcommon ist nur der Work-Around. Besser wäre es, die doppelte
definition von rx_data zu vermeiden.

von Klemmen (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Yalu X. schrieb:
> -fcommon ist nur der Work-Around. Besser wäre es, die doppelte
> definition von rx_data zu vermeiden.

Ist mir bewusst, aber um gestern weiter zu kommen wars für mich wichtig 
erstmal so zu leben... :)


Aber wie löse ich das korrekt?
Am Beispiel von rx_data:

Diese ist in can.h definiert:
volatile uint8_t rx_data[8];

Und wird verwendet in
can.c
main.c
AMG88.c
AT42QT2160.c

sprich ich includiere can.h in
main.h
AMG88.h
AT42QT2160.h

Wie würde ich das korrekt machen?

von xyz (Gast)


Bewertung
1 lesenswert
nicht lesenswert
In der can.h als extern deklarieren und in der can.c einmal anlegen

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.