tasx (Dev Team)
Expert
Messaggi: 439
Iscritto: 15/12/2008
|
Ciao a tutti!
Ho un problema con il linker di Visual Studio 2012:
file main.c
Codice sorgente - presumibilmente C++ |
#include <stdio.h> #include <stdlib.h> #include <pcap.h> #include "type.h" void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data) { printf("grab packet %d\n", header->len); } int main(int argc, char *argv[]) { pcap_if_t *alldevs; pcap_if_t *d; pcap_t *handle; int a = hello(); tobj t = type_tobj_new(); if (pcap_findalldevs(&alldevs, t->errbuf) == -1) { fprintf(stderr, "unable to find interfaces\n"); exit(1); } t->dev = alldevs; for(d = alldevs; d; d = d->next) { printf("%s\n", d->description); } handle = pcap_open_live(t->dev->name, 65536, 1, 1000, t->errbuf); pcap_loop(handle, 0, packet_handler, NULL); system("PAUSE"); return 0; }
|
file: type.h
Codice sorgente - presumibilmente C++ |
#include <stdio.h> #include <stdlib.h> #include <pcap.h> typedef struct _tobj { pcap_if_t *dev; pcap_t *handle; char *errbuf; } *tobj; //typedef struct _tobj * tobj; tobj type_tobj_new(); int hello();
|
file type.c:
Codice sorgente - presumibilmente C++ |
#include "type.h" int hello() { printf("hello \n"); return 0; } tobj type_new_tobj() { tobj t = (tobj) malloc(sizeof(tobj)); if (t == NULL) { fprintf(stderr, "Unable to alloc tobj memory\n"); exit(1); } return t; }
|
e l'errore che mi restituisce è il seguente:
Codice sorgente - presumibilmente C/C++ |
main.obj : error LNK2019: riferimento al simbolo esterno _type_tobj_new non risolto nella funzione _main
|
il problema è che è da poco che uso VS per programmare in C, prima avevo sempre utilizzato Code::Blocks, Netbeans e altri... quindi penso che sia io a configurare male il linker?
Anche perchè le pcap le trova, la funzione hello() la linka senza problemi invece type_tobj_new() non l trova....
tuttavia il file "type.obj" viene generato quindi non capisco come mai salta l'errore??
c'è qualche definizione particolare del compilatore microsoft che mi manca, o altro?
ciao grazie Ultima modifica effettuata da tasx il 21/01/2013 alle 16:28 |
|
Dante.cpp (Normal User)
Pro
Messaggi: 65
Iscritto: 23/11/2011
|
Effettui la chiamata cosi:
Codice sorgente - presumibilmente Plain Text |
Ma la funzione è definita cosi:
Codice sorgente - presumibilmente Plain Text |
typej_new_tob(){
//code
}
|
Ultima modifica effettuata da Dante.cpp il 21/01/2013 alle 16:37 |
|
tasx (Dev Team)
Expert
Messaggi: 439
Iscritto: 15/12/2008
|
e pensare che sono due giorni che navigo su google cercando dappertutto.... che imbecille.....
grazie mille.....
pensavo che VS queste cose le segnalasse....
ancora grazie
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Postato originariamente da tasx:
pensavo che VS queste cose le segnalasse....
|
Veramente le segnala !
riferimento al simbolo esterno _type_tobj_new non risolto nella funzione _main
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
tasx (Dev Team)
Expert
Messaggi: 439
Iscritto: 15/12/2008
|
Postato originariamente da nessuno:
Postato originariamente da tasx:
pensavo che VS queste cose le segnalasse....
|
Veramente le segnala !
riferimento al simbolo esterno _type_tobj_new non risolto nella funzione _main |
si ma quello è l'errore del linker, io pensavo mi sottolineasse la funzione nell'editor.... |
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Postato originariamente da tasx:
si ma quello è l'errore del linker, io pensavo mi sottolineasse la funzione nell'editor.... |
L'editor non può indicarti un errore del genere, se ci pensi un momento ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
tasx (Dev Team)
Expert
Messaggi: 439
Iscritto: 15/12/2008
|
uhm.... non potrebbe dirmi: "guarda che di questa funzione non ho l'implementazione ma solo la definizione...."
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Postato originariamente da tasx:
uhm.... non potrebbe dirmi: "guarda che di questa funzione non ho l'implementazione ma solo la definizione...." |
Potresti averla in un altro modulo o in una libreria esterna ed è compito del linker "collegare" tutti gli elementi dai vari moduli per ottenere un solo eseguibile. Non a caso l'errore te lo indica il linker, proprio perché non riesce a trovare quella funzione in nessun modulo o libreria.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
tasx (Dev Team)
Expert
Messaggi: 439
Iscritto: 15/12/2008
|
però perchè sia in un altro modulo/libreria non dovrei dichiararla come "extern" o sbaglio?
ps: perdonami se rompo ma solo interesse....
|
|