Skip to content

fmt::println(std::cout, "Hello world") is broken in MSVC #4635

@stripe2933

Description

@stripe2933

Reproducer: Linux + Clang (Working) Windows + MSVC (Linker error)

Run cmake --build build --config release
[1/12] Scanning D:\a\fmttest\fmttest\main.cpp for CXX dependencies
[2/12] Scanning "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.44.35207\modules\std.compat.ixx" for CXX dependencies
std.compat.ixx
[3/12] Scanning D:\a\fmttest\fmttest\thirdparty\module-ports\fmt.cc for CXX dependencies
[4/12] Scanning "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.44.35207\modules\std.ixx" for CXX dependencies
std.ixx
[5/12] Generating CXX dyndep file CMakeFiles\__cmake_cxx23.dir\CXX.dd
[6/12] Generating CXX dyndep file CMakeFiles\fmttest.dir\CXX.dd
[7/12] Building CXX object CMakeFiles\__cmake_cxx23.dir\C_\Program_Files\Microsoft_Visual_Studio\2022\Enterprise\VC\Tools\MSVC\14.44.35207\modules\std.ixx.obj
std.ixx
[8/12] Building CXX object CMakeFiles\__cmake_cxx23.dir\C_\Program_Files\Microsoft_Visual_Studio\2022\Enterprise\VC\Tools\MSVC\14.44.35207\modules\std.compat.ixx.obj
std.compat.ixx
[9/12] Linking CXX static library __cmake_cxx23.lib
[10/12] Building CXX object CMakeFiles\fmttest.dir\thirdparty\module-ports\fmt.cc.obj
D:\a\fmttest\fmttest\thirdparty\module-ports\fmt.cc(97): warning C5050: Possible incompatible environment while importing module 'std': _UTF8 is defined in current command line and not in module command line
[11/12] Building CXX object CMakeFiles\fmttest.dir\main.cpp.obj
D:\a\fmttest\fmttest\main.cpp(1): warning C5050: Possible incompatible environment while importing module 'std': _UTF8 is defined in current command line and not in module command line
[12/12] Linking CXX executable fmttest.exe
FAILED: [code=4294967295] fmttest.exe 
C:\Windows\system32\cmd.exe /C "cd . && "C:\Program Files\CMake\bin\cmake.exe" -E vs_link_exe --msvc-ver=1944 --intdir=CMakeFiles\fmttest.dir --rc=C:\PROGRA~2\WI3CF2~1\10\bin\100261~1.0\x64\rc.exe --mt=C:\PROGRA~2\WI3CF2~1\10\bin\100261~1.0\x64\mt.exe --manifests  -- C:\PROGRA~1\MICROS~2\2022\ENTERP~1\VC\Tools\MSVC\1444~1.352\bin\Hostx64\x64\link.exe /nologo CMakeFiles\fmttest.dir\main.cpp.obj CMakeFiles\fmttest.dir\thirdparty\module-ports\fmt.cc.obj  /out:fmttest.exe /implib:fmttest.lib /pdb:fmttest.pdb /version:0.0 /machine:x64 /INCREMENTAL:NO /subsystem:console  /INCREMENTAL:NO /LTCG  vcpkg_installed\x64-windows-release\lib\fmt.lib  __cmake_cxx23.lib  kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && C:\Windows\system32\cmd.exe /C "cd /D D:\a\fmttest\fmttest\build && "C:\Program Files\PowerShell\7\pwsh.exe" -noprofile -executionpolicy Bypass -file C:/vcpkg/scripts/buildsystems/msbuild/applocal.ps1 -targetBinary D:/a/fmttest/fmttest/build/fmttest.exe -installedDir D:/a/fmttest/fmttest/build/vcpkg_installed/x64-windows-release/bin -OutVariable out""
LINK: command "C:\PROGRA~1\MICROS~2\2022\ENTERP~1\VC\Tools\MSVC\1444~1.352\bin\Hostx64\x64\link.exe /nologo CMakeFiles\fmttest.dir\main.cpp.obj CMakeFiles\fmttest.dir\thirdparty\module-ports\fmt.cc.obj /out:fmttest.exe /implib:fmttest.lib /pdb:fmttest.pdb /version:0.0 /machine:x64 /INCREMENTAL:NO /subsystem:console /INCREMENTAL:NO /LTCG vcpkg_installed\x64-windows-release\lib\fmt.lib __cmake_cxx23.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST:EMBED,ID=1" failed (exit code 1120) with the following output:
main.cpp.obj : error LNK2001: unresolved external symbol "struct _iobuf * __cdecl fmt::v12::detail::get_file(class std::basic_filebuf<char,struct std::char_traits<char> > &)" (?get_file@detail@v12@fmt@@YAPEAU_iobuf@@AEAV?$basic_filebuf@DU?$char_traits@D@std@@@std@@@Z)
fmttest.exe : fatal error LNK1120: 1 unresolved externals
ninja: build stopped: subcommand failed.
Error: Process completed with exit code 1.

fmt::println("Hello world") is okay, fmt::println(std::cost, "Hello world") or fmt::println(std::cerr, "Hello world") is broken in MSVC. I'm using 12.1.0 and C++20 module with -DFMT_IMPORT_STD -DFMT_ATTACH_TO_GLOBAL_MODULE compile definitions. This error is not occurred when using Clang + libc++.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions