代码之家  ›  专栏  ›  技术社区  ›  Stas Badzi

为什么c++标准库模板类函数在链接时会说未定义引用,如果它们是在头文件中定义的

  •  0
  • Stas Badzi  · 技术社区  · 9 月前

    使用时 <fstream> 具有 g++ -D_GLIBCXX_HAVE__WFOPEN=1 -D_GLIBCXX_USE_WCHAR_T=1 (msys2-gcc 13.3.0)它抛出一个错误

    /usr/lib/gcc/x86_64-pc-msys/13.3.0/../../../../x86_64-pc-msys/bin/ld: /tmp/cceEWaVo.o:x.cpp:(.text+0x50): undefined reference to `std::basic_ifstream<char, std::char_traits<char> >::open(wchar_t const*, std::_Ios_Openmode)'
    

    代码:

    #include <fstream>
    int main() {
    
    
            std::ifstream f("x.cpp"); // works
            f.close();
            f.open(L"x.cpp"); // doesn't link
    
            return 0;
    }
    

    即使是你,他们也被定义在 <bits/fstream.tcc> 女巫被包括在结尾 <fstream>

    我原本期望代码能够正常编译,因为ifstream是一个模板类,并且是在头文件中定义的。 我检查了代码是否输入 <bits/fstream.tcc> 这定义了 open(wchar_t const* __s, std::ios_base::openmode __mode) 编译器通过编辑头文件并在函数正上方放置一个#error块来检测if(这意味着所有的ifdef都被传递了)

    有人能解释一下为什么头定义的模板类函数也需要以某种方式存在于libstdc中吗++

    我知道mingw-w64gcc编译器适用于fstream open(wchar_t常量*__s,std::ios_base::openmode__mode) 但我特别需要微软的版本

    1 回复  |  直到 9 月前
        1
  •  0
  •   3CxEZiVlQ    9 月前

    这个 basic_ifstream 模板已声明 extern template class basic_ifstream<char> 因此,模板不是在用户代码中实例化的,而是在libstdc++中实例化的。由于后者是在没有问题中提到的实现定义的宏的情况下编译的,因此用户代码会得到未定义的引用 std::basic_ifstream<char, std::char_traits<char>>::open(wchar_t const*, std::_Ios_Openmode)' .

    推荐文章