erro: falha ao ler o módulo compilado: arquivo ou diretório inexistente
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
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).