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 :
SNIPPEDSHARED_EXPORT étant le classique:
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(); };
Et voici enfin l'erreur :
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
Le message d'erreur est assez explicite en lui-même, et j'ai même trouvé des gens définissant leur propre qHash :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
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:
- utilisation d'une « instanciation de template explicite » :
- Explications générales : https://anteru.net/blog/2008/11/19/318/
- Documentation officielle https://msdn.microsoft.com/en-us/library/by56e477.aspx
- j'ai même trouvé des morceaux d'histoire : https://support.microsoft.com/en-us/kb/168958
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
- snipped.pro
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 QT -= gui TARGET = snipped TEMPLATE = lib DEFINES += SNIPPED_LIBRARY SOURCES += snipped.cpp- snipped.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #include "snipped.h" #include <QDebug> Snipped::Snipped() { qDebug("Coucou !");/*du code est requis sinon rien n'est généré*/ }- snipped.h
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> class SNIPPEDSHARED_EXPORT Snipped : public QList<QVariant> { public: Snipped(); }; #endif // SNIPPED_H- snipped_global.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 #ifndef SNIPPED_GLOBAL_H #define SNIPPED_GLOBAL_H #include <QtCore/qglobal.h> #if defined(SNIPPED_LIBRARY) # define SNIPPEDSHARED_EXPORT __declspec(dllexport) #else # define SNIPPEDSHARED_EXPORT __declspec(dllimport) #endif #endif // SNIPPED_GLOBAL_H
Partager