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

Langage C++ Discussion :

Erreur de compilation template sous GCC MINGW


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 25
    Points : 24
    Points
    24
    Par défaut Erreur de compilation template sous GCC MINGW
    Bonjour,

    sous Windows 7-64, avec Visual studio le code (ci dessous extrait d'une librairie) se compile, sous MingW gcc
    j'ai l'erreur :

    In file included from C:\test\juce\modules\juce_audio_devices\juce_audio_devices.cpp:171:0:
    C:\test\juce\modules\juce_audio_devices\native/juce_win32_WASAPI.cpp:100:19: error: 'UUIDGetter' is not a class template
    template<> struct UUIDGetter <name> { static CLSID get() { return uuidFromString (guid); } }; \
    le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    #if JUCE_MINGW
    #define JUCE_COMCLASS(name, guid) \
    struct name; \
    template<> struct UUIDGetter <name>  { static CLSID get() { return uuidFromString (guid); } }; \
    struct name
    struct PROPERTYKEY
    {
    GUID fmtid;
    DWORD pid;
    };
    WINOLEAPI PropVariantClear (PROPVARIANT*);
    #else 
     #define JUCE_COMCLASS(name, guid)       struct __declspec (uuid (guid)) name
    #endif
    Débutant en C++, je ne comprends pas trés bien la définition du template avec le define.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le define contient une spécialisation de template, mais l'erreur semble être qu'il manque la définition "normale" du template en question.
    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.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    la constante de compilation "JUCE_MINGW" est égale à quoi lors de cette compilation sous VS ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 25
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par bacelar Voir le message
    la constante de compilation "JUCE_MINGW" est égale à quoi lors de cette compilation sous VS ?
    Bonjour,

    JUCE_MINGW=0 sous VS, elle n'est pas définie

    /MP /GS /GL /analyze- /W4 /Zc:wchar_t /I"..\..\JuceLibraryCode" /I"..\..\..\..\modules" /Zi /Gm- /O1 /Fd"Release\\" /fp:precise /D "WIN32" /D "_WINDOWS" /D "NDEBUG" /D "JUCER_VS2013_78A5020=1" /D "JUCE_APP_VERSION=1.0.0" /D "JUCE_APP_VERSION_HEX=0x10000" /errorReport:prompt /WX- /Zc:forScope /GR /Gd /Oy- /MT /Fa"Release\\" /EHsc /nologo /Fo"Release\\" /Fp"Release\PluckedStringsDemo.pch"
    sous codeblocks MINGW
    <Compiler>
    <Add option="-Os" />
    <Add option="-std=c++11" />
    <Add option="-mstackrealign" />
    <Add option='-D&quot;JUCE_WINDOWS=1&quot;' />
    <Add option="-D__MINGW__=1" />
    <Add option="-D__MINGW_EXTENSION=" />
    <Add option="-DNDEBUG=1" />
    <Add option="-DJUCER_CODEBLOCKS_20734A5D=1" />
    <Add option="-DJUCE_APP_VERSION=1.0.0" />
    <Add option="-DJUCE_APP_VERSION_HEX=0x10000" />
    <Add directory="." />
    <Add directory="../../JuceLibraryCode" />

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    >JUCE_MINGW=0 sous VS, elle n'est pas définie
    Faudrait savoir, soit JUCE_MINGW est défini et vos 0 soit elle n'est pas défini.
    C'est pas pareil.

    Le message d'erreur semble montrer que JUCE_MINGW est défini (soit via des options du compilateur, soit via des fichiers d'en-tête).
    Et si c'est le cas, la présence de "MINGW" dans le nom de la constante semble indiquée un flag spécifique à MINGW, donc non compatible avec VC++.

    Pour en avoir le cœur net, utilisez l'option de compilation "/P" pour avoir le résultat en sortie du préprocesseur.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 25
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par bacelar Voir le message
    >JUCE_MINGW=0 sous VS, elle n'est pas définie
    Faudrait savoir, soit JUCE_MINGW est défini et vos 0 soit elle n'est pas défini.
    C'est pas pareil.

    Le message d'erreur semble montrer que JUCE_MINGW est défini (soit via des options du compilateur, soit via des fichiers d'en-tête).
    Et si c'est le cas, la présence de "MINGW" dans le nom de la constante semble indiquée un flag spécifique à MINGW, donc non compatible avec VC++.

    Pour en avoir le cœur net, utilisez l'option de compilation "/P" pour avoir le résultat en sortie du préprocesseur.
    sous VS avec l'option /P:
    le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JUCE_COMCLASS (MMDeviceEnumerator, "BCDE0395-E52F-467C-8E3D-C4579291692E");
    dans le fichier .i
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct __declspec (uuid ("BCDE0395-E52F-467C-8E3D-C4579291692E")) MMDeviceEnumerator;
    donc le define tient bien en compte le type de compilateur (VS ou MINGW)

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 25
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Le define contient une spécialisation de template, mais l'erreur semble être qu'il manque la définition "normale" du template en question.
    désolé avec un peu de retard, la définition normale du template? ou est la spécialisation?

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    donc le define tient bien en compte le type de compilateur (VS ou MINGW)
    Ok

    Le message d'erreur fait mention de "UUIDGetter", qui n'existe pas dans le .i, vous êtes sur que vous avez utilisé les mêmes constantes de compilation ?
    Si oui "UUIDGetter" est où dans le .i ?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 25
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Ok

    Le message d'erreur fait mention de "UUIDGetter", qui n'existe pas dans le .i, vous êtes sur que vous avez utilisé les mêmes constantes de compilation ?
    Si oui "UUIDGetter" est où dans le .i ?
    en VS le code est traduit "sans le UUIDGetter" (JUCE_MINGW=0):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define JUCE_COMCLASS(name, guid)       struct __declspec (uuid (guid)) name
    par contre j'ai recherché si il y avait une autre définition dans la librairie de UUIDGetter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    #if ! (defined (_MSC_VER) || defined (__uuidof))
    template<typename Type> struct UUIDGetter { static CLSID get() { jassertfalse; return CLSID(); } };
    #define __uuidof(x)  UUIDGetter<x>::get()
    #endif
    inline GUID uuidFromString (const char* const s) noexcept
    {
        unsigned long p0;
        unsigned int p1, p2, p3, p4, p5, p6, p7, p8, p9, p10;
     
      #ifndef _MSC_VER
        sscanf
      #else
        sscanf_s
      #endif
            (s, "%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X",
                  &p0, &p1, &p2, &p3, &p4, &p5, &p6, &p7, &p8, &p9, &p10);
     
        GUID g = { p0, (uint16) p1, (uint16) p2, { (uint8) p3, (uint8) p4, (uint8) p5, (uint8) p6,
                                                   (uint8) p7, (uint8) p8, (uint8) p9, (uint8) p10 }};
        return g;
    }
    ce header "native/juce_win32_ComSmartPtr.h" est apppelé uniqument si JUCE_WINDOWS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #elif JUCE_WINDOWS
    #include "native/juce_win32_ComSmartPtr.h"
    #include "native/juce_win32_Files.cpp"
    #include "native/juce_win32_Network.cpp"
    #include "native/juce_win32_Registry.cpp"
    #include "native/juce_win32_SystemStats.cpp"
    #include "native/juce_win32_Threads.cpp"

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    "UUIDGetter" est où dans le .i ? (BIS)

    Si oui, donnez le code l'entourant, comme ça on saura quelle branche des #ifdef est utilisé.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 25
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par bacelar Voir le message
    "UUIDGetter" est où dans le .i ? (BIS)

    Si oui, donnez le code l'entourant, comme ça on saura quelle branche des #ifdef est utilisé.
    sous VS il n'y a pas de définition de UUIDGetter dans le *.i, l'erreur n'est pas sous VS mais MINGW, pourquoi chercher dans ce sens?

    sous MINGW dont la définition est fonction d'un header_platform
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      #ifdef __MINGW32__
        #define JUCE_MINGW 1
        #ifdef __MINGW64__
          #define JUCE_64BIT 1
        #else
          #define JUCE_32BIT 1
        #endif
      #endif
    le préprocesseur donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    pour:
    JUCE_COMCLASS (MMDeviceEnumerator, "BCDE0395-E52F-467C-8E3D-C4579291692E");
    ceci:
    struct MMDeviceEnumerator; template<> struct UUIDGetter <MMDeviceEnumerator> { static CLSID get() { return uuidFromString ("BCDE0395-E52F-467C-8E3D-C4579291692E"); } }; struct MMDeviceEnumerator;

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    ↑Ceci est une spécialisation du template UUIDGetter, mais ce n'est pas la définition du template.
    Le compilo doit connaître le template lui-même avant de pouvoir le spécialiser, c'est justement pour ça qu'il gueule.
    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.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 25
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    ↑Ceci est une spécialisation du template UUIDGetter, mais ce n'est pas la définition du template.
    Le compilo doit connaître le template lui-même avant de pouvoir le spécialiser, c'est justement pour ça qu'il gueule.
    Pour résumer :
    1) définition de la spécialisation du template:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #if JUCE_MINGW
    #define JUCE_COMCLASS(name, guid) \
    struct name; \
    template<> struct UUIDGetter <name>  { static CLSID get() { return uuidFromString (guid); } }; \
    struct name
    2) donne pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JUCE_COMCLASS (MMDeviceEnumerator, "BCDE0395-E52F-467C-8E3D-C4579291692E");
    ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct MMDeviceEnumerator; template<> struct UUIDGetter <MMDeviceEnumerator> { static CLSID get() { return uuidFromString ("BCDE0395-E52F-467C-8E3D-C4579291692E"); } }; struct MMDeviceEnumerator;
    3) le compilateur dit erreur car pas de définition du template UUIGetter
    4) définition du template UUIGetter dans la librairie :
    template<typename Type> struct UUIDGetter { static CLSID get() { jassertfalse; return CLSID(); } };
    possible ? Type?
    5) et pourquoi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define __uuidof(x)  UUIDGetter<x>::get()
    on remplace une fonction windows MSV par un équivalent pour MINGW?

    Merci pour ces clarifications, mais il me semble que de ne pas utiliser MVS sous Windows pose vraiment des problèmes

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Désolé pour mes remarques à coté de la plaque, j'avais pas saisi toute la subtilité du titre de la file de message.

    mais il me semble que de ne pas utiliser MVS sous Windows pose vraiment des problèmes
    C'est pas vraiment Windows mais COM, qui est un modèle de programmation assez daté, même sous Windows, qui complexifie un peu le biniou.

    Comme Médinoc le répète depuis le début, il faut le compilateur connaisse la définition du template pour comprendre sa spécialisation.

    Si j'ai bien compris vos messages, oui, il faut que la constante de compilation "JUCE_WINDOWS" soit défini pour que la définition du template soit connue au moment opportun.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 25
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Désolé pour mes remarques à coté de la plaque, j'avais pas saisi toute la subtilité du titre de la file de message.


    C'est pas vraiment Windows mais COM, qui est un modèle de programmation assez daté, même sous Windows, qui complexifie un peu le biniou.

    Comme Médinoc le répète depuis le début, il faut le compilateur connaisse la définition du template pour comprendre sa spécialisation.

    Si j'ai bien compris vos messages, oui, il faut que la constante de compilation "JUCE_WINDOWS" soit défini pour que la définition du template soit connue au moment opportun.
    Point clore ce point, et une cross compilation VS2013 + MINGW 4.9 qui marche :

    1) pour le fichier d'utilisation du template (juce_win32_WASAPI.cpp), je n'ai rien modifié sauf ajout de 2 UNDEF par en rapport source cause link error
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //  modif ajout de ces 2 undef
    #undef KSDATAFORMAT_SUBTYPE_PCM
    #undef KSDATAFORMAT_SUBTYPE_IEEE_FLOAT
     
    #ifndef KSDATAFORMAT_SUBTYPE_PCM
     #define KSDATAFORMAT_SUBTYPE_PCM         uuidFromString ("00000001-0000-0010-8000-00aa00389b71")
     #define KSDATAFORMAT_SUBTYPE_IEEE_FLOAT  uuidFromString ("00000003-0000-0010-8000-00aa00389b71")
    #endif
    2) pour la gestion du template du fichier (juce_win32_SystemStats.cpp), problème definition __uuidof et Mingw
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #ifndef JUCE_WIN32_COMSMARTPTR_H_INCLUDED
    #define JUCE_WIN32_COMSMARTPTR_H_INCLUDED
     
    // modif ajout de 3 lignes
    #ifdef __uuidof
    #undef __uuidof
    #endif
     
    #if  ! (defined (_MSC_VER) || defined (__uuidof))
    template<typename Type> struct UUIDGetter { static CLSID get() { jassertfalse; return CLSID(); } };
    #define __uuidof(x)  UUIDGetter<x>::get()
    #endif
    En fait , undef force la definition du template si : ni MSC et ni __uuidof
    ma connaissance des différents compilateurs ne permet pas d'élaborer un test plus sélectif.

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

Discussions similaires

  1. [SDL 2.0] Compilation avec gcc (mingw) , erreur de link?
    Par Devprek dans le forum SDL
    Réponses: 3
    Dernier message: 10/02/2015, 10h02
  2. Erreurs de compilation avec MinGW GCC 4.4
    Par DarkVenoM dans le forum C++
    Réponses: 5
    Dernier message: 06/02/2011, 04h01
  3. [Compilation] erreur sous gcc, pas sur Visual
    Par poukill dans le forum C++
    Réponses: 2
    Dernier message: 30/03/2009, 12h38
  4. Erreur de compilation Winsock2 sous C::B
    Par A_B dans le forum Code::Blocks
    Réponses: 3
    Dernier message: 27/05/2007, 15h53
  5. Réponses: 4
    Dernier message: 27/08/2003, 21h34

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