Forum: Compiler & IDEs C- Problem -> undefined reference


von xxx (Gast)


Lesenswert?

Hallo,

ich habe folgendes Problem bein Compilieren!
beim Aufruf der Funktion uip_udp_new bekomm ich folgend meldung:

undefined reference uip_udp_new

obwohl die funktion sowohl deklariert als auch definiert ist!

uip_udp_new ist eine Funktion wie folgt:
struct uip_udp_conn * uip_udp_new(uip_ipaddr_t *ripaddr, u16_t rport);

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

xxx wrote:

> obwohl die funktion sowohl deklariert als auch definiert ist!

Aber offenbar eben nicht mit gelinkt.

von Johannes M. (johnny-m)


Lesenswert?

Und wo ist diese Funktion deklariert/definiert? Und wie sieht das 
Programm an sich aus?

von xxx (Gast)


Lesenswert?

Die Funktion ist in uip.c definiert und in uip.h deklariert.
In den beiden Files (uip.c und uip.h) sind mehrere Funktion
implementiert, die ich auch benütze drin!
bei den anderen gibt es jedoch keine Probleme!

so sieht diese aus:
1
struct uip_udp_conn * uip_udp_new(uip_ipaddr_t *ripaddr, u16_t rport)
2
{
3
   register struct uip_udp_conn *conn;
4
// Find an unused local port. 
5
again:
6
   ++lastport;
7
   if(lastport >= 32000) {
8
      lastport = 4096;
9
   }
10
  
11
   for(c = 0; c < UIP_UDP_CONNS; ++c) {
12
      if(uip_udp_conns[c].lport == htons(lastport)) {
13
         goto again;
14
      }
15
   }
16
17
   conn = 0;
18
   for(c = 0; c < UIP_UDP_CONNS; ++c) {
19
      if(uip_udp_conns[c].lport == 0) {
20
         conn = &uip_udp_conns[c];
21
         break;
22
      }
23
   }
24
   if(conn == 0) {
25
      return 0;
26
   }
27
  
28
   conn->lport = HTONS(lastport);
29
   conn->rport = rport;
30
   if(ripaddr == NULL) {
31
      memset(conn->ripaddr, 0, sizeof(uip_ipaddr_t));
32
   } else {
33
      uip_ipaddr_copy(&conn->ripaddr, ripaddr);
34
   }
35
   conn->ttl = UIP_TTL;
36
   return conn;
37
}

von Karl H. (kbuchegg)


Lesenswert?

Wie Jörg schon sagte:
Du musst das File uip.c auch compilieren und zum
Programm dazulinken!

"undefined Referenz" ist eine typische Linker-Fehlermeldung
und keine vom Compiler.

von xxx (Gast)


Lesenswert?

ich denke es ist gelinkt da ja die anderen funktionen die sich
in den files (uip.c und uip.h) befinden ohne probleme laufen!
oder nicht?

kann es auch an was anderem liegen?

von Karl H. (kbuchegg)


Lesenswert?

xxx wrote:

> kann es auch an was anderem liegen?

Überprüf mal Gross/Kleinschreibung, Unterstriche

Wenn der Linker meldet, dass er die Funktion nicht findet,
dann ist sie auch wirklich nicht da.

Einfache Vorgehensweise:
Geh an eine Codestelle, hol dir den Funktionsnamen in
den Cut&Paste Buffer und setzte ihn von dort wieder
an den anderen Stellen ein. Dadurch ist sichergestellt,
dass die Schreibweise überall übereinstimmt.

Beim nächsten compilieren achte darauf, ob auch wirklich
alle betroffenen Files neu compiliert werden.

von xxx (Gast)


Lesenswert?

es sind im ganzen Programm drei Stellen.
einmal in dem uip.h file
einmal in dem uip.c file
und einmal in der Aufruf in der main!
so weit scheint alles richtig zu sein, fehler in
groß- und kleinschreibung gibt es nicht!
es werden auch alle files compiliert.

den gleichen fehler hab ich weitere 2 mal bei denen
in der fehlermeldung auf eine Zeilenummer im Programm
verwiesen wird in der nichts drin steht!

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Wird die angegebene Quelltextstelle auch übersetzt?

Nicht dass diese Stelle vor lauter #if #endif Basteleien und 
entsprechenden #define quasi auskommentiert ist.

Beim GCC kannst du das im LSS-File prüfen und z.B. durch eine
#warning "uip_udp_new wird übersetzt!" Meldung im Anweisungsblock der 
der Funktionsdefinition.

Ansonsten mach mal ein make clean, um alle Zwischendateien zu löschen.

von xxx (Gast)


Lesenswert?

es sind zwar #if anweisungen und entsprechende #defines vorhanden,
doch selbst ohne diese kommt die gleiche fehlermeldung!

ich benütze nich den GCC sondern Rowley mit Crossworks!

von Karl H. (kbuchegg)


Lesenswert?

Wie du an der Still sicher schon bemerkt hast, ist jetzt
der Zeitpunkt gekommen, an dem man dir sinnvoll nicht mehr
weiterhelfen kann. Die bisher genannten Dinge, sind die
Standardfallen die zu einer Fehlermeldung führen.
Da diese anscheinend nicht zutreffen, gibt es nur noch
eine Möglichkeit: Das komplette Projekt einstellen, sodaß
es hier mal jemand durch den Compiler jagen kann.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

xxx wrote:

> ich benütze nich den GCC sondern Rowley mit Crossworks!

Damit hast du dich geoutet, im falschen Forum zu sein...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nicht wirklich, Rowley Crossworks verwendet -je nach Zielarchitektur- 
gcc als Compiler.

Ist jedenfalls so beim ARM.

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.