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 :

Win32 dllexport Impossible d'exporter des symboles d'une librairie


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 107
    Par défaut Win32 dllexport Impossible d'exporter des symboles d'une librairie
    Bonjour.

    Tout d'abord je ne sais pas si c'est le bon endroit mais il faut bien faire une tentative.

    J'ai réalisé une application sous Linux:
    • utilisant en grande part Qt comme librairie;
    • constitué de plusieurs sous-librairie et une application graphique.


    Et alors que je rendais mon code compatible avec Visual Studio 2015, j'ai achoppé sur un problème de dllexport ; voici un code illustrant le problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <QVariant>
    #include <QList>
     
    class SNIPPEDSHARED_EXPORT Snipped : public QList<QVariant>
    {
    public:
      Snipped();
    };
    SNIPPEDSHARED_EXPORT étant le classique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #if defined(SNIPPED_LIBRARY)
    #  define SNIPPEDSHARED_EXPORT __declspec(dllexport)
    #else
    #  define SNIPPEDSHARED_EXPORT __declspec(dllimport)
    #endif
    Et voici enfin l'erreur :
    C:\Qt\5.7\msvc2015_64\include\QtCore\qhashfunctions.h:110: erreur : C2665: 'qHash': none of the 22 overloads could convert all the argument types
    C:\Qt\5.7\msvc2015_64\include\QtCore\qhashfunctions.h:110: erreur : C2056: illegal expression
    Le message d'erreur est assez explicite en lui-même, et j'ai même trouvé des gens définissant leur propre qHash :


    Alors pourquoi poster un message ?
    • Je utilise QList et pas qHash directement ; je sais bien que QList utilise des optimisations (et des tables de hashages) mais le code fonctionne très bien avec gcc : Qt fournit donc le nécessaire pour que ca marche;
    • quand je fais un exécutable classique en y plaçant le même code (mois l'export de DLL évidemment), tout foncitonne parfaitement (aussi bien sous linux que windows).
    • quand, sur l'exemple de librairie, je retire le __declspec, alors la librairie compile parfaitement.

    J'ai pris le temps de lire de la documentation et la seule chose approchante que j'ai trouvé est l'export de template:


    Mais tout ce que j'ai trouvé ne correspond pas vraiment à mon problème. J'ai un peu essayé tous les bidouillages trouvés ici ou là, mais j'ai pas eu de chance. Pourtant le code étant court et simple, j'ai dû raté quelque chose d'évident.

    Quelqu'un a-t-il une idée ?

    P.S.:
    • Visual Studio 2015 Community Edition, avec la dernière mise à jour : 14.0.25424.00 Update 3
    • Visual C++ 2015 00322-20000-00000-AA285
    • Windows Kit 10: 10.0.10586.0
    • création d'une librairie avec QtCreator

  2. #2
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Billets dans le blog
    1
    Par défaut
    Réponse hors contexte, mais qui m'as servi lorsque j'ai voulu porter mes lib de linux sous windows avec QtCreator:
    Comme j'avais visual d'installer j'ai utiliser le compilo visual. Je me suis retrouvé avec pas mal d'erreur. Au final j'ai installer mingw, et plus aucun soucis.

    Tu dois obligatoirement compilé avec le compilo visual, ou avec mingw ça fera l'affaire?

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 107
    Par défaut
    Citation Envoyé par skeud Voir le message
    Tu dois obligatoirement compilé avec le compilo visual, ou avec mingw ça fera l'affaire?
    Pêle-mêle :
    • j'utilise toujours le compilateur de la plateforme :
      • sous Linux j'utilise GCC et confrères
      • sous Windows j'utilise le compilateur Visual Studio

      La raison est que je fais confiance au compilateur officiel de la plateforme pour faire un binaire qui « marche ».
    • il s'agit d'une assez grosse application, avec ici où là du code technique (e.g. inspection de pile) : j'ai peur que je ne sois obligé de faire des trucs pas très jolis si j'utilisais mingw
    • je n'utilise pas que Qt comme librairie (e.g. Winsparkle)
    • malgré le coût, utiliser plusieurs compilateurs m'a toujours aidé à fiabiliser mon code
    • j'ai maintenant pas mal d'expérience avec le compilateur de Visual Studio et basculer à une autre compilation va sûrement me coûter cher en temps, à moins d'avoir du bol et que « cela juste marche »
    • après tout l'erreur que je rencontre doit vraiment être une erreur de base : pourquoi changer tout à la première, et seule, erreur rencontrée ?


    Mais oui, j'ai cette possibilité à l'esprit.

  4. #4
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Billets dans le blog
    1
    Par défaut
    Je viens de tester, et il faut créer ton qhash de qvariant, me demande pas pourquoi, je ne sais pas :/.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    uint qHash(const QVariant &key)
    {
        return (0);
    }
    En ajoutant ça dans le header, la compilation se passe bien.

    Apparemment c'est lié au export de windows qui se debrouillerais pas très bien lors de l'export de class basé sur un template.
    http://www.codesynthesis.com/~boris/...cxx-templates/

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 107
    Par défaut
    Citation Envoyé par skeud Voir le message
    Je viens de tester, et il faut créer ton qhash de qvariant, me demande pas pourquoi, je ne sais pas :/.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    uint qHash(const QVariant &key)
    {
        return (0);
    }
    En ajoutant ça dans le header, la compilation se passe bien.
    Il faudrait placer cela dans les cpp sinon multiples définitions à venir. Séparation donc de définition/déclaration.
    Citation Envoyé par skeud Voir le message
    Apparemment c'est lié au export de windows qui se debrouillerais pas très bien lors de l'export de class basé sur un template.
    http://www.codesynthesis.com/~boris/...cxx-templates/
    J'ai déjà trouvé ce document, mais il soulève plusieurs problèmes :
    • si je dois faire cela ce n'est pas un fichier qu'il faut retoucher mais un bon paquet (il y a les QVariant et quantité d'autres types customs)
    • le gars dit Duplicate symbol errors ensue or ce n'est pas l'erreur que j'ai
    • dans la documentation officielle, il y a
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Because of a change in behavior introduce in Visual C++ .NET to make the application of dllexport more consistent between regular classes and specializations of class templates, if you apply dllexport to a regular class that has a base class that is not marked as dllexport, the compiler will generate C4275.
      Là encore ce n'est pas l'erreur que j'ai ; je suppose ici que Qt fait le nécessaire pour exporter tout ce qu'il faut. Même en faisant ce que Microsoft conseille pour le problème de template (i.e. explicitly instantiate the class template and mark this explicit instantiation with dllexport[1]) j'obtiens la même erreur.



    Donc l'origine du problème est pas encore vraiment bien claire. Je savais qu'ajouter cette définition fait passer la compilation pour le snipped code mais faire cela pour l'ensemble du projet me prendrait beaucoup de temps et je ne suis pas sûr que cela ne génèrerait pas quelque chose ailleurs.
    Avant d'investir du temps et d'appliquer une solution, je préfèrerais avoir compris d'où vient le problème pour pas avancer à l'aveugle[2].



    [1] c'est à dire faire cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #ifndef SNIPPED_H
    #define SNIPPED_H
    
    #include "snipped_global.h"
    #include <QVariant>
    #include <QList>
    template class __declspec(dllexport) QList<QVariant>;
    class SNIPPEDSHARED_EXPORT Snipped : public QList<QVariant>
    {
    public:
      Snipped();
    };
    
    #endif // SNIPPED_H
    [2] en plus je ne comprends pas pourquoi ajouter un qHash répond au problème de template. Snif.
    Et puis reconnais que ce serait bizarre qu'un truc comme cela ne soit pas placé dans la documentation de Qt dans la partie plugin, ou qu'il y a si peu d'infos claires sur le net concernant ce problème.

  6. #6
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Billets dans le blog
    1
    Par défaut
    Yep je suis tout à fait d'accord, je comprends pas trop non plus :/.

    Et ce que je comprends encore moins, c'est pourquoi avec mingw ça passe comme une lettre à la poste :/.

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

Discussions similaires

  1. Impossible d'exporter des jobs avec Talend 4.1
    Par matt0056 dans le forum Installation, migration et administration
    Réponses: 1
    Dernier message: 07/08/2012, 10h23
  2. Impossible d'exporter le resultat d'une requête
    Par uloaccess dans le forum Access
    Réponses: 5
    Dernier message: 21/02/2008, 19h20
  3. Exportation des données d'une base Oracle sous forms
    Par moezsokrati dans le forum Forms
    Réponses: 4
    Dernier message: 13/10/2005, 08h55
  4. exporter des objets d'une base vers une autre
    Par RGShoop dans le forum Access
    Réponses: 3
    Dernier message: 07/09/2005, 11h52
  5. Réponses: 7
    Dernier message: 20/03/2005, 14h53

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