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)


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


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)


Lesenswert?

Klasse! Das ists. Danke dir! -fcommon

von Yalu X. (yalu) (Moderator)


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)


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)


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.