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 :

MinGW et la construction de dll


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2006
    Messages : 134
    Par défaut MinGW et la construction de dll
    Bonjour,voici ma question plutôt technique sur le linker de MinGW.
    J'essaye de générer une dll qui se link avec des librairies statiques (des .a) et dynamiques ( d'autres .dll ). Tout ce joli monde est fait sous MinGW. Les objets de la librairie dynamique que l'on essaie de créer font référence à des objets des librairies statiques, qui ont apparemment besoin de symboles exportés depuis la dll que nous essayons de générer. Bien évidemment, on obtient des erreurs du type "undefined reference", mais le plus étonnant c'est que la compilation de ce truc marche sous linux avec gcc et sous visual studio avec visual studio.

    Question pourquoi le linker de MinGW ne fonctionne pas comme celui de linux???
    Merci d'avance.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2006
    Messages : 134
    Par défaut
    Citation Envoyé par doommick31 Voir le message
    Bonjour,voici ma question plutôt technique sur le linker de MinGW.
    J'essaye de générer une dll qui se link avec des librairies statiques (des .a) et dynamiques ( d'autres .dll ). Tout ce joli monde est fait sous MinGW. Les objets de la librairie dynamique que l'on essaie de créer font référence à des objets des librairies statiques, qui ont apparemment besoin de symboles exportés depuis la dll que nous essayons de générer. Bien évidemment, on obtient des erreurs du type "undefined reference", mais le plus étonnant c'est que la compilation de ce truc marche sous linux avec gcc et sous visual studio avec visual studio.

    Question pourquoi le linker de MinGW ne fonctionne pas comme celui de linux???
    Merci d'avance.
    J'ai peur de ne pas être suffisamment précis sur la question. Le code que j'essaye de porté sous MinGW a était déjà compiler mainte fois sous une liste de linux( plein de noyau different ) , des redhat, etc... et meme visual pour dire. Comme dit au dessus le composant a des dépendances cycliques bizarres. MinGW possède t'il une particularité sur ce point la ?? Merci d'avance pour votre aide.

  3. #3
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut
    Citation Envoyé par doommick31 Voir le message
    J'ai peur de ne pas être suffisamment précis sur la question. Le code que j'essaye de porté sous MinGW a était déjà compiler mainte fois sous une liste de linux( plein de noyau different ) , des redhat, etc... et meme visual pour dire. Comme dit au dessus le composant a des dépendances cycliques bizarres. MinGW possède t'il une particularité sur ce point la ?? Merci d'avance pour votre aide.
    Salut,

    Le linker que MinGW est le même, très exactement (à part les spécificités du format binaire et autres joyeusetés de l'ABI), que celui généralement utilisé avec GCC.

    Cependant, il en existe plusieurs versions. Les versions que tu utilises sous Linux n'ont peut-être pas un bug, présent sur ta version pour Windows.

    Le linker, ld, est inclus dans le paquet binutils. La dernière version disponible pour Windows, précompilée, est la 2.19.1, la toute dernière version. Utilises-tu bien la même ?

    Il est aussi possible que le build du compilateur soit cassé, auquel cas des problèmes peuvent apparaître dans les compilés, ce qui pourrait donner ce genre de résultat. La compilation du linker est peut-être aussi cassée.
    Tout ça pour dire qu'une chaîne de compilation est très fragile...

    Si les versions correspondent, essaye de déplacer les symboles nécessaires à la lib statique depuis la dynamique vers cette statique, si c'est possible.

    Aussi, tu peux essayer de fusionner toutes ces libs, statiques et dynamiques, en une seule et unique, statique ou dynamique, cela réduira fortement les risques de problèmes, si les licences le permettent.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  4. #4
    screetch
    Invité(e)
    Par défaut
    Youpidoup,

    ce que tu essayes de faire fonctionne en principe bien sous tous les compilateurs. Tu as une bibliotheque statique (plop.lib, libplop.a sous gcc) qui contient du code pas encore complet, qui lui sera fourni plus tard par celui qui link avec cette lib.

    L'exemple le plus connu c'est de fournir dans une bib statique le code de "main" de maniere multi-platforme (WinMain, parsing d'arguments, etc), puis d'appeler une autre fonction main standardisée (qmain, SdlMain, etc)
    c'est utilisé, comme indiqué juste au dessus, par Qt et SDL. donc ca marche ^^

    il y a un autre type d'erreur, qui empeche le linker de trouver la fonction qui lui manque. Est ce que tu peux poster un exemple ou indiquer ou sont les sources ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2006
    Messages : 134
    Par défaut
    Salut, Merci puor votre aide

    J'apporte un peu plus de précision, je suis sous windows xp sp1 et j'utilise mingw 3.4.5 (installé avec l'installeur automatique), la version du linker est bien 2.19.1.

    Je viens de faire une grosse lib statique avec toutes mes lib statiques (aucun problème pour un poid de 100mo), je link cette lib statique pour faire ma fameuse dll et j'obtiens la même erreur. Je ne comprends pas pourquoi la statique marche très bien et pas la dynamique.

    Je n'ai pas d'exemple sous la main mais pour vous résumer un peu ce que cela donne :
    je cherche à faire toto.dll
    avec -l(la famille a toto).a -l(encore de la famille a toto).dll

    j'obtiens des undefined reference to `_imp___fctdetoto' dans les .a de la famille à toto

    en modifiant l'ordre des -l de famille a toto -l(la famille a toto).a .dll je tourne en rond au niveau des erreurs undefined reference.

  6. #6
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut
    Citation Envoyé par doommick31 Voir le message
    en modifiant l'ordre des -l de famille a toto -l(la famille a toto).a .dll je tourne en rond au niveau des erreurs undefined reference.
    Si je m'en souviens bien (on ne rencontre pas si souvent que ça ce genre de cas...), tu mets en premier la lib de base, qui n'a d'autre dépendance que la lib standard. Ensuite, tu mets les dépendances des libs suivantes (et les dépendances des dépendances...), puis les libs suivantes, en t'assurant bien qu'elles ont tout ce qui leur est nécessaire avant. Puis tu ajoutes encore les libs nécessaires, petit à petit.

    Cette méthode est très théorique, il faut vraiment savoir ce dont chaque lib a besoin. Si tu as un graphique des dépendances de tes libs, c'est le moment de le sortir. Sinon, tu peux essayer de le faire à l'essai-erreur... (Ce que tu as déjà commencé, il me semble).

    Pour cela, ne mets pas toutes les libs d'un coup, mets-les une par une, pour savoir précisément à quel moment ça coince.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 31/01/2011, 14h36
  2. [débutant C#]construction d'une dll en dotnet..
    Par just1980 dans le forum C#
    Réponses: 20
    Dernier message: 19/08/2010, 15h53
  3. [VC++] Utilisation d'une DLL écrite en C++ avec mingw.
    Par swirtel dans le forum Visual C++
    Réponses: 1
    Dernier message: 20/06/2007, 10h42
  4. la construction et l'utilisation des DLL
    Par aziz jim dans le forum C++
    Réponses: 2
    Dernier message: 11/03/2007, 11h18
  5. Utiliser une .dll .lib de VC sous C::B+mingw
    Par reptils dans le forum Code::Blocks
    Réponses: 11
    Dernier message: 18/10/2006, 08h54

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