6 votes

Clangs C++ Module TS support : Comment dire à clang++ où trouver le fichier de module?

During his discours at CppCon, Richard Smith a mentionné que même si le support de TS des modules est actuellement en cours de développement, il peut déjà être utilisé. J'ai donc construit clang 4.0 à partir de svn et ai essayé cela sur un exemple très simple. Dans mon fichier myclass.cppm, j'ai défini une simple enveloppe pour un int

 module myclass;

 export class MyClass {
 public:
     MyClass (int i) 
          : _i{i} {}

     int get() {
          return _i;
     }
 private:
     int _i;
 }; 

et mon fichier main.cpp crée simplement une instance de cette classe et affiche son int retenu dans std::cout.

#include 
#include 
import myclass;

int main(int, char**) {
    MyClass three{3};
    std::cout << std::to_string(three.get()) << std::endl;
}

Ensuite j'ai essayé de le compiler via clang++ -std=c++1z -fmodules-ts main.cpp et avec clang++ -std=c++1z -fmodules-ts myclass.cppm main.cpp mais cela ne fonctionne pas et j'obtiens le même message d'erreur dans les deux cas :

main.cpp:3:8: erreur fatale : module 'myclass' introuvable
import test.myclass;
~~~~~~~^~~~
1 erreur générée.

Malheureusement je n'ai pas pu trouver de documentation pour -fmodules-ts. Est-ce que quelqu'un sait comment je pourrais obtenir clang++ à compiler mon exemple simple ?

1voto

Julian Kranz Points 11

Vous pouvez le compiler comme suit:

clang++ -std=c++1z -fmodules-ts --precompile -o myclass.pcm myclass.cppm 
clang++ -std=c++1z -fmodules-ts -fmodule-file=myclass.pcm -o modules_test main.cpp

Cependant, cela ne peut pas être la façon dont cela est censé fonctionner car vous auriez besoin d'encoder manuellement la hiérarchie des dépendances de vos modules dans les appels au compilateur; Je serais très intéressé par la réponse correcte à cette question :-).

0voto

mfojtak Points 1

-fprebuilt-module-path fonctionne même si elle déclenche un avertissement : "argument unused during compilation: '-fprebuilt-module-path=.'

La commande complète était :

clang++-4.0 -std=c++1z -fmodules-ts -fprebuilt-module-path=. -o modules_test main.cpp

0voto

xebo Points 512

Le 27 décembre 2017, j'ai vérifié la dernière branche llvm, je l'ai compilée sur mon macbook et ensuite j'ai exécuté ce qui suit:

./../bin/clang++ -std=c++17 -fmodules-ts --precompile -o myclass.pcm myclass.cppm ./../bin/clang++ -std=c++17 -fmodules-ts -c myclass.pcm -o myclass.o ./../bin/clang++ -std=c++17 -fmodules-ts -fprebuilt-module-path=. -o main main.cpp hello.o

et tada, ça a fonctionné parfaitement sans aucun avertissement ou erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X