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 : 39
    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 397
    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 397
    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