Fehler: Kompiliertes Modul konnte nicht gelesen werden: Keine solche Datei oder kein solches Verzeichnis

Dec 21 2020

Ich habe gerade das Buch Beginning C ++ 20 (die eBook-Version) gekauft und versuche, das erste Beispiel mit der neuen C ++ 20-Methode zu kompilieren.

Der Inhalt der Quelldatei ist

// 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;
}

Wenn ich das richtig verstehe, wird dies von GCC Version 10 oder 11 noch nicht unterstützt (einige Websites behaupten, dass GCC 11 dies unterstützt, aber wenn ich das Flag -fmodules-ts verwende, wie andere vermuten, gibt es eine Fehlermeldung, dass es nicht implementiert / experimentell ist und quitt.

Nach einigem Suchen habe ich einige Beiträge gefunden, auf die verwiesen wird https://gcc.gnu.org/wiki/cxx-modules Hier finden Sie Anweisungen zum Installieren einer Version von GCC 10 mit Unterstützung für Module (mithilfe des Flags -fmodules-ts). Wenn ich dies jedoch in meinem Beispielcode verwende, wird der folgende Fehler angezeigt:

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.

Die Version von gcc lautet: g ++ (GCC) 10.0.0 20200110 (experimentell) [svn-280157: 20201220-1704] Ich habe hier auf Stack Overflow einen Beitrag gefunden, in dem jemand auf diese Version verweist ( So kompilieren Sie C ++ - Code mit modules-ts und gcc (experimentell)? )

Ich habe auch die Beispiele aus dem Wiki (hello.cc und main.cc) ausprobiert, aber diese geben auch eine Fehlermeldung aus:

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.

Gibt es eine Möglichkeit, dies zum Laufen zu bringen, oder sollte ich einfach mit der "alten" # include-Methode beginnen, bis es eine stabile Version von GCC 11 mit Unterstützung für Module gibt? Wie ich verstehe, sollten die meisten anderen C ++ 20-spezifischen Codes funktionieren, wenn ich den neuesten Snapshot von GCC 11 erstelle? (oder halten Sie sich einfach an die Standardversion (g ++ (Debian 10.2.1-1) 10.2.1 20201207), die von meiner Distribution bereitgestellt wird?)

Antworten

Patrick Dec 21 2020 at 16:38

Ich werde wohl meine eigene Frage beantworten.

Wenn ich den Anweisungen im GCC-Wiki folge (https://gcc.gnu.org/wiki/cxx-modules) es ist eine neuere version im vergleich zu der auf svn.

Der SVN hat eine Version 10 von GCC, während Github Version 11 hat.

Wenn ich die Version für github kompiliere (g ++ (GCC) 11.0.0 20201217 (experimentell) [c ++ - Module Revision 20201220-2203]), kompilieren und funktionieren die Beispiele aus dem GCC Wiki. Diese Dateien sind hello.cpp:

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

und main.cpp

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

Der zu kompilierende Befehl lautet: g ++ -fmodules-ts hello.cpp main.cpp

Soweit ich weiß, ist die Reihenfolge der Quelldateien wichtig, daher muss hello.cpp vor main.cpp kompiliert werden

Im Moment scheinen also nur vom Benutzer erstellte Module zu funktionieren, nicht jedoch die Standardbibliotheksmodule (für diese ist #include noch erforderlich).

[Bearbeiten] Es scheint, dass die Modulunterstützung jetzt mit dem Hauptzweig von gcc-11 zusammengeführt wird, sodass die Verwendung der Entwickler-Builds über git oder svn nicht mehr erforderlich ist (leider werden die Standard-Bibliotheks-Header wie noch nicht in Module konvertiert, also bei der Momentimport; funktioniert nicht).