Forum: Compiler & IDEs GCC multible definitions of.


von Johann (Gast)


Lesenswert?

Morgen!

Mein GCC bringt mich gleich zur Weißglut! :(

Ich habe in der stm32f3xx_it.c eine Interruptroutine. Jetzt wollte ich 
aber nicht alles in dieser Funktion abarbeiten, sondern einfach nur eine 
Flag setzen (trigger_timer17 = 1). Da kam dann das Problem auf, dass er 
an dieser Stelle die in der main.c deklarierte Variable nicht finden 
kann. Wo muss diese hin? Momentan habe ich Sie in der main.h und der 
Compiler liefert mir dann folgendes...
1
Invoking: MCU GCC Linker
2
arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -specs=nosys.specs -specs=nano.specs -T"../STM32F334K8Tx_FLASH.ld" -Wl,-Map=output.map -Wl,--gc-sections -o "M_BeSy_2_100.elf" @"objects.list"   -lm
3
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_adc.o:(.bss+0x0): multiple definition of `trigger_timer17'
4
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o:(.bss+0x0): first defined here
5
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_adc_ex.o:(.bss+0x0): multiple definition of `trigger_timer17'
6
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o:(.bss+0x0): first defined here
7
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o:(.bss+0x0): multiple definition of `trigger_timer17'
8
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o:(.bss+0x0): first defined here
9
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dac.o:(.bss+0x0): multiple definition of `trigger_timer17'
10
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o:(.bss+0x0): first defined here
11
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dac_ex.o:(.bss+0x0): multiple definition of `trigger_timer17'
12
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o:(.bss+0x0): first defined here
13
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o:(.bss+0x0): multiple definition of `trigger_timer17'
14
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o:(.bss+0x0): first defined here
15
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o:(.bss+0x0): multiple definition of `trigger_timer17'
16
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o:(.bss+0x0): first defined here
17
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o:(.bss+0x0): multiple definition of `trigger_timer17'
18
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o:(.bss+0x0): first defined here
19
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o:(.bss+0x0): multiple definition of `trigger_timer17'
20
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o:(.bss+0x0): first defined here
21
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o:(.bss+0x0): multiple definition of `trigger_timer17'
22
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o:(.bss+0x0): first defined here
23
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o:(.bss+0x0): multiple definition of `trigger_timer17'
24
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o:(.bss+0x0): first defined here
25
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o:(.bss+0x0): multiple definition of `trigger_timer17'
26
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o:(.bss+0x0): first defined here
27
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o:(.bss+0x0): multiple definition of `trigger_timer17'
28
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o:(.bss+0x0): first defined here
29
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o:(.bss+0x0): multiple definition of `trigger_timer17'
30
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o:(.bss+0x0): first defined here
31
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o:(.bss+0x0): multiple definition of `trigger_timer17'
32
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o:(.bss+0x0): first defined here
33
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o:(.bss+0x0): multiple definition of `trigger_timer17'
34
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o:(.bss+0x0): first defined here
35
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o:(.bss+0x0): multiple definition of `trigger_timer17'
36
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o:(.bss+0x0): first defined here
37
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o:(.bss+0x0): multiple definition of `trigger_timer17'
38
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o:(.bss+0x0): first defined here
39
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o:(.bss+0x0): multiple definition of `trigger_timer17'
40
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o:(.bss+0x0): first defined here
41
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_uart.o:(.bss+0x0): multiple definition of `trigger_timer17'
42
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o:(.bss+0x0): first defined here
43
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_uart_ex.o:(.bss+0x0): multiple definition of `trigger_timer17'
44
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o:(.bss+0x0): first defined here
45
Src/main.o:(.bss+0x0): multiple definition of `trigger_timer17'
46
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o:(.bss+0x0): first defined here
47
Src/stm32f3xx_hal_msp.o:(.bss+0x4): multiple definition of `trigger_timer17'
48
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o:(.bss+0x0): first defined here
49
Src/stm32f3xx_it.o:(.bss+0x0): multiple definition of `trigger_timer17'
50
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o:(.bss+0x0): first defined here
51
Src/system_stm32f3xx.o:(.bss+0x0): multiple definition of `trigger_timer17'
52
Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o:(.bss+0x0): first defined here
53
collect2.exe: error: ld returned 1 exit status
54
make: *** [M_BeSy_2_100.elf] Error 1

packe ich sie in die stm32f3xx_it.h, findet er sie nicht in der main.c.
Das Projekt ist übrigens jungfräulich mit CubeMX erstellt worden und die 
Variable wird als volatile deklariert (falls das was damit zu tun haben 
könnte).

von Oliver S. (oliverso)


Lesenswert?

Such mal in deinem C/C++- Buch nach "extern".

Oliver

von Yalu X. (yalu) (Moderator)


Lesenswert?

Die Definition also bspw.
1
int trigger_timer17;

kommt in main.c, eine zusätzliche Extern-Deklaration (damit andere
Programmmodule die Variable finden können) in main.h:

1
extern int trigger_timer17;

Definitionen, d.h. Deklarationen, die gleichzeitig Speicher für
irgendetwas reservieren, kommen normalerweise in .c-Dateien. .h-Dateien
hingegen enthalten normalerweise nur reine Deklarationen.

Da bei dir die Variablendefinition in main.h steht und diese Datei von
mehreren Programmmodulen eingebunden wird, legt der Compiler mehrere
Variablen desselben Names an, was der Linker anmeckert.

von Johann (Gast)


Lesenswert?

@Yalu, ja so wird es wohl aussehen.

ok, ich definiere die variable jetzt in der main.c und in der 
stm32f3xx_it.h deklariere ich sie noch mal mit extern. klappt wunderbar. 
danke soweit! wirklich was dazu gelernt...

kann es sein, dass atmel studio sowas eigenständig erledigt hat? bis 
heute bin ich nicht einmal über so ein problem gestolpert und das 
wundert mich jetzt doch sehr.

von Stefan E. (sternst)


Lesenswert?

Johann schrieb:
> kann es sein, dass atmel studio sowas eigenständig erledigt hat? bis
> heute bin ich nicht einmal über so ein problem gestolpert und das
> wundert mich jetzt doch sehr.

Nein, aber Atmel-Studio compiliert per Default ohne -fno-common. Deine 
jetzige Entwicklungsumgebung compiliert offenbar mit -fno-common. Komme 
jetzt aber nicht auf die Idee danach zu suchen, wo du es 
abschalten/entfernen kannst. Es ist gut so, wie es ist. Suche lieber 
danach, wo du es beim Atmel-Studio einschalten/hinzufügen kannst.

von Georg A. (georga)


Lesenswert?

Eigentlich braucht man bei sowas noch "volatile". Sonst kann es sein, 
dass im main der Wert scheinbar gar nicht verändert wird, weil er in 
einem Register gecached wird und der gcc nicht weiss, dass die 
Veränderung ausserhalb seines Scopes passiert.

Edit: Habs im Originalpost überlesen, dass es schon volatile ist. In den 
Beispielen von Yalu fehlts aber.

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Georg A. schrieb:
> Eigentlich braucht man bei sowas noch "volatile".

Nur im Zusammenhang mit Interrupthandlern. Sonst nicht, da weiß der 
Compiler selbst, was er macht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.