Bonjour à tous,
Voila je teste la libnids pour un travail que je dois rendre.
Mais j'ai un petit probleme avec. Je m'explique : quand je compile cette source avec la commande : `g++ -c nids.cc -o nids -lnids -lpcap -lnet`
j'obtiens cette erreur :
nids.cc: Dans function « int main() »:
nids.cc:37: error: conversion invalide de « void (*)(tcp_stream*, void**) »
vers « void* »
voici mon code alégé pour juste se concentrer sur l'erreur :
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <stdio.h>
#include <nids.h>
#define int_ntoa(x) inet_ntoa(*((struct in_addr *)&x))
void callback (struct tcp_stream *ts, void **param);
void callback (struct tcp_stream *ts, void **param)
{
return;
}
int main ()
{
if (!nids_init ())
{
fprintf(stderr,"%s\n",nids_errbuf);
return -1;
}
nids_register_tcp(callback);
nids_run ();
return 0;
}
donc voila mon probleme.
Je vous cache pas que c'est le squelette de l'exemple du man qui est lui en c mais je vois pas pourquoi il pourrait pas se compiler en c++, mais je suis pas un expert non plus en c,c++
Merci d'avance pour votre aide.
# Cast
Posté par Barnabé . Évalué à 1.
nids_register_tcp ((void *) callback);
[^] # Re: Cast
Posté par bash . Évalué à 1.
Merci à toi barnabé.
[^] # Re: Cast
Posté par Obsidian . Évalué à 2.
int nids_init (void);
void nids_register_ip_frag (void (*));
void nids_register_ip (void (*))
void nids_register_tcp (void (*));
void nids_register_udp (void (*));
void nids_killtcp (struct tcp_stream *);
Si cette fonction attend une fonction de callback, il me semble qu'elle n'attend rien d'autre et dans ce cas, le développeur aurait pu se fendre de faire le prototype d'un pointeur de fonction correct ! Ce raccourci t'oblige à introduire une ânerie dans ton code, pourtant propre à l'origine ...
Ceci dit, même avec une bibliothèque correcte, tu aurais peut-être rencontré des ennuis dus au fait que le C++ décore les symboles de fonctions, principalement pour assurer les mécanismes de surcharge. Dans ce cas, il aurait fallu placer ton prototype dans un extern "C" { } ...
# autre petit probleme
Posté par bash . Évalué à 1.
J'ai un deuxieme probleme de compilation que j'arrive lui non plus à resoudre.
Lors de la compilation il ne trouve pas les fonctions de libnids !!!
je compile avec les commande suivante :
g++ -c nids.c
g++ -o nids nids.o -lnids -lpcap -lnet
Erreur :
nids.o(.text+0x7b): In function `main':
: undefined reference to `nids_init()'
nids.o(.text+0xc8): In function `main':
: undefined reference to `nids_register_ip(void*)'
nids.o(.text+0xd4): In function `main':
: undefined reference to `nids_register_udp(void*)'
nids.o(.text+0xe0): In function `main':
: undefined reference to `nids_register_tcp(void*)'
nids.o(.text+0xe5): In function `main':
: undefined reference to `nids_run()'
collect2: ld a retourné 1 code d'état d'exécution
Mon code est le meme que celui d'avant avec des améiorations.
Donc voila j'ai passé tout l'aprem hier à essayer de comprendre pourquoi ... Donc apres tout ça ben je vois pas du tout pourquoi.
Mais ce qui est bizard c'est que qu'en je le compille avec gcc ça marche !!!
Enfin bon si quelqu'un a une idée .?
[^] # Re: autre petit probleme
Posté par EdB . Évalué à 1.
[^] # Re: autre petit probleme
Posté par bash . Évalué à 1.
Je ne connais pas le mot clé "extern C".
Je vois pas trop comment m'en servir.
Donc je vais aller regarder sur le net et je vous tiens au courant.
[^] # Re: autre petit probleme
Posté par bash . Évalué à 1.
extern "C"
{
#include <nids.h>
}
Ceci indique au compilateur C++ que les fonctions déclarés dans ce fichiers entête sont des fonctions C.
Merci.
Pour plus d'infos : http://jlecomte.ifrance.com/c++/c++-faq-lite/mixing-c-and-cp(...)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.