VS14 generator adds Windows 10 SDK libs to AdditionalOptions element in vcxproj
Hi,
I think VS14 (2015) generator is generating wrong vcxproj
files. When a Windows 10 SDK is installed in the host, the Windows 10 system libraries needed to link the app are added to the AdditionalOptions
subsection in Link
element instead to AdditionalDependencies
, in many cases with the full path (what is most likely right). Since AdditionalOptions
are mainly 'unknown' options, they are just barely passed by to the linker 'as-is', and also separator is space. Windows 10 system libraries are added in most cases with full path but non-escaped, so white spaces are used and are indistinguishable from any other space in the options list. Result is paths are passes non-escaped to link.exe
command line and libraries not properly understood by linker.
vcxproj
file example:
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|x64"><Configuration>Debug</Configuration><Platform>x64</Platform</ProjectConfiguration>
...
<Link>
<AdditionalDependencies>
myLib01.lib;myLib02.lib;myLib03.lib;myLib04.lib;myLib05.lib;myLib06.lib;myLib07.lib;myLib08.lib;myLib09.lib;myLib10.lib;
Commons.lib;myLib11.lib;myLib12.lib;myLib13.lib;C:\.repo\3rd-party\....\win64\vc14\lib\3rdlib1.lib;
C:\.repo\3rd-party\qt\5.13.0\win64\vc14\lib\Qt5UiToolsd.lib;C:\.repo\3rd-party\qt\5.13.0\win64\vc14\lib\Qt5OpenGLd.lib;
...many more Qt libs...;
C:\.repo\3rd-party\qt\5.13.0\win64\vc14\lib\qtmaind.lib;C:\.repo\3rd-party\....\win64\vc14\lib\3rdlib2.lib;
...many other dependencies...;
kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib
</AdditionalDependencies>
<AdditionalLibraryDirectories>
c:/.repo/blablo/..../win64/vc14/$(ConfigurationName);c:/.repo/blablo/..../win64/vc14/$(ConfigurationName)/$(Configuration);
... several others ...;
%(AdditionalLibraryDirectories)
</AdditionalLibraryDirectories>
<AdditionalOptions>%(AdditionalOptions) /machine:x64 glu32.lib opengl32.lib gdi32.lib user32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.14393.0\um\x64\ole32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.14393.0\um\x64\oleaut32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.14393.0\um\x64\user32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.14393.0\um\x64\gdi32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.14393.0\um\x64\advapi32.lib glu32.lib opengl32.lib gdi32.lib user32.lib glu32.lib opengl32.lib gdi32.lib user32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.14393.0\um\x64\ole32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.14393.0\um\x64\oleaut32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.14393.0\um\x64\user32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.14393.0\um\x64\gdi32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.14393.0\um\x64\advapi32.lib glu32.lib opengl32.lib gdi32.lib user32.lib</AdditionalOptions>
<GenerateDebugInformation>true</GenerateDebugInformation>
<IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
<ImportLibrary>C:/developments/blahblah/WS/build/blahblah/blahblah/Debug/blahblah.lib</ImportLibrary>
<ProgramDataBaseFile>C:/developments/blahblah/WS/build/blahblah/blahblah/Debug/blahblah.pdb</ProgramDataBaseFile>
<SubSystem>Console</SubSystem>
</Link>
(I do not edit AdditionalOptions
to keep it as-is approx.)
My env:
C:\Program Files (x86)\Microsoft Visual Studio 14.0>ver
Microsoft Windows [Versión 6.1.7601]
VS:
Microsoft Visual Studio Community 2015
Version 14.0.25431.01 Update 3
Microsoft .NET Framework
Version 4.6.01055
Installed Version: Community
C:\developments>cmake --version
cmake version 3.16.4
CMake suite maintained and supported by Kitware (kitware.com/cmake).
CMake invokation:
cmake -G "Visual Studio 14 2015" -A x64 ....
link.exe invokation (selected fragment):
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\x86_amd64\link.exe /ERRORREPORT:QUEUE ... lots of right stuff coherent with vcxproj file... myLib11.lib "C:\.repo\3rd-party\....\win64\vc14\lib\3rdlib2d.lib" "C:\.repo\3rd-party\qt\5.13.0\win64\vc14\lib\Qt5UiToolsd.lib" ... lots of Qt and other quoted-path libs... WinHttp.lib Psapi.lib DbgHelp.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /DEBUG /PDB:"C:/developments/..../blahblah.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"C:/developments/..../blahblah/Debug/blahblah.lib" /MACHINE:X64 /machine:x64 glu32.lib opengl32.lib gdi32.lib user32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.14393.0\um\x64\ole32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.14393.0\um\x64\oleaut32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.14393.0\um\x64\user32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.14393.0\um\x64\gdi32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.14393.0\um\x64\advapi32.lib glu32.lib opengl32.lib gdi32.lib user32.lib glu32.lib opengl32.lib gdi32.lib user32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.14393.0\um\x64\ole32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.14393.0\um\x64\oleaut32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.14393.0\um\x64\user32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.14393.0\um\x64\gdi32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.14393.0\um\x64\advapi32.lib glu32.lib opengl32.lib gdi32.lib user32.lib
linker fails when finding first unqouted C:\Program Files\
... (after /machine:x64 duplicated directive)
Fix alternatives:
- to escape paths added to
AdditionalOptions
will make the trick, event when not a proper solution. - Add Windows 10 SDK libs with full path to
AdditionalDependencies
is a proper solution. - Add Windows 10 SDK libs without path to
AdditionalDependencies
and Windows 10 SDK lib path toAdditionalLibraryDirectories
is probably the best one. - Same than 3) deleting duplicated libs is probably desirable.
Cheers,