将
<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 版本
open(wchar_t const* __s, std::ios_base::openmode __mode)
模板被声明为
basic_ifstream
。因此,模板不是在用户代码中实例化,而是在 libstdc++ 中实例化。由于后者是在没有实现定义的宏的情况下编译的,因此用户代码获取对“std::basic_ifstream::open(wchar_t const*, std::_Ios_Openmode)”的未定义引用。