我正在使用Visual Studio 2012构建一些Visual C ++ DLL和EXE项目。使用默认平台工具集 v110 构建时,构建成功,但在使用Windows XP兼容平台工具集构建时 v110_xp 它失败,每个项目中出现以下链接器错误:
LINK:致命错误LNK1104:无法打开文件',5.01'
请注意,如果我将平台从 Win32 更改为 x64 ,则错误会更改为:
LINK:致命错误LNK1104:无法打开文件',5.02'
通过在Visual Studio中的“Empty Project”模板中创建一个新的EXE项目并添加一些定义int main() {return 6;}
的* .cpp文件,可以轻松地重现这一点。它将成功构建,直到您将平台工具集从 v110 更改为 v110_xp 。
为什么会发生这种情况?如何在Windows XP兼容性下成功构建这些项目?
答案 0 :(得分:18)
在项目属性中,在链接器下 - > 系统,确保设置 SubSystem 属性(对于控制台应用程序控制台,或 >用于DLL和非控制台应用程序的Windows 。
如果使用公共属性表(* .props)在所有项目中设置项目属性,则可以添加类似这样的内容,以确保在项目中为 SubSystem 分配了有效值没有明确指定一个。
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemDefinitionGroup>
<Link>
<SubSystem Condition="'%(Link.SubSystem)'=='' Or '%(Link.SubSystem)'=='NotSet'">Windows</SubSystem>
</Link>
</ItemDefinitionGroup>
</Project>
为什么会这样?
选择 v110_xp 平台工具集会自动将最低要求版本链接器设置设置为 5.01 或 5.02 ,因为这是分别是32位和64位Windows XP的版本。
当设置 Minimum Required Version 属性时,无论是否还设置了 SubSystem ,Visual Studio都会尝试将这两个属性添加到链接器中。 ; s命令行参数。如果未设置 SubSystem (而不是预期的,5.01
),则会导致/SUBSYSTEM:CONSOLE,5.01
,并且链接器将此理解为尝试指定名为&#34;,5.01的文件&#34;
后者是Visual Studio中的错误(与 v110_xp 无直接关系)。如果设置最低要求版本并且 SubSystem 不是,则VS应该忽略最低要求版本或发出警告,但它不应该& #39; t向链接器发送格式错误的参数。