error: no se pudo leer el módulo compilado: no existe tal archivo o directorio
Acabo de comprar el libro Beginning C ++ 20 (la versión del libro electrónico) y estoy tratando de compilar el primer ejemplo usando el nuevo método C ++ 20.
El contenido del archivo fuente es
// 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 entiendo correctamente, esto aún no es compatible con GCC versión 10 u 11 (algunos sitios afirman que GCC 11 lo admiten, pero cuando uso la marca -fmodules-ts, como algunos sugieren, hay un mensaje de error que indica que no está implementado / experimental y en paz.
Después de buscar, encontré algunas publicaciones que se refieren a https://gcc.gnu.org/wiki/cxx-modules donde hay instrucciones para instalar una versión de GCC 10 con soporte para módulos (usando el indicador -fmodules-ts) pero cuando lo uso en mi código de ejemplo, aparece el siguiente error:
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 versión de gcc es: g ++ (GCC) 10.0.0 20200110 (experimental) [svn-280157: 20201220-1704] Encontré una publicación aquí en Stack Overflow donde alguien apunta a esta versión ( Cómo compilar código C ++ usando modules-ts y gcc (experimental)? )
También probé los ejemplos de la wiki (hello.cc y main.cc) pero también dan un mensaje de error:
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.
¿Hay alguna manera de hacer que esto funcione, o debería simplemente comenzar con el método #include "antiguo" hasta que haya una versión estable de GCC 11 con soporte para módulos? Según tengo entendido, si construyo la última instantánea de GCC 11, la mayoría de los demás códigos específicos de C ++ 20 deberían funcionar. (¿O simplemente seguir con la versión predeterminada (g ++ (Debian 10.2.1-1) 10.2.1 20201207) proporcionada por mi distribución?)
Respuestas
Supongo que responderé a mi propia pregunta.
Cuando sigo las instrucciones de la wiki de GCC (https://gcc.gnu.org/wiki/cxx-modules) es una versión más nueva en comparación con la que se encuentra en svn.
El svn tiene una versión 10 de gcc mientras que github tiene la versión 11.
Cuando compilo la versión para github (g ++ (GCC) 11.0.0 20201217 (experimental) [c ++ - revisión de módulos 20201220-2203]), los ejemplos proporcionados por GCC Wiki se compilan y funcionan. Estos archivos son hello.cpp:
module;
#include <iostream>
#include <string_view>
export module hello;
export void greeter (std::string_view const &name)
{
std::cout << "Hello " << name << "!\n";
}
y main.cpp
import hello;
int main (void)
{
greeter ("world");
return 0;
}
El comando para compilar es: g ++ -fmodules-ts hello.cpp main.cpp
Según tengo entendido, el orden de los archivos fuente es importante, por lo que hello.cpp debe compilarse antes que main.cpp
Entonces, por el momento, parece que solo funcionan los módulos creados por el usuario, pero no los de la biblioteca estándar (para esos #include todavía es necesario).
[editar] Parece que el soporte de módulos ahora se fusiona con la rama principal de gcc-11, por lo que ya no es necesario usar las compilaciones de desarrollador a través de git o svn (desafortunadamente, los encabezados de biblioteca estándar como no se han convertido en módulos todavía, importación de momento; no funciona).