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

C Discussion :

Using DLL Import lib in C code with GCC


Sujet :

C

  1. #1
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Par défaut Using DLL Import lib in C code with GCC
    Hi all,

    Je suis sous windows (98se).

    J'ai créé un fichier de définition pour user32.dll avec impdef.
    J'ai créé une librairie pour user32.dll avec buildlib (une sorte de implib 32 bits) et user32.def.
    J'ai écri un petit programme C

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int MessageBoxA (void* parent, char* message, char* caption, int style);
     
    int main (int argc, char* argv [])
    {
         MessageBoxA (0, "un petit message", "titre", 0);
         return 0;
    }
    je compile avec la commande gcc test.c -luser32

    Mais j'ai toujours le même message : undefined reference to MessageBoxA.

    Pourtant MessageBoxA est bien dans user32.lib (je l'ai vérifié). J'ai aussi essayer en remplacant MessageBoxA par MessageBoxA@16 dans user32.def puis en recréant le nouvelle user32.lib. Mais le résultat est le même.

    Please : how do I use an import from scratch ?

    snifff, snifff.... je suis desespéré

  2. #2
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    La bibliotheque a bien été signalée au linkeur?

    EDIT:Quel est l'IDE?

  3. #3
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Par défaut
    Merci Seriousme pour ta réponse

    Oui, la bibliothèque a bien été signalé au lieur (qui est ld), et je peux confirmer qu'il la trouve.

    Je ne travail pas avec un IDE, mais en ligne de commande. Avec gcc, pour compiler les fichiers C. Avec ld pour lier les objets, avec impdef pour créer les fichiers de définitions des dll étrangères, et avec buildlib (un genre de implib) pour créer le librairie d'importation d'une dll étrangère.

    J'ai essayer en décorant MessageBoxA avec le @16, sans le @16, j'ai essayé en ajoutant un blanc-souligné avant le nom (pour la déclaration dans le fichier C), et sans blanc-souligné aussi...

    Je n'y comprends rien

  4. #4
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Par défaut
    J'ai trouvé la solution. Il faut ajouter ce truc bizzare dans la déclaration : __attribute__((stdcall)) il y a deux blanc souligné à chaque fois, et il est obligatoire d'utiliser deux paranthèses. C'est un truc complétement tordu et lofoque, mais ça marche. Cette chose bizzare dit au compilateur que la convention d'appel est celle du Pascal (ce que je voulais).

    Cela ne venait donc pas de la librairie, mais du source C. J'ai modifié le fichier C pour que la declaration soit « extern __attribute__((stdcall)) int MessageBoxA (void* parent, char* message, char* caption, int style); » et ça fonctionne hamdullah

    alors je peux même créer la librairie d'import en utilisant MessageBoxA ou MessageBoxA@16, ça marche dans les deux cas!

    Pour faire plus simple et plus lisible, il suffit de définire une macro, par exempe « #define API extern __attribute__((stdcall)) », et de l'utiliser ainsi « API int MessageBoxA (void* parent, char* message, char* caption, int style); ». Ceci evite d'avoir à lire et à écrire sans cesse cette bizzarerie de __attribute__((stdcall))

    Ceci dit, en passant, on remarquera une fois de plus que le C est un langage trés mal conçus (rafistolage + rafistolage + etc ... = #~*!)

  5. #5
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par Hibou57
    Ceci dit, en passant, on remarquera une fois de plus que le C est un langage trés mal conçus (rafistolage + rafistolage + etc ... = #~*!)
    Ben tiens. C'est comme les tennismen francais: quand ils perdent, c'est la faute de la raquette.
    Ce que tu racontes est bizarre, notamment la decoration de la fonction - ton fichier n'aurait pas l'extension .cpp par hasard (ce qui invoquerait le compilateur C++)? Sinon, c'est encore une specificite de l'API Win32...

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    DaZumba: Non, les décorations C++ sont bien pires.
    le @16, c'est la décoration C pour une fonction en __stdcall. (16 étant la taille de paramètres que la fonction retire elle-même de la pile: c'est une optimisation en taille des appels)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par Médinoc
    le @16, c'est la décoration C pour une fonction en __stdcall.
    Ok, merci pour ces precisions. Le C n'a donc bien rien a voir la dedans - c'etait un probleme de conventions d'appel Win32.

  8. #8
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Par défaut
    DaZumba, je n'ai pas rejeté la faute si quoique ce soit... je *Cherchais* une solution (que j'ai trouvé). Reconnais quand même que la syntax du C pour faire ça, tient un peu du rafistolage. Pour être exact, j'utilisais lcc avant, et je suis passé à gcc pour certaines raisons... et la manière de le faire en gcc n'est pas la même, raison pour laquelle je me suis trouvé les bras balent quelques instant....

    Pffff.... je ne sais pas ce que vous avec le C ici, mais on ne peut rien en dire sans vexer apparement.

    Merci pour ton intervention Médinoc

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

Discussions similaires

  1. Comment linker avec odbc32.lib dans le code ? (avec gcc)
    Par _Audrey_ dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 06/11/2008, 17h40
  2. [C# 2.0] Utiliser using n'importe ou dans le code ?
    Par dymezac dans le forum ASP.NET
    Réponses: 7
    Dernier message: 20/09/2006, 15h52
  3. DLL ou LIB de php ?
    Par wolfjeremy dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 17/07/2006, 17h01
  4. Réponses: 5
    Dernier message: 15/06/2006, 12h03

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