C++20 Module Linkerfehler



  • Hi,

    ich habe mal aus Neugierde versucht ein Hello World mit Modulen zu testen. Dazu habe ich in Visual Studio 2019 das Feature für Module installiert und in den Projekteinstellungen die Schalter /std:c++latest und /experimental:module angestellt. Soweit so gut, nun kompiliert der Sourcecode hier nicht und gibt Linkerfehler aus:

    import std.core;
    
    int main()
    {
        std::cout << "it works";
    }
    
    >module.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __thiscall std::ios_base::clear(int,bool)" (__imp_?clear@ios_base@std@@QAEXH_N@Z) referenced in function "public: void __thiscall std::basic_ios<char,struct std::char_traits<char> >::clear(int,bool)" (?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z)
    1>module.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: int __thiscall std::ios_base::rdstate(void)const " (__imp_?rdstate@ios_base@std@@QBEHXZ) referenced in function "public: void __thiscall std::basic_ios<char,struct std::char_traits<char> >::setstate(int,bool)" (?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z)
    1>module.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: bool __thiscall std::ios_base::good(void)const " (__imp_?good@ios_base@std@@QBE_NXZ) referenced in function "public: __thiscall std::basic_ostream<char,struct std::char_traits<char> >::sentry::sentry(class std::basic_ostream<char,struct std::char_traits<char> > &)" (??0sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@AAV12@@Z)
    1>module.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: int __thiscall std::ios_base::flags(void)const " (__imp_?flags@ios_base@std@@QBEHXZ) referenced in function "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl std::operator<<<struct std::char_traits<char> >(class std::basic_ostream<char,struct std::char_traits<char> > &,char const *)" (??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z)
    1>module.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __int64 __thiscall std::ios_base::width(__int64)" (__imp_?width@ios_base@std@@QAE_J_J@Z) referenced in function "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl std::operator<<<struct std::char_traits<char> >(class std::basic_ostream<char,struct std::char_traits<char> > &,char const *)" (??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z)
    1>module.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __int64 __thiscall std::ios_base::width(void)const " (__imp_?width@ios_base@std@@QBE_JXZ) referenced in function "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl std::operator<<<struct std::char_traits<char> >(class std::basic_ostream<char,struct std::char_traits<char> > &,char const *)" (??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z)
    1>module.obj : error LNK2019: unresolved external symbol "bool __cdecl std::uncaught_exception(void)" (?uncaught_exception@std@@YA_NXZ) referenced in function "public: __thiscall std::basic_ostream<char,struct std::char_traits<char> >::sentry::~sentry(void)" (??1sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@XZ)
    1>module.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) class std::basic_ostream<char,struct std::char_traits<char> > std::cout" (__imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A)
    1>C:\Users\User\Google Drive\work\cpp\module\Debug\module.exe : fatal error LNK1120: 8 unresolved externals
    1>Done building project "module.vcxproj" -- FAILED.
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
    

    Ok, da habe ich wohl ein Fehler gemacht oder diese Feature ist doch noch zu experimentell. Aber ändere ich den Sourcecode wie folgt um, funktioniert es. Kann mir das jemand erklären?

    import std.core;
    
    int main()
    {
        std::cout << "it works" << std::endl;
    }
    


  • Nein. Experimentell ist wohl untertrieben.



  • Keine Erklärung, aber ein Tip: Visual Studio hat so ein schönes "Send Feedback" Icon, ganz rechts oben, gleich unter dem Fenster-Schliess-X. Da kannst du drauf klicken und nen Bug reporten.



  • Danke für den Hinweis.


Log in to reply