C++ Visual Studio makefile项目的自定义平台

C++ Visual Studio makefile项目的自定义平台,c++,visual-studio,platform,C++,Visual Studio,Platform,我有一个基于makefile的项目,我编写了一个实用程序来生成VS 2015项目文件,并将它们连接到makefile命令,这样我就可以两全其美 不幸的是,我遇到了VisualStudio似乎不允许自定义平台名称的问题。例如,如果我的makefiles定义了两个平台,“Win32”和“Win64”,在尝试在VS中构建项目时(这只是进行命令行调用),我会得到以下错误: 错误MSB8006项目“codegen.vcxproj”的平台无效。平台='win64'。如果其他某个项目正试图遵循对此项目的项目到

我有一个基于makefile的项目,我编写了一个实用程序来生成VS 2015项目文件,并将它们连接到makefile命令,这样我就可以两全其美

不幸的是,我遇到了VisualStudio似乎不允许自定义平台名称的问题。例如,如果我的makefiles定义了两个平台,“Win32”和“Win64”,在尝试在VS中构建项目时(这只是进行命令行调用),我会得到以下错误:

错误MSB8006项目“codegen.vcxproj”的平台无效。平台='win64'。如果其他某个项目正试图遵循对此项目的项目到项目引用,此项目已卸载或未包含在解决方案中,并且引用项目未使用相同或等效的平台生成,则也可能出现此错误

如果我将win64重命名为x64,那么它可以正常工作,因为这是Visual Studio可以识别的平台,但这并不能解决根本问题,即我不希望仅限于Visual Studio能够识别的平台。我不明白为什么这会成为makefile项目的一个问题,因为我没有在VisualStudio中调用编译器。有人知道有什么方法可以欺骗VisualStudio接受makefile项目中无法识别的平台吗


编辑:我可以通过使我的所有配置采用uu的形式来解决这个问题,并且只需在实际平台字段中使用类似x64的占位符,但我仍然希望听到是否有真正的解决方案。

在导入Microsoft.Cpp.props之前,在项目文件顶部附近添加此属性:

<SkipInvalidConfigurations>True</SkipInvalidConfigurations>
True
更新VS2013的上述工作,但不更新VS2015的工作。对于后者,似乎没有适当的内置方式来跳过平台检查。如果你真的想要,你可以通过添加一个属性,比如

<PlatformTargetsFound>True</PlatformTargetsFound>
True
但我不推荐。正如评论中提到的:如果你想IDE,你必须遵循它的规则,这实际上意味着如果你告诉IDE的外观,我有一个C++项目使用NFIG,那么你必须有一个目录,用于你想要的程序文件\MSBug\\微软。CPP\V4.0\v140\平台。p>
最终的解决方案是创建一个自定义项目类型,该类型仅用作文件的容器,并具有构建/清理/重建目标。我不知道如何正确地执行此操作,这超出了这个问题的范围,但一个好的开始是删除prject文件中的行和,并添加一个名为“Build”的目标。

您的平台名为“Win64”,因此很可能实际上是“x64”,那么,为什么要使用非标准名称来混淆VS和其他人呢?我可以将其更改为x64并避免这种特殊情况,但如果我想在将来添加另一个平台(例如ps4),那么我将遇到同样的问题。当您让IDE构建您的程序时,平台名称很重要。它需要选择正确的编译器和链接器来生成正确风格的可执行文件。因此,名称不是任意的,您只能选择它知道的内容。在大多数机器上都是Win32、x64和ARM。当您使用makefile项目时,这不再重要,因为现在是makefile决定您使用的编译器/链接器。但您仍然必须选择一个有效的平台名称。配置名称(默认值为Debug和Release)可以是您想要的任何名称。可惜的是,即使在makefile项目中,它也是强制执行的,我不明白为什么这是必要的。但是在任何情况下,我都可以通过将我的所有配置转换为配置和平台的组合来解决这个问题。谢谢你的建议,但不幸的是,如果我添加了配置和平台,项目无法加载。什么错误?注意,您必须将属性放入PropertyGroup标记中。啊,将其放入PropertyGroup标记中修复了错误,但我仍然遇到了最初的问题。以下是我所拥有的:
True。。。更多XML
True有效,谢谢!出于兴趣,在我的具体案例中,IDE只是用作makefiles的编辑器和包装器,为什么不建议这样做呢?因为这样的措辞应该确保人们理解这不是一个100%确定的解决方案,因为a)我不知道是否有任何我没有看到的后果(尽管我对此表示怀疑)b)在未来版本中可能会再次中断。也就是说,如果我有一个使用它的用例,我会毫不犹豫地使用它:P