设置PreferredToolArchitecture为x64时LNK4068/LNK1112构建失败问题咨询
PreferredToolArchitecture设为x64时触发LNK4068/LNK1112构建失败问题
问题现象
将环境变量PreferredToolArchitecture设置为x64时,构建流程触发LNK4068警告与LNK1112错误,最终导致构建失败,相关构建日志如下:
05-Jul-2022 09:43:39 Lib: 05-Jul-2022 09:43:39 05-Jul-2022 09:43:39 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64_x86\Lib.exe /OUT:"..\Lib\w2012r2\vs2015\release32mt\KerberosSupport.lib" /NOLOGO /LTCG w2012r2\vs2015\release32mt\KSDialog.res 05-Jul-2022 09:43:39 05-Jul-2022 09:43:39 w2012r2\vs2015\release32mt\KSKeytabOptionsDialog.obj 05-Jul-2022 09:43:39 05-Jul-2022 09:43:39 w2012r2\vs2015\release32mt\KSDSNConfiguration.obj 05-Jul-2022 09:43:39 05-Jul-2022 09:43:39 w2012r2\vs2015\release32mt\KSKrb5API_Windows.obj 05-Jul-2022 09:43:39 05-Jul-2022 09:43:39 w2012r2\vs2015\release32mt\KSUtilities.obj 05-Jul-2022 09:43:39 05-Jul-2022 09:43:39 w2012r2\vs2015\release32mt\KSKinitSupport.obj 05-Jul-2022 09:43:39 05-Jul-2022 09:43:39 w2012r2\vs2015\release32mt\KSAuthenticatedCredentials.obj 05-Jul-2022 09:43:39 05-Jul-2022 09:43:39 w2012r2\vs2015\release32mt\KSCredentialFactory.obj 05-Jul-2022 09:43:39 05-Jul-2022 09:43:39 w2012r2\vs2015\release32mt\KSCredentials.obj 05-Jul-2022 09:43:39 05-Jul-2022 09:43:39 w2012r2\vs2015\release32mt\KSGSSAPIWrapper.obj 05-Jul-2022 09:43:39 05-Jul-2022 09:43:39 w2012r2\vs2015\release32mt\KSLocalCredentials.obj 05-Jul-2022 09:43:39 05-Jul-2022 09:43:39 w2012r2\vs2015\release32mt\KSSecurity.obj 05-Jul-2022 09:43:39 05-Jul-2022 09:43:39 w2012r2\vs2015\release32mt\KSSecurityContext.obj 05-Jul-2022 09:43:39 05-Jul-2022 09:43:39 2>LINK : warning LNK4068: /MACHINE not specified; defaulting to X64 [C:\bamboo-agent-home\xml-data\build-dir\Drivers\DriverShared\KerberosSupport\Maintenance\10.1\Source\KerberosSupport_vs2015_NV.vcxproj] 05-Jul-2022 09:43:39 05-Jul-2022 09:43:39 2>w2012r2\vs2015\release32mt\KSKeytabOptionsDialog.obj : fatal error LNK1112: module machine type 'X86' conflicts with target machine type 'x64' [C:\bamboo-agent-home\xml-data\build-dir\Drivers\DriverShared\KerberosSupport\Maintenance\10.1\Source\KerberosSupport_vs2015_NV.vcxproj]
初步排查结论
问题核心诱因是对应构建配置下,项目文件的<Lib>节点未显式设置TargetMachine属性。修改PreferredToolArchitecture配置前,构建流程默认调用32位生成工具,工具自身位数决定了触发LNK4068警告时采用的默认目标平台类型。
待确认问题
- 微软官方文档对LIB工具的行为描述为:通常无需指定/MACHINE参数,LIB会从.obj文件推断目标计算机类型,仅在部分无法确定类型的场景下抛出错误。该描述是否存在错误?实际运行中LIB并未检测obj文件的平台类型,仅根据lib.exe自身位数选择默认目标平台,且未抛出推断失败错误而是直接使用默认值,和文档描述存在出入。
- 是否存在方案可以规避该问题,且无需修改原有依赖该默认行为的项目文件?是否可在调用msbuild的环节注入逻辑,根据项目目标平台自动设置对应的默认
TargetMachine值?
内容的提问来源于stack exchange,提问作者Bwmat
相关产品推荐
相关产品推荐

