2017-06-16 1 views
6

J'utilise clang Version 4.0.0 sur mon système exécutant ArchLinux, ça a toujours bien fonctionné, mais récemment je ne peux plus compiler des programmes qui utilisent certains en-têtes STL!Clang ne peut pas compiler les programmes en utilisant l'en-tête <functional>

Détails:

sortie de clang --version:

clang version 4.0.0 (tags/RELEASE_400/final) 
Target: x86_64-unknown-linux-gnu 
Thread model: posix 
InstalledDir: /usr/bin 

sortie de gcc --version:

gcc (GCC) 7.1.1 20170528 

Exemple:

J'ai essayé de compiler le programme trivial suivant:

#include <functional> 

int main() 
{ 
    return 0; 
} 

J'utilise la commande suivante:

clang++ -std=c++1z test.cxx

Et le résultat est l'échec:

In file included from test.cxx:3: 
In file included from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/functional:60: 
In file included from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/unordered_map:47: 
In file included from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/bits/hashtable.h:37: 
In file included from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/bits/node_handle.h:39: 
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/optional:1032:27: error: use of 
     class template 'optional' requires template arguments 
    template <typename _Tp> optional(_Tp) -> optional<_Tp>; 
         ^
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/optional:451:11: note: template 
     is declared here 
    class optional 
     ^
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/optional:1032:40: error: 
     expected ';' at end of declaration 
    template <typename _Tp> optional(_Tp) -> optional<_Tp>; 
            ^
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/optional:1032:41: error: cannot 
     use arrow operator on a type 
    template <typename _Tp> optional(_Tp) -> optional<_Tp>; 
             ^
3 errors generated. 

Est-ce un bogue dans le STL ou est ma configuration foiré?

+1

avez-vous essayé de réorganiser l'ordre des inclusions? C'est ce qui a parfois causé des programmes pour moi. Ou essayez de supprimer '#include ' et '#include ' aide ou conduit à une erreur différente –

+0

Vous semblez utiliser la bibliothèque standard gcc C++. Peut-être essayer d'utiliser le clang un. Quelque chose comme '-stdlib = libC++'. – juanchopanza

+0

@ThFl J'ai supprimé tous les autres en-têtes autres que "" et le problème persiste. Je vais modifier la question d'origine. Merci quand même. – nshct

Répondre

7

Votre configuration est en panne. Assez drôle, j'ai exactement le même problème.

Lors de la mise à niveau vers gcc 7.1.1, libstdC++ (qui est la bibliothèque standard de gcc) a été mis à jour parallèlement pour fournir les nouvelles fonctionnalités à partir de C++ 17. En utilisant gcc, cela fonctionne, car il supporte presque complètement le C++ 17.

Mais ce n'est pas le cas de clang. Un indice est le drapeau -std=c++1z au lieu du drapeau -std=c++17 de gcc. Clang manque deduction guides, et quand il les rencontre dans libstdC++, il ne sait pas quoi faire avec eux.

Vous pouvez installer l'ancien paquet libstdC++ à partir de l'ALA, ou vous pouvez télécharger/utiliser la bibliothèque standard libc++ de LLVM, qui n'a naturellement que des fonctionnalités C++ 17 partielles.

+1

Vous venez de résoudre un gros mal de tête que j'ai eu toute la journée. Clang et clang-tidy étouffaient tous les deux sur 'std :: thread {& Foo :: bar, this}'. Il s'avère qu'il échouait sur la déduction de modèle de classe. Je pourrais t'embrasser tout de suite. – maddisoj