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:
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:
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 :
Citation:
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
- snipped.pro
Code:
1 2 3 4 5
| QT -= gui
TARGET = snipped
TEMPLATE = lib
DEFINES += SNIPPED_LIBRARY
SOURCES += snipped.cpp |
- snipped.cpp
Code:
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:
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:
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 |