www.mikrocontroller.net

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


Autor: xxx (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
xxx wrote:

> obwohl die funktion sowohl deklariert als auch definiert ist!

Aber offenbar eben nicht mit gelinkt.

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: xxx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
struct uip_udp_conn * uip_udp_new(uip_ipaddr_t *ripaddr, u16_t rport)
{
   register struct uip_udp_conn *conn;
// Find an unused local port. 
again:
   ++lastport;
   if(lastport >= 32000) {
      lastport = 4096;
   }
  
   for(c = 0; c < UIP_UDP_CONNS; ++c) {
      if(uip_udp_conns[c].lport == htons(lastport)) {
         goto again;
      }
   }

   conn = 0;
   for(c = 0; c < UIP_UDP_CONNS; ++c) {
      if(uip_udp_conns[c].lport == 0) {
         conn = &uip_udp_conns[c];
         break;
      }
   }
   if(conn == 0) {
      return 0;
   }
  
   conn->lport = HTONS(lastport);
   conn->rport = rport;
   if(ripaddr == NULL) {
      memset(conn->ripaddr, 0, sizeof(uip_ipaddr_t));
   } else {
      uip_ipaddr_copy(&conn->ripaddr, ripaddr);
   }
   conn->ttl = UIP_TTL;
   return conn;
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: xxx (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: xxx (Gast)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: xxx (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
xxx wrote:

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

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicht wirklich, Rowley Crossworks verwendet -je nach Zielarchitektur- 
gcc als Compiler.

Ist jedenfalls so beim ARM.

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.