如果 C++ 标准库模板类函数在标头中定义,为什么在链接时会显示未定义的引用

问题描述 投票:0回答:1

<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 是一个模板类并且是在标头中定义的。 我通过编辑头文件并在函数上方放置 #error 块来检查编译器是否检测到定义

<bits/fstream.tcc>
中的代码,并且编译器找到了 if (这意味着所有 ifdef 都已通过)
有人可以解释一下为什么标头定义的模板类函数也需要以某种方式存在于 libstdc++ 中

我知道 mingw-w64 gcc 编译器可与 fstream 一起使用

open(wchar_t const* __s, std::ios_base::openmode __mode)

但我特别需要 msys 版本

    

c++ gcc fstream msys2 wchar-t
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.