Re: Problème de compilation / dlsym

Pàgina inicial

Reply to this message
Autor: Edgar Bonet
Data:  
A: ML Guilde
Assumpte: Re: Problème de compilation / dlsym
Le lundi 13 mars, Frédéric a écrit :
>   bool (*m_TestRecAlignment)(TModuleRec *Rec);
>   bool (*m_Compile)(
>     TModuleRec *Rec,
>     char* Source,
>     bool DirectivesOnly,
>     bool ParseStampDirective
>   );
>   // is declared as int in the specs for tokenizer v1.16 but is
>   // actually a byte.
>   byte (*m_Version)();


Bon, visiblement le C et le C++ c'est pas pareil sur ce point. Moi je
suis C, mais j'ai essayé de jouer avec le compilo C++ (g++ 3.4.1).

    (void *) m_TestRecAlignment = dlsym(m_libt, "TestRecAlignment");


donne

    error: ISO C++ forbids cast to non-reference type used as lvalue


C'est en gros le message d'erreur que tu avais, en plus clair. Si
j'enlève le cast à gauche :

    error: invalid conversion from `void*' to `bool (*)(TModuleRec*)'


OK, je remets le cast, mais à droite, comme tout le monde, et là il est
content. Après tout c'est plus logique de caster la valeur au type de la
variable d'accueil que le contraire. Donc, le code qui plaît à g++ :

    m_libt = dlopen(TOKENIZER_SO, RTLD_LAZY);
    if (m_libt) {
        m_TestRecAlignment = (bool (*)(TModuleRec *))
            dlsym(m_libt, "TestRecAlignment");
        m_Compile = (bool (*)(TModuleRec *, char*, bool, bool))
            dlsym(m_libt, "Compile");
        m_Version = (byte (*)()) dlsym(m_libt, "Version");
    }


Si tu ne trouves pas ça très lisible (normal si tu as pas bu le C au
biberon), fais des typedefs pour ces types de fonctions.

-- 
Edgar Bonet           Maison : 04 76 21 29 16    Bureau : 04 76 88 10 96
3 rue Jean Prévost    Mobile : 06 77 19 79 39    Fax    : 04 76 88 11 91
38000 Grenoble        guilde@???     www.edgar-bonet.org