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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 25
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    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 confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

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

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

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

    Informations forums :
    Inscription : Juillet 2010
    Messages : 25
    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 confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 449
    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 averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 25
    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 averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 25
    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 confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 449
    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 averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 25
    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 confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 449
    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é.

+ 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