hata: derlenmiş modül okunamadı: Böyle bir dosya veya dizin yok

Dec 21 2020

Beginning C ++ 20 (eBook sürümü) kitabını yeni satın aldım ve ilk örneği yeni C ++ 20 yöntemini kullanarak derlemeye çalışıyorum.

Kaynak dosyanın içeriği

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

Doğru anladıysam, bu henüz GCC sürüm 10 veya 11 tarafından desteklenmiyor (bazı siteler GCC 11'in desteklediğini iddia ediyor, ancak bazılarının önerdiği için -fmodules-ts işaretini kullandığımda, bunun uygulanmadığını / deneysel olmadığını ve çıkar.

Biraz araştırdıktan sonra, atıfta bulunan bazı gönderiler buldum https://gcc.gnu.org/wiki/cxx-modules GCC 10'un modül desteğiyle (-fmodules-ts bayrağını kullanarak) bir sürümünü yüklemeye yönelik talimatların bulunduğu ancak bunu örnek kodumda kullandığımda aşağıdaki hatayı alıyorum:

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'nin sürümü: g ++ (GCC) 10.0.0 20200110 (deneysel) [svn-280157: 20201220-1704] Burada Stack Overflow'da birinin bu sürüme işaret ettiği bir gönderi buldum ( Modüller-ts kullanarak C ++ kodu nasıl derlenir ve gcc (deneysel)? )

Ayrıca wiki'deki (hello.cc ve main.cc) örnekleri de denedim ama bunlar da bir hata mesajı veriyor:

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.

Bunu çalıştırmanın bir yolu var mı, yoksa modül desteğiyle GCC 11'in kararlı bir sürümü olana kadar "eski" #include yöntemiyle mi başlamalıyım? Anladığım kadarıyla, GCC 11'in en son anlık görüntüsünü oluşturursam, diğer çoğu C ++ 20 özel kodunun çalışması gerekir mi? (veya dağıtımım tarafından sağlanan varsayılan (g ++ (Debian 10.2.1-1) 10.2.1 20201207) sürümüne bağlı kalsın mı?)

Yanıtlar

Patrick Dec 21 2020 at 16:38

Sanırım kendi sorumu cevaplayacağım.

GCC wiki'deki talimatları izlediğimde (https://gcc.gnu.org/wiki/cxx-modules) svn'de bulunanla karşılaştırıldığında daha yeni bir sürüm.

Svn, gcc'nin 10 sürümüne sahipken, github sürüm 11'e sahiptir.

Github için sürümü derlediğimde (g ++ (GCC) 11.0.0 20201217 (deneysel) [c ++ - modüller revizyonu 20201220-2203]) GCC Wiki tarafından sağlanan örnekler derlenir ve çalışır. Bu dosyalar hello.cpp şeklindedir:

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

ve main.cpp

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

Derleme komutu şudur: g ++ -fmodules-ts hello.cpp main.cpp

Kaynak dosyalarının sırasının önemli olduğunu anladığım kadarıyla hello.cpp'nin main.cpp'den önce derlenmesi gerekiyor.

Yani şu anda sadece kullanıcı yapımı modüller çalışıyor gibi görünüyor, ancak Standart kitaplık modülleri değil (bunlar için #include hala gereklidir).

[değiştir] Modül desteğinin artık gcc-11'in ana dalı ile birleştirildiği görülüyor, bu nedenle git veya svn aracılığıyla geliştirici derlemelerini kullanmak artık gerekli değil (ne yazık ki gibi standart kitaplık başlıkları henüz modüllere dönüştürülmedi, yani an içe aktarma; çalışmıyor).