erreur: échec de la lecture du module compilé: aucun fichier ou répertoire de ce type

Dec 21 2020

Je viens d'acheter le livre Beginning C ++ 20 (la version eBook) et j'essaye de compiler le premier exemple en utilisant la nouvelle méthode C ++ 20.

Le contenu du fichier source est

// Ex1_01.cpp
// A Complete C++ program
import <iostream>;

int main()
{
    int answer{42};     // Defines answer with 42
    std::cout << "The answer to life, the universe, and everything is "
        << answer
        << std::endl;
    return 0;
}

Si je comprends bien, cela n'est pas encore pris en charge par GCC version 10 ou 11 (certains sites affirment que GCC 11 le prend en charge, mais lorsque j'utilise l'indicateur -fmodules-ts, certains suggèrent qu'il y a un message d'erreur indiquant qu'il n'est pas implémenté / expérimental et quitte.

Après quelques recherches, j'ai trouvé des articles faisant référence à https://gcc.gnu.org/wiki/cxx-modules où il y a des instructions pour installer une version de GCC 10 avec prise en charge des modules (en utilisant l'indicateur -fmodules-ts) mais lorsque j'utilise cela sur mon exemple de code, j'obtiens l'erreur suivante:

In module imported at Ex1_01.cpp:3:1:
/usr/local/include/c++/10.0.0/iostream: error: failed to read compiled module: No such file or directory
/usr/local/include/c++/10.0.0/iostream: note: compiled module file is ‘gcm.cache/./usr/local/include/c++/10.0.0/iostream.gcm’
/usr/local/include/c++/10.0.0/iostream: fatal error: jumping off the crazy train to crashville
compilation terminated.

La version de gcc est: g ++ (GCC) 10.0.0 20200110 (expérimental) [svn-280157: 20201220-1704] J'ai trouvé un article ici sur Stack Overflow où quelqu'un pointe vers cette version ( Comment compiler du code C ++ en utilisant modules-ts et gcc (expérimental)? )

J'ai également essayé les exemples du wiki (hello.cc et main.cc) mais ceux-ci donnent également un message d'erreur:

In module imported at main.cpp:1:1:
hello: error: failed to read compiled module: No such file or directory
hello: note: compiled module file is ‘gcm.cache/hello.gcm’
hello: fatal error: jumping off the crazy train to crashville
compilation terminated.

Existe-t-il un moyen de faire en sorte que cela fonctionne, ou devrais-je simplement commencer avec la "vieille" méthode #include jusqu'à ce qu'il y ait une version stable de GCC 11 avec le support des modules? Si je comprends bien, si je construis le dernier instantané de GCC 11, la plupart des autres codes spécifiques à C ++ 20 devraient fonctionner? (ou simplement s'en tenir à la version par défaut (g ++ (Debian 10.2.1-1) 10.2.1 20201207) fournie par ma distribution?)

Réponses

Patrick Dec 21 2020 at 16:38

Je suppose que je vais répondre à ma propre question.

Lorsque je suis les instructions sur le wiki GCC (https://gcc.gnu.org/wiki/cxx-modules) c'est une version plus récente que celle trouvée sur svn.

Le svn a une version 10 de gcc tandis que github a la version 11.

Lorsque je compile la version pour github (g ++ (GCC) 11.0.0 20201217 (expérimental) [c ++ - modules révision 20201220-2203]), les exemples fournis par le Wiki GCC se compilent et fonctionnent. Ces fichiers sont hello.cpp:

module;
#include <iostream>
#include <string_view>
export module hello;
export void greeter (std::string_view const &name)
{
  std::cout << "Hello " << name << "!\n";
}

et main.cpp

import hello;
int main (void)
{
  greeter ("world");
  return 0;
}

La commande à compiler est: g ++ -fmodules-ts hello.cpp main.cpp

Si je comprends bien, l'ordre des fichiers source est important, donc hello.cpp doit être compilé avant main.cpp

Donc, pour le moment, il semble que seuls les modules créés par l'utilisateur fonctionnent, mais pas ceux de la bibliothèque Standard (pour ceux-ci, #include est toujours nécessaire).

[edit] Il semble que le support des modules soit maintenant fusionné avec la branche principale de gcc-11 donc l'utilisation des builds de développeur via git ou svn n'est plus nécessaire (malheureusement, les en-têtes de bibliothèque standard comme ne sont pas encore convertis en modules, donc au importation du moment; ne fonctionne pas).