Skip to content

Snappy and Brotli debug libraries linked in Release builds when using vcpkg with multi-config generators #49499

@marcin-krystianc

Description

@marcin-krystianc

When consuming Arrow via vcpkg with a multi-config CMake generator (Visual Studio) and a static triplet (x64-windows-static), Release builds link against debug versions of Snappy and Brotli. This causes LNK2038 (_ITERATOR_DEBUG_LEVEL / RuntimeLibrary mismatch) errors.

Steps to reproduce

Project "D:\workspace\arrow-vcpkg-issue\build\arrow_vcpkg_repro.sln" on node 1 (repro:Rebuild target(s)).
ValidateSolutionConfiguration:
  Building solution configuration "Release|x64".
ValidateProjects:
  The project "ALL_BUILD" is not selected for building in solution configuration "Release|x64".
Project "D:\workspace\arrow-vcpkg-issue\build\arrow_vcpkg_repro.sln" (1) is building "D:\workspace\arrow-vcpkg-issue\build\
repro.vcxproj.metaproj" (2) on node 1 (Rebuild target(s)).
Project "D:\workspace\arrow-vcpkg-issue\build\repro.vcxproj.metaproj" (2) is building "D:\workspace\arrow-vcpkg-issue\build
\ZERO_CHECK.vcxproj" (3) on node 1 (Rebuild target(s)).
CoreClean:
  Creating directory "x64\Release\ZERO_CHECK\".
PrepareForBuild:
  Structured output is enabled. The formatting of compiler diagnostics will reflect the error hierarchy. See https://aka.ms
  /cpp/structured-output for more details.
  Creating directory "x64\Release\ZERO_CHECK\ZERO_CHECK.tlog\".
InitializeBuildStatus:
  Creating "x64\Release\ZERO_CHECK\ZERO_CHECK.tlog\unsuccessfulbuild" because "AlwaysCreate" was specified.
  Touching "x64\Release\ZERO_CHECK\ZERO_CHECK.tlog\unsuccessfulbuild".
CustomBuild:
  1>Checking Build System
FinalizeBuildStatus:
  Deleting file "x64\Release\ZERO_CHECK\ZERO_CHECK.tlog\unsuccessfulbuild".
  Touching "x64\Release\ZERO_CHECK\ZERO_CHECK.tlog\ZERO_CHECK.lastbuildstate".
Done Building Project "D:\workspace\arrow-vcpkg-issue\build\ZERO_CHECK.vcxproj" (Rebuild target(s)).

Project "D:\workspace\arrow-vcpkg-issue\build\repro.vcxproj.metaproj" (2) is building "D:\workspace\arrow-vcpkg-issue\build
\repro.vcxproj" (4) on node 1 (Rebuild target(s)).
CoreClean:
  Creating directory "repro.dir\Release\".
PrepareForBuild:
  Structured output is enabled. The formatting of compiler diagnostics will reflect the error hierarchy. See https://aka.ms
  /cpp/structured-output for more details.
  Creating directory "D:\workspace\arrow-vcpkg-issue\build\Release\".
  Creating directory "repro.dir\Release\repro.tlog\".
InitializeBuildStatus:
  Creating "repro.dir\Release\repro.tlog\unsuccessfulbuild" because "AlwaysCreate" was specified.
  Touching "repro.dir\Release\repro.tlog\unsuccessfulbuild".
CustomBuild:
  Building Custom Rule D:/workspace/arrow-vcpkg-issue/CMakeLists.txt
ClCompile:
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\bin\HostX64\x64\CL.exe /c /nologo /W1 /
  WX- /diagnostics:column /O2 /Ob2 /D _WINDLL /D _MBCS /D WIN32 /D _WINDOWS /D NDEBUG /D ARROW_STATIC /D PARQUET_STATIC /D
  ARROW_FLIGHT_STATIC /D ARROW_FLIGHT_SQL_STATIC /D "CMAKE_INTDIR=\"Release\"" /D repro_EXPORTS /Gm- /EHsc /MT /GS /fp:prec
  ise /Zc:wchar_t /Zc:forScope /Zc:inline /std:c++20 /Fo"repro.dir\Release\\" /Fd"repro.dir\Release\vc143.pdb" /external:W0
   /Gd /TP /errorReport:queue  /external:I "D:/workspace/arrow-vcpkg-issue/build/vcpkg_installed/x64-windows-static/include
  " "D:\workspace\arrow-vcpkg-issue\repro.cpp"
  repro.cpp
Link:
  C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.44.35207\bin\HostX64\x64\link.exe /ERRORREPORT:Q
  UEUE /OUT:"D:\workspace\arrow-vcpkg-issue\build\Release\repro.dll" /INCREMENTAL:NO /NOLOGO "vcpkg_installed\x64-windows-s
  tatic\lib\parquet.lib" "vcpkg_installed\x64-windows-static\lib\arrow.lib" "vcpkg_installed\x64-windows-static\debug\lib\b
  rotlienc.lib" "vcpkg_installed\x64-windows-static\debug\lib\brotlidec.lib" "vcpkg_installed\x64-windows-static\debug\lib\
  brotlicommon.lib" "vcpkg_installed\x64-windows-static\lib\bz2.lib" "vcpkg_installed\x64-windows-static\lib\lz4.lib" "vcpk
  g_installed\x64-windows-static\debug\lib\snappy.lib" "vcpkg_installed\x64-windows-static\lib\zlib.lib" "vcpkg_installed\x
  64-windows-static\lib\zstd.lib" "vcpkg_installed\x64-windows-static\lib\thriftmd.lib" "vcpkg_installed\x64-windows-static
  \lib\libssl.lib" "vcpkg_installed\x64-windows-static\lib\libcrypto.lib" crypt32.lib ws2_32.lib kernel32.lib user32.lib gd
  i32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTUAC:"level=
  'asInvoker' uiAccess='false'" /manifest:embed /PDB:"D:/workspace/arrow-vcpkg-issue/build/Release/repro.pdb" /SUBSYSTEM:CO
  NSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"D:/workspace/arrow-vcpkg-issue/build/Release/repro.lib" /MACHINE:X64  /mac
  hine:x64 /DLL repro.dir\Release\repro.obj
snappy.lib(snappy.cc.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '2' doesn't match value '0'
 in repro.obj [D:\workspace\arrow-vcpkg-issue\build\repro.vcxproj]
snappy.lib(snappy.cc.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match va
lue 'MT_StaticRelease' in repro.obj [D:\workspace\arrow-vcpkg-issue\build\repro.vcxproj]
     Creating library D:/workspace/arrow-vcpkg-issue/build/Release/repro.lib and object D:/workspace/arrow-vcpkg-issue/buil
  d/Release/repro.exp
LINK : warning LNK4098: defaultlib 'LIBCMTD' conflicts with use of other libs; use /NODEFAULTLIB:library [D:\workspace\arro
w-vcpkg-issue\build\repro.vcxproj]
snappy.lib(snappy.cc.obj) : error LNK2019: unresolved external symbol _CrtDbgReport referenced in function "void * __cdecl
std::_Allocate_manually_vector_aligned<struct std::_Default_allocate_traits>(unsigned __int64)" (??$_Allocate_manually_vect
or_aligned@U_Default_allocate_traits@std@@@std@@YAPEAX_K@Z) [D:\workspace\arrow-vcpkg-issue\build\repro.vcxproj]
D:\workspace\arrow-vcpkg-issue\build\Release\repro.dll : fatal error LNK1120: 1 unresolved externals [D:\workspace\arrow-vc
pkg-issue\build\repro.vcxproj]
Done Building Project "D:\workspace\arrow-vcpkg-issue\build\repro.vcxproj" (Rebuild target(s)) -- FAILED.

Done Building Project "D:\workspace\arrow-vcpkg-issue\build\repro.vcxproj.metaproj" (Rebuild target(s)) -- FAILED.

Done Building Project "D:\workspace\arrow-vcpkg-issue\build\arrow_vcpkg_repro.sln" (repro:Rebuild target(s)) -- FAILED.


Build FAILED.

"D:\workspace\arrow-vcpkg-issue\build\arrow_vcpkg_repro.sln" (repro:Rebuild target) (1) ->
"D:\workspace\arrow-vcpkg-issue\build\repro.vcxproj.metaproj" (Rebuild target) (2) ->
"D:\workspace\arrow-vcpkg-issue\build\repro.vcxproj" (Rebuild target) (4) ->
(Link target) ->
  LINK : warning LNK4098: defaultlib 'LIBCMTD' conflicts with use of other libs; use /NODEFAULTLIB:library [D:\workspace\ar
row-vcpkg-issue\build\repro.vcxproj]


"D:\workspace\arrow-vcpkg-issue\build\arrow_vcpkg_repro.sln" (repro:Rebuild target) (1) ->
"D:\workspace\arrow-vcpkg-issue\build\repro.vcxproj.metaproj" (Rebuild target) (2) ->
"D:\workspace\arrow-vcpkg-issue\build\repro.vcxproj" (Rebuild target) (4) ->
(Link target) ->
  snappy.lib(snappy.cc.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '2' doesn't match value '
0' in repro.obj [D:\workspace\arrow-vcpkg-issue\build\repro.vcxproj]
  snappy.lib(snappy.cc.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match
value 'MT_StaticRelease' in repro.obj [D:\workspace\arrow-vcpkg-issue\build\repro.vcxproj]
  snappy.lib(snappy.cc.obj) : error LNK2019: unresolved external symbol _CrtDbgReport referenced in function "void * __cdec
l std::_Allocate_manually_vector_aligned<struct std::_Default_allocate_traits>(unsigned __int64)" (??$_Allocate_manually_ve
ctor_aligned@U_Default_allocate_traits@std@@@std@@YAPEAX_K@Z) [D:\workspace\arrow-vcpkg-issue\build\repro.vcxproj]
  D:\workspace\arrow-vcpkg-issue\build\Release\repro.dll : fatal error LNK1120: 1 unresolved externals [D:\workspace\arrow-
vcpkg-issue\build\repro.vcxproj]

Expected behavior

Release builds should link against release libraries. The vcpkg-installed Snappy and Brotli packages provide proper per-configuration CMake targets (IMPORTED_LOCATION_DEBUG / IMPORTED_LOCATION_RELEASE). Arrow's find modules should use them.

Environment

  • Arrow 23.0.1
  • vcpkg with triplet=x64-windows-static
  • Windows x64

Remarks

The problem is related (at least partially) to the changes from #46467. It seems that ARROW_VCPKG is empty instead of the expected "ON" value.

The #46565 claims it fixes the issue where ARROW_VCPKG is not defined, but in my repro, ARROW_VCPKG is still empty.

Component(s)

Packaging

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions