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);
xxx wrote:
> obwohl die funktion sowohl deklariert als auch definiert ist!
Aber offenbar eben nicht mit gelinkt.
Und wo ist diese Funktion deklariert/definiert? Und wie sieht das Programm an sich aus?
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 | }
|
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.
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?
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.
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!
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.
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!
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.
xxx wrote:
> ich benütze nich den GCC sondern Rowley mit Crossworks!
Damit hast du dich geoutet, im falschen Forum zu sein...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.