error: gagal membaca modul yang dikompilasi: Tidak ada file atau direktori seperti itu
Saya baru saja membeli buku Beginning C ++ 20 (versi eBook) dan saya mencoba mengompilasi contoh pertama menggunakan metode C ++ 20 yang baru.
Isi dari file sumber adalah
// 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;
}
Jika saya memahaminya dengan benar, ini belum didukung oleh GCC versi 10 atau 11 (beberapa situs mengklaim bahwa GCC 11 mendukungnya, tetapi ketika saya menggunakan tanda -fmodules-ts karena beberapa menyarankan bahwa ada pesan kesalahan bahwa itu tidak diterapkan / eksperimental dan seri.
Setelah beberapa pencarian, saya menemukan beberapa posting yang merujuk ke https://gcc.gnu.org/wiki/cxx-modules di mana ada instruksi untuk menginstal versi GCC 10 dengan dukungan untuk modul (menggunakan tanda -fmodules-ts) tetapi ketika saya menggunakannya pada kode contoh saya, saya mendapatkan kesalahan berikut:
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.
Versi gcc adalah: g ++ (GCC) 10.0.0 20200110 (eksperimental) [svn-280157: 20201220-1704] Saya menemukan pos di sini di Stack Overflow di mana seseorang menunjuk ke versi ini ( Cara mengompilasi kode C ++ menggunakan modules-ts dan gcc (eksperimental)? )
Saya juga mencoba contoh dari wiki (hello.cc dan main.cc) tetapi mereka juga memberikan pesan kesalahan:
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.
Adakah cara untuk membuat ini berfungsi, atau haruskah saya memulai dengan metode #include "lama" sampai ada rilis stabil GCC 11 dengan dukungan untuk modul? Seperti yang saya pahami jika saya membuat snapshot terbaru dari GCC 11, sebagian besar kode khusus C ++ 20 lainnya harus berfungsi? (atau tetap gunakan versi default (g ++ (Debian 10.2.1-1) 10.2.1 20201207) yang disediakan oleh distribusi saya?)
Jawaban
Saya kira saya akan menjawab pertanyaan saya sendiri.
Saat saya mengikuti instruksi di wiki GCC (https://gcc.gnu.org/wiki/cxx-modules) Ini adalah versi yang lebih baru dibandingkan dengan yang ditemukan di svn.
Svn memiliki versi 10 dari gcc sementara github memiliki versi 11.
Ketika saya mengompilasi versi untuk github (g ++ (GCC) 11.0.0 20201217 (eksperimental) [c ++ - modul revisi 20201220-2203]) contoh yang diberikan oleh kompilasi dan pekerjaan GCC Wiki. File-file ini adalah hello.cpp:
module;
#include <iostream>
#include <string_view>
export module hello;
export void greeter (std::string_view const &name)
{
std::cout << "Hello " << name << "!\n";
}
dan main.cpp
import hello;
int main (void)
{
greeter ("world");
return 0;
}
Perintah yang akan dikompilasi adalah: g ++ -fmodules-ts hello.cpp main.cpp
Seperti yang saya pahami, urutan file sumber itu penting, jadi hello.cpp perlu dikompilasi sebelum main.cpp
Jadi saat ini tampaknya hanya modul buatan pengguna yang berfungsi, tetapi bukan yang pustaka Standar (untuk #include masih diperlukan).
[sunting] Tampaknya dukungan modul sekarang digabungkan dengan cabang utama gcc-11 sehingga menggunakan pengembang membangun melalui git atau svn tidak lagi diperlukan (sayangnya header perpustakaan standar seperti belum diubah menjadi modul, jadi di saat impor; tidak berfungsi).