エラー:コンパイルされたモジュールの読み取りに失敗しました:そのようなファイルまたはディレクトリはありません

Dec 21 2020

『Beginning C ++ 20』(eBookバージョン)を購入したばかりで、新しいC ++ 20メソッドを使用して最初の例をコンパイルしようとしています。

ソースファイルの内容は次のとおりです。

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

私が正しく理解している場合、これはGCCバージョン10または11ではまだサポートされていません(GCC 11がサポートしていると主張するサイトもありますが、-fmodules-tsフラグを使用すると、実装されていない/実験的であるというエラーメッセージが表示されます。終了します。

いくつか検索した後、私は参照しているいくつかの投稿を見つけました https://gcc.gnu.org/wiki/cxx-modules モジュールをサポートするバージョンのGCC10をインストールする手順がありますが(-fmodules-tsフラグを使用)、サンプルコードでそれを使用すると、次のエラーが発生します。

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.

gccのバージョンは次のとおりです。g++(GCC)10.0.0 20200110(実験的)[svn-280157:20201220-1704]誰かがこのバージョンを指しているStack Overflowの投稿を見つけました(modules-tsを使用してC ++コードをコンパイルする方法)およびgcc(実験的)?)

wikiの例(hello.ccとmain.cc)も試しましたが、エラーメッセージも表示されます。

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.

これを機能させる方法はありますか、それともモジュールをサポートするGCC 11の安定したリリースができるまで、「古い」#includeメソッドから始めるべきですか?GCC 11の最新のスナップショットを作成すると、他のほとんどのC ++ 20固有のコードが機能するはずです。(または、ディストリビューションで提供されているデフォルトの(g ++(Debian 10.2.1-1)10.2.1 20201207)バージョンをそのまま使用しますか?)

回答

Patrick Dec 21 2020 at 16:38

私は自分の質問に答えるつもりだと思います。

GCC wikiの指示に従うと(https://gcc.gnu.org/wiki/cxx-modules)svnにあるものと比較して新しいバージョンです。

svnにはバージョン10のgccがあり、githubにはバージョン11があります。

githubのバージョン(g ++(GCC)11.0.0 20201217(実験的)[c ++-モジュールリビジョン20201220-2203])をコンパイルすると、GCCWikiで提供されている例がコンパイルされて機能します。これらのファイルはhello.cppです。

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

およびmain.cpp

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

コンパイルするコマンドは次のとおりです。g++-fmodules-ts hello.cpp main.cpp

私が理解しているように、ソースファイルの順序は重要なので、hello.cppはmain.cppの前にコンパイルする必要があります

したがって、現時点では、ユーザーが作成したモジュールのみが機能し、標準ライブラリのモジュールは機能しないようです(これらのモジュールには引き続き#includeが必要です)。

[編集]モジュールのサポートがgcc-11のメインブランチに統合されたようです。そのため、gitまたはsvnを介した開発者ビルドの使用は不要になりました(残念ながら、のような標準ライブラリヘッダーはまだモジュールに変換されていないため、モーメントインポート;動作しません)。