Forum: Compiler & IDEs build problem; undefined reference to


von icke (Gast)


Angehängte Dateien:

Lesenswert?

hallo, ich benutze AVR-Studio 4.18 build700.

Mit der Zeit hat sich mein Projekt so aufgebläht das ich es mehrmals auf 
kleinere c Module aufteilen musste und Verständniss dafür hätte wenn 
sich das hier keiner reinzieht.

Nach der letzten großen Umstrukturierung meckert AVR beim compilieren 
"undefined reference to" - einer Funktion aus "funktionen.c"
Das Problem liegt also vermutlich in "funktionen.c" oder "funktionen.h"

Die Datei "funktionen.c" selbst findet ihren eigenen Inhalt nich mehr;
default/../funktionen.c:1433: undefined reference to `eine_funktion'

die header dazu "funktionen.h" ist aber überall eingebunden und wurde 
nicht groß verändert. :(
1
#define extern
2
#include "msr_unit01.h"
3
#include "funktionen.h"
4
//usw.
5
#undef extern

wenn ich die header "funktionen.h" aus einem c-modul rausnehme kommt 
zusätzlich zur undefined reference fehlermeldung die warnung;
implicit declaration of funktion `eine_funktion'

was kann denn dafür so alles verantwortlich sein?
hab das projekt auch mal neu angelegt und dabei alle dateien durch 
rechtsklick im projekt baum eingebunden oder neu erstellt. hat aber nix 
geholfen. :(

vor dem kompilieren stell ich lediglich die projekt optionen;
atmega2560
16000000
-0s

von PittyJ (Gast)


Lesenswert?

extern ist doch ein C-Schlüsselwort. Und das wird umdefiniert, bzw 
unbrauchbar gemacht? Das ist für mich schon mal ein falscher Ansatz. Man 
kommt doch wunderbar ohne diese Krücken aus.

von Rolf Magnus (Gast)


Lesenswert?

In Zeile 1433 von funktionen.c kommt keine "eine_funktion" vor. Geht es 
um die Funktion label_value? Dann hätten die beiden Aufrufe davor aber 
auch schon angemeckert werden müssen.

icke schrieb:
> wenn ich die header "funktionen.h" aus einem c-modul rausnehme kommt
> zusätzlich zur undefined reference fehlermeldung die warnung;
> implicit declaration of funktion `eine_funktion'

Für die gleiche Datei oder für andere?
Poste doch bitte mal die echte Fehlermeldung.

von icke (Gast)


Lesenswert?

die meldung kommt insg. 108 immer wegen was in "funktionen.c".

wenn ich die header "funktionen.h" in z.B. "msr_unit01.c" lösche, kommt:
../msr_unit01.c:245: warning: implicit declaration of function 
'label_value'
und;
C:\..\MSR_UNIT01\default/../msr_unit01.c:245: undefined reference to 
`label_value'


mit "funktionen.h" kommt;
C:\..\MSR_UNIT01\default/../msr_unit01.c:245: undefined reference to 
`label_value'


das seltsame ist auch das nur ein paar unterfunktionen aus 
"funktionen.c" bemängelt werden, die restlichen aus der datei gehen 
scheinbar.

C:\..\MSR_UNIT01\default/../msr_unit01.c:245:undefined reference to
`label_value'
color_set
tab_blink_tog
tab_blink

in jeder datei die auf "funktionen.c" zugreift gehen ein paar nich;
C:\..\MSR_UNIT01\default/../buttons.c:905: undefined reference to 
`display_time'
label_value
color_set
display_time
button_text
txt_clr

die verdächtige datei selbst meldet funktionen aus ihr;
C:\..\MSR_UNIT01\default/../funktionen.c:1429: undefined reference to 
`color_set'
label_value
tab_blink


die restlichen funktionen in der datei "funktionen.c" werden auch von 
irgendwo aufgerufen und verursachen keine fehler. grübelgrübel

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

icke schrieb:
> #define extern

Das ist kaputt. Wie schon "PittyJ" anmerkte, ist das ein 
C-Schlüsselwort.

von Kaj (Gast)


Lesenswert?

1
#define extern

Wie zur Hölle kommt man auf sowas? C hat "nur" 32 Schlüsselwörter und 
die sollte man schon kennen...

von Stefan E. (sternst)


Lesenswert?

Zieht euch doch nicht so an dem "#define extern" hoch. Das ist lediglich 
ein Trick, um Deklaration und Definition von Variablen 
"zusammenzufassen". Das kann man vielleicht als schlechten Stil 
abstempeln, ist aber sicher nicht die Ursache für seine Probleme.

von Stefan E. (sternst)


Lesenswert?

icke schrieb:
> die verdächtige datei selbst meldet funktionen aus ihr;
> C:\..\MSR_UNIT01\default/../funktionen.c:1429: undefined reference to
> `color_set'

Kontrolliere die Klammerung. Wenn dir Funktionsdefinitionen in eine 
andere Funktion hinein gerutscht sind, würde genau dieses Symptom 
entstehen.

von Karl H. (kbuchegg)


Lesenswert?

Stefan Ernst schrieb:
> icke schrieb:
>> die verdächtige datei selbst meldet funktionen aus ihr;
>> C:\..\MSR_UNIT01\default/../funktionen.c:1429: undefined reference to
>> `color_set'
>
> Kontrolliere die Klammerung. Wenn dir Funktionsdefinitionen in eine
> andere Funktion hinein gerutscht sind, würde genau dieses Symptom
> entstehen.

exakt.

Und bei der Gelegenheit solltest du mal über dein Einrückschema für { } 
Klammerungen nachdenken. Denn die jetzt in DEINEM Code zu kontrollieren 
ist ein Albtraum.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

in 'taster_tab' ist dir irgendwo eine } verloren gegangen.

Viel Spass beim Suchen. Nach 5 Minuten hab ich aufgehört, das alles mal 
vernünftig und vor allen Dingen konsequent einzurücken.

: Wiederhergestellt durch User
von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz schrieb:
> in 'taster_tab' ist dir irgendwo eine } verloren gegangen.
>
> Viel Spass beim Suchen. Nach 5 Minuten hab ich aufgehört, das alles mal
> vernünftig und vor allen Dingen konsequent einzurücken.

Das alleine wears aber noch nicht.
Da ist noch mehr im Argen.

Mann, dein Einrückschema ist die Hölle.
Aber egal. Irgendwann lernt das jeder, dass saubere, konsequente 
Einrückung kein Selbstzweck ist. Bei genau solchen Gelegenheiten lernt 
man das.

von Karl H. (kbuchegg)


Lesenswert?

Und noch was.
Schalte deinen Editor auf "Replace Tab with Spaces".

von Rolf Magnus (Gast)


Lesenswert?

Die Funktion taster_tab() hat eine schließende Klammer zu wenig. Dafür 
ist am Ende von label_value() eine Klammer zu viel.

von Rolf Magnus (Gast)


Lesenswert?

Karl Heinz schrieb:
> in 'taster_tab' ist dir irgendwo eine } verloren gegangen.
>
> Viel Spass beim Suchen. Nach 5 Minuten hab ich aufgehört, das alles mal
> vernünftig und vor allen Dingen konsequent einzurücken.

Ich hab einfach mal ein
1
indent funktionen.c
eingegeben, und schon war's offensichtlich.

von Karl H. (kbuchegg)


Lesenswert?

Du scheinst switch-cases zu lieben. Je mehr ineinander geschachtelt 
werden, umso besser.
Wenn Funktionen zu lang werden, dann teile sie in Teilfunktionen auf und 
schachtle nicht immer noch mehr switch-cases ineinander!
Auch solltest du dir überlegen, ob du nicht einige switch-cases durch 
Arrays ersetzen kannst. Bei mindestens der Hälfte aller switch-cases 
geht das, was den Code um gut und gerne 30 bis 40% verkürzen und 
vereinfachen würde.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Rolf Magnus schrieb:
> Karl Heinz schrieb:
>> in 'taster_tab' ist dir irgendwo eine } verloren gegangen.
>>
>> Viel Spass beim Suchen. Nach 5 Minuten hab ich aufgehört, das alles mal
>> vernünftig und vor allen Dingen konsequent einzurücken.
>
> Ich hab einfach mal ein
>
1
> indent funktionen.c
2
>
> eingegeben, und schon war's offensichtlich.

Jup.
Hab ich gesehen.
Trotzdem gehört der Code überarbeitet. Das ist ein Kraut und Rüben 
Schema. Ist nur eine Frage der Zeit, bis er sich das nächste mal 
irrtümlich irgendwo was rauslöscht und dann stundenlang danach sucht, wo 
die versehentlich rausgelöschte Klammer eigentlich war.

Wenn ich sowas sehe
1
uint8_t array_zu_sentyp(uint8_t flag, uint8_t typ, uint8_t num)
2
  { // 0,1=pH 2,3=EC 4-11=SHT 12-19=BodenF 20-23=Füllst 24-27=Licht 28-35=Kontakte
3
    // 36-51=Relais 52-55=DosProgr. 56-64=DosPump. 65-68=Magn.Ventile
4
    
5
  if  (flag <2)
6
      { // SensorTyp oder SensorNum aus ArrayZiffer(num) zurückgeben  
7
        if  ( num < 2)
8
            { if  (flag) {return num;}else{return 3;}} // pH
9
        else{ if  ( num < 4)
10
                  { if  (flag) {return num -2;}else{return 4;}} // EC
11
                else{ if  ( num < 8)
12
                      { if  (flag) {return num -4;}else{return 5;}} // SHT Temp
13
                else{ if  ( num < 12)
14
                        { if  (flag) {return num -8;}else{return 6;}} // SHT Feuchte
15
                            else{ if  ( num < 20)
16
                            { if  (flag) {return num -12;}else{return 7;}} // BodenFeuchte
17
                                  else{ if  ( num < 24)
18
                              { if  (flag) {return num -20;}else{return 8;}} // Füllstand
19
                                        else{ if  ( num < 28)
20
                                  { if  (flag) {return num -24;}else{return 9;}} // Licht
21
                                              else{ if  ( num < 36)
22
                                    { if  (flag) {return num -28;}else{return 10;}} // Kontakte
23
                              else{ if  ( num < 52)
24
                                        { if  (flag) {return num -36;}else{return 11;}} // Relais
25
                                                          else{ if  ( num < 56)
26
                                          { if  (flag) {return num -52;}else{return 12;}} // B-Programm
27
                                                                else{ if  ( num <65)
28
                                              { if  (flag) {return num -56;}else{return 13;}} // Dos.Pumpe
29
                                                                      else{ if  (flag) {return num -65;}else{return 14;}} // Mag.Ventil
30
                                                                    }
31
                                                              }
32
                                                        }
33
                                                  }
34
                      }
35
                                      }
36
                                }
37
                          }
38
                    }
39
              }
40
        }
geht mir die Hutschnur hoch (selbst wenns im AVR-Studio bei 4-Space Tabs 
ein wenig besser aussieht)

: Bearbeitet durch User
von icke (Gast)


Lesenswert?

ja, und etwas später nochn klammer fehler.~ätznd die formatierung ja.
hab dann mal eben "schnell"-.- den code nach klammer fehlern durchsucht 
und bin zweimal fündig geworden. jetrzt lässt es sich mit 0 fehlern 
compilieren.

freu! dank an alle

von icke (Gast)


Lesenswert?

@karlheinz; hut ab, das sind alles sehr brauchbare ratschläge.

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.