Forum: Compiler & IDEs GCC multible definitions of.


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 Johann (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Such mal in deinem C/C++- Buch nach "extern".

Oliver

von Yalu X. (yalu) (Moderator)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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.

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.