erro: falha ao ler o módulo compilado: arquivo ou diretório inexistente

Dec 21 2020

Acabei de comprar o livro Beginning C ++ 20 (a versão eBook) e estou tentando compilar o primeiro exemplo usando o novo método C ++ 20.

O conteúdo do arquivo de origem é

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

Se bem entendi, isso ainda não é compatível com o GCC versão 10 ou 11 (alguns sites afirmam que o GCC 11 é compatível, mas quando eu uso a sinalização -fmodules-ts, como alguns sugerem, há uma mensagem de erro informando que não foi implementado / experimental e sai.

Depois de algumas pesquisas, encontrei alguns posts referindo-se a https://gcc.gnu.org/wiki/cxx-modules onde há instruções para instalar uma versão do GCC 10 com suporte para módulos (usando a sinalização -fmodules-ts), mas quando eu uso isso no meu código de exemplo, recebo o seguinte erro:

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.

A versão do gcc é: g ++ (GCC) 10.0.0 20200110 (experimental) [svn-280157: 20201220-1704] Eu encontrei um post aqui no Stack Overflow onde alguém aponta para esta versão ( Como compilar código C ++ usando modules-ts e gcc (experimental)? )

Também tentei os exemplos do wiki (hello.cc e main.cc), mas eles também apresentam uma mensagem de erro:

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 uma maneira de fazer isso funcionar ou devo apenas começar com o "antigo" método #include até que haja uma versão estável do GCC 11 com suporte para módulos? Pelo que entendi, se eu construir o instantâneo mais recente do GCC 11, a maioria dos outros códigos específicos do C ++ 20 deve funcionar? (ou apenas ficar com a versão padrão (g ++ (Debian 10.2.1-1) 10.2.1 20201207) fornecida pela minha distribuição?)

Respostas

Patrick Dec 21 2020 at 16:38

Acho que responderei minha própria pergunta.

Quando eu sigo as instruções no wiki do GCC (https://gcc.gnu.org/wiki/cxx-modules) é uma versão mais recente em comparação com a encontrada no svn.

O svn tem uma versão 10 do gcc enquanto o github tem a versão 11.

Quando eu compilo a versão para o github (g ++ (GCC) 11.0.0 20201217 (experimental) [c ++ - revisão dos módulos 20201220-2203]) os exemplos fornecidos pelo GCC Wiki compilam e funcionam. Esses arquivos são hello.cpp:

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

e main.cpp

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

O comando para compilar é: g ++ -fmodules-ts hello.cpp main.cpp

Pelo que entendi, a ordem dos arquivos de origem é importante, então hello.cpp precisa ser compilado antes de main.cpp

Então, no momento, parece que apenas os módulos feitos pelo usuário funcionam, mas não os da biblioteca padrão (para aqueles, #include ainda é necessário).

[editar] Parece que o suporte a módulos está agora mesclado com o branch principal do gcc-11, portanto, o uso das compilações do desenvolvedor através de git ou svn não é mais necessário (infelizmente, os cabeçalhos de biblioteca padrão como não foram convertidos em módulos ainda, então no importação de momento; não funciona).