Oppure

Loading
21/01/13 15:27
tasx
Ciao a tutti!
Ho un problema con il linker di Visual Studio 2012:

file main.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
#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:
#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:
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 :k:
Ultima modifica effettuata da tasx 21/01/13 15:28
aaa
21/01/13 15:36
Dante.cpp
Effettui la chiamata cosi:
type_tobj_new();


Ma la funzione è definita cosi:
typej_new_tob(){

//code
}
Ultima modifica effettuata da Dante.cpp 21/01/13 15:37
aaa
21/01/13 15:41
tasx
:rotfl::rotfl::rotfl::rotfl::rotfl::rotfl::rotfl::rotfl:

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 ;)
aaa
21/01/13 22:01
nessuno
Postato originariamente da tasx:
pensavo che VS queste cose le segnalasse....


Veramente le segnala !

[i]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à.
22/01/13 12:54
tasx
Postato originariamente da nessuno:

Postato originariamente da tasx:
pensavo che VS queste cose le segnalasse....


Veramente le segnala !

[i]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....
aaa
22/01/13 12:59
nessuno
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à.
22/01/13 17:02
tasx
uhm.... non potrebbe dirmi: "guarda che di questa funzione non ho l'implementazione ma solo la definizione...." :-?:-?
aaa
22/01/13 18:05
nessuno
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à.