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


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.

: Gesperrt durch Moderator
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

Beitrag #7410635 wurde von einem Moderator gelöscht.
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.