ошибка: не удалось прочитать скомпилированный модуль: нет такого файла или каталога
Я только что купил книгу Beginning C ++ 20 (электронная версия) и пытаюсь скомпилировать первый пример, используя новый метод 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 где есть инструкции по установке версии GCC 10 с поддержкой модулей (с использованием флага -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] Я нашел здесь сообщение о переполнении стека, где кто-то указывает на эту версию ( Как скомпилировать код C ++ с помощью модулей-ts и gcc (экспериментальный)? )
Я также пробовал примеры из вики (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.
Есть ли способ заставить эту работу работать, или я должен просто начать со «старого» метода #include, пока не будет стабильная версия GCC 11 с поддержкой модулей? Как я понимаю, если я создам последний снимок GCC 11, большинство других кодов, специфичных для C ++ 20, должны работать? (или просто придерживайтесь версии по умолчанию (g ++ (Debian 10.2.1-1) 10.2.1 20201207), поставляемой моим дистрибутивом?)
Ответы
Думаю, я отвечу на свой вопрос.
Когда я следую инструкциям вики GCC (https://gcc.gnu.org/wiki/cxx-modules) это более новая версия по сравнению с версией svn.
У svn есть версия gcc 10, а у github - версия 11.
Когда я компилирую версию для github (g ++ (GCC) 11.0.0 20201217 (экспериментальная) [c ++ - версия модулей 20201220-2203]), примеры, предоставленные GCC Wiki, компилируются и работают. Это файлы 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 больше не требуется (к сожалению, заголовки стандартной библиотеки, например, еще не преобразованы в модули, поэтому момент импорта; не работает).