IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

conflit de nom avec perlembed et winsock2


Sujet :

MFC

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 7
    Points : 2
    Points
    2
    Par défaut conflit de nom avec perlembed et winsock2
    Bonjour,

    j'essaie d'intégrer perlembed dans mon application, ce qui se traduit par l'inclusion des fichier EXTERN.H et perl.h de la distribution perl. Le problème vient du fait que l'application contient déjà un serveur de réception TCP/IP utilisant la fonction select() et les files descriptors fd_set définis dans winsock2.h.
    Le type de données fd_set existe également en perl, d'où mon conflit de noms. Comment préciser au compilateur que je veux utiliser les fd_set de winsock et pas ceux de perl?
    Je n'ai pas trouvé de namespace associé qui me permettrait de faire :
    le_namespace_pour fd_set_winsock::fd_set mon_descripteur_de_fichier;

    Quelqu'un connait-il le namespace associé à winsock2.h?
    Ou s'il n'en existe pas, une idée pour résoudre mon problème?

    Merci d'avance

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    C'est du C, y'a pas de namespace. C'est bizarre quand même que les mecs de perl n'aient pas pensé à ça. Vérifie que winsock n'est pas déjà inclu à un endroit ou un autre dans un header de perl. Sinon, tu peux tenter quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include <perl.h>
     
    namespace winsock
    {
    #include <winsock2.h>
    }

  3. #3
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    Vérifie que winsock n'est pas déjà inclu à un endroit ou un autre dans un header de perl.
    Tu as vu juste : winsock.h est inclus dans socket.h et win32.h de la distribution perl!! Que dois-je faire de cette info?

  4. #4
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Je pense avoir résolu mon problème!
    Le fichier socket.h de perl qui inclut winsock.h commence par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #ifndef  _INC_SYS_SOCKET
    #define  _INC_SYS_SOCKET
    ...
    Il m'a suffit de rajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define  _INC_SYS_SOCKET
    dans mon code et je retrouve un comportement cohérent avec le bon type fd_set, en particulier.

    Merci pour ton aide Aurélien!!

  5. #5
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    J'ai crié victoire trop tôt , le problème est plus complexe puisqu'il y a également conflit avec stlib.h!! Je ne peux pas appliquer la même technique que pour contourner la double référence à winsock.h sinon, je ne peux plus rien faire de mon perlembed!

    J'ai essayé de mettre ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    namespace perl {
    	#include <EXTERN.h>               /* from the Perl distribution     */
    	#include <perl.h>                 /* from the Perl distribution     */
    }
    dans le fichier .cpp qui utilise l'interpreteur perl (et pas de le .h pour ne pas répercuter les conflits à tout mon prog). Et de mettre perl:: devant tous les appels aux objets ou fonctions perl.
    Mais maintenant, j'ai un problème de link sur une fonction alors que je ne devrais pas en avoir. Je suppose que c'est parce que le paramètre de la fonction est de type string et que le type string du .cpp avec include des headers perl, et le type string normal du .h sont considérés comme différents.
    Pour plus de clarté, voici mon code et l'erreur produite :

    ma_classe.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #ifndef ma_classe_H
    #define ma_classe_H
    #include <string>
     
    class ma_classe{
    	ma_classe();
    	~ma_classe();
    	bool convert(std::string filetoconvert);
     
    };
     
    #endif
    ma_classe.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #include <string>
     
    namespace perl {
    	#include <EXTERN.h>               /* from the Perl distribution     */
    	#include <perl.h>                 /* from the Perl distribution     */
    }
    #include "ma_classe.h"
     
    static perl::PerlInterpreter *my_perl;  /***    The Perl interpreter    ***/
     
    /**
            constructor
      */
    ma_classe::ma_classe(){
    	my_perl = perl::perl_alloc();
    	perl::perl_construct(my_perl);
    }
     
    /**
            destructor
      */
    ma_classe::~ma_classe(){
    	perl::perl_destruct(my_perl);
    	perl::perl_free(my_perl);
    }
     
     
    bool ma_classe::convert(std::string filetoconvert){
    	std::string perlcmd;
    	perlcmd = std::string("perl \"convert.pl\" < ") + filetoconvert.c_str();
     
        perl::perl_parse(my_perl, NULL, NULL, NULL, NULL);
        perl::perl_call_argv("Validating_bar2xml/bar2xml.pl", NULL, (char **)     perlcmd.c_str());
     
    	return true;
    }
    l'erreur obtenue lors du build :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    error LNK2001: unresolved external symbol "public: bool __thiscall ma_classe::convert(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?convert@ma_classe@@QAE_NV?$basic_string@DU?$cha
    r_traits@D@std@@V?$allocator@D@2@@std@@@Z)
    Debug/mon_appli.exe : fatal error LNK1120: 1 unresolved externals
    Error executing link.exe.
    Est-ce quelqu'un peut me dépanner?

  6. #6
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    A priori ca devrait etre bon. Recompile tout. Mets ton #include "ma_classe.h" tout en haut pour voir. Si ça passe toujours pas, supprime le code perl pour voir s'il est en cause... bref essaye d'arriver à compiler / linker, puis rajoute petit a petit jusqu'à isoler le pblm.

  7. #7
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    En mettent #include "ma_classe.h" tout en haut, voilà l'erreur que j'obtiens : (le type de retour de la fonction est bool pas char!!)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    error C2556: 'char __thiscall ma_classe::convert(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)' : overloaded function differs only by return type from 'bool __
    thiscall ma_classe::convert(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)'
            ma_classe.h(20) : see declaration of 'convert'
    ma_classe.cpp(43) : error C2371: 'convert' : redefinition; different basic types
            ma_classe.h(20) : see declaration of 'convert'
    Error executing cl.exe.
    En bref, il y a tjrs une erreur quel que soit l'ordre des includes, mais pas tjrs la même.

    J'ai identifié que c'est #include "perl.h" qui provoque ces conflits et pour cause, voici 2 extraits de ce fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #if defined(STANDARD_C) && defined(I_STDLIB)
    #   include <stdlib.h>
    #endif
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #if defined(I_STRING) || defined(__cplusplus)
    #   include <string.h>
    #else
    #   include <strings.h>
    #endif
    Mais je ne vois pas comment éviter les conflits sans saboter perl

  8. #8
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    Ca sent la vieille macro qui traine...
    Rajoute voir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #ifdef bool
    #error y'a une vilaine macro bool de definie!
    #endif
    juste au dessus de ta fonction convert.

  9. #9
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    BINGO!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Converter.cpp(41) : fatal error C1189: #error :  y'a une vilaine macro bool de definie!
    Error executing cl.exe.
    et ce doit être pareil pour string et sans doute d'autres...
    Que faire :

  10. #10
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    Créer un en-tête "safe-perl.h" qui inclut "perl.h" et #undef ces macros.

  11. #11
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Cool, ça marche! Enfin, j'espère que cette fois-ci ce n'est pas une fausse joie!
    Voici mon fichier safe-perl.h que inclu dans ma_classe.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <EXTERN.h>           
    #include <perl.h>               
    #undef bool
    et je prends soin de mettre partout std::string et ça semble fonctionner!

    Merci beaucoup Aurélien!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Problème avec les noms avec espaces
    Par cyberdevelopment dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 07/08/2006, 13h16
  2. Conflit de port avec Oracle XE
    Par hynposat7 dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 19/07/2006, 13h27
  3. Les conflits de nom ?
    Par cicolas dans le forum Spring
    Réponses: 5
    Dernier message: 18/07/2006, 16h28
  4. Conflit de port avec Oracle XE
    Par hynposat7 dans le forum Servlets/JSP
    Réponses: 0
    Dernier message: 17/07/2006, 13h05
  5. Réponses: 5
    Dernier message: 23/02/2006, 00h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo