Cmake UWP APPX1101错误,有2个唯一的数据文件

Cmake UWP APPX1101错误,有2个唯一的数据文件,cmake,uwp,windows-10-universal,Cmake,Uwp,Windows 10 Universal,我正在将一个相当大的项目转换为Windows10应用商店应用程序。我已经编译了它,现在无法通过几个APPX1101错误——“负载包含两个或多个具有相同目标路径的文件”。这些文件是项目的.xml文件,例如“baseDir\Assets\foo\timers.xml”和“baseDir\Assets\bar\timers.xml”。不同的文件和不同的路径 解决方案和项目由CMake(3.72)创建。已修改cmake文件以支持创建Windows 10应用商店应用程序平台配置 目录树似乎已展平,文件重叠

我正在将一个相当大的项目转换为Windows10应用商店应用程序。我已经编译了它,现在无法通过几个APPX1101错误——“负载包含两个或多个具有相同目标路径的文件”。这些文件是项目的.xml文件,例如“baseDir\Assets\foo\timers.xml”和“baseDir\Assets\bar\timers.xml”。不同的文件和不同的路径

解决方案和项目由CMake(3.72)创建。已修改cmake文件以支持创建Windows 10应用商店应用程序平台配置

目录树似乎已展平,文件重叠。但我无法理解如何或为什么。我看到的每个UWP项目在主项目下都包含一个“资产”文件夹,但这一个没有。我在名为“资源文件”的文件夹中看到Logo.png和SplashScreen.png等文件。导致错误的文件位于名为“资产”的文件夹下,该文件夹在UWP项目之前存在

主要是: 如何修复此错误?我误解了克马克吗

此外: 如何避免目录扁平化? 程序使用的几百个数据文件占用几百兆字节。我是否需要将它们添加到要打包的解决方案中

更新:

我收集了更多的信息,但还不足以完全满足这个问题。输出中的目录扁平化是由于文件是如何通过CMake添加到项目中的,以及原始Windows产品是如何打包的。XML文件以.vcxproj中的完整路径添加到项目中。.vcxproj.filters还使用文件的完整路径和类似“Data\foo”的筛选器。桌面Windows版本不需要在意,因为它知道在哪里可以找到与可执行文件相关的数据,并且是由外部工具打包的

我手动添加了一个“资产”过滤器,并修改了.vcxproj和.vcxproj.filters文件。.vcxproj文件需要在文件的include中添加属性。这将使用相对路径并消除APPX1101重复错误

.vcxproj

<XML Include="..\Base\Assets\foo\Data\timers.xml">
  <Link>Assets\foo\Data\timers.xml</Link>
</XML>

资产\foo\Data\timers.xml
.vcxproj.filters

<XML Include="..\Base\Assets\foo\Data\timers.xml">
  <Filter>Assets\foo</Filter>
</XML>

资产\foo
更新2

据我所知,不可能让CMake将
添加到XML和其他.vcxproj包含类型中。我浏览了最新的CMake源代码(3.8rc)。将
添加到cmVisualStudio10TargetGenerator::cmVisualStudio10TargetGenerator.cxx中的.vcxproj中。其他类型可以选择设置标志以添加
,但XML和其他数据类型没有设置标志的代码


我能看到的唯一选项是修改CMake源代码或重新处理项目,以使用与vcxproj.filters文件中包含的匹配项相同的
的相对路径添加数据文件。这只是CMake的一个问题。Visual Studio 2015/2017在您的树上添加资产没有问题。GitHub上的MS UWP示例用于在示例项目之间共享公共数据。

已经有一段时间了,我将此作为一个答案发布,以防其他人遇到此问题。我不认为它被接受,因为我发现解决方案相当薄弱。我对CMake的了解有限,对通用Windows应用程序的了解更少

主要问题是,通过设计,CMake无法构建可重新定位的解决方案。i、 e.您不能将Windows解决方案复制到另一个树上,并期望它与从VisualStudioIDE中生成的解决方案一样工作

第二个问题是,这是一个已经存在的大型项目,已经针对多个平台。我所说的巨大,是指它装在双层蓝光光盘上。资产文件的位置是固定的,位于CMake生成文件夹的位置之上。这会导致在将文件添加到布局时,只要文件的位置不在“预期资源”文件夹下,文件的路径就会被剥离

在当前的CMake(3.8)中,无法将
标记添加到项目文件中的include中。CMake创建的include标记具有文件的完整路径,而不是设计上的相对路径

我提出的解决方法是向批处理文件添加一个步骤,该步骤调用CMake编辑.vcproj和vcproj.filters文件,以更改固定资产路径相对路径,然后添加另一个步骤,在构建文件夹下创建一个符号链接/连接(SysInternals.com)到资产所在的位置。资源现在显示在预期资源文件夹下,现在已正确添加到布局中


正如我所说,这并不理想,但它确实有效。真正的解决方案是重新组织所有数据,但当大量数据由不同的脚本、工具、源和贡献者生成时,此项目不会发生这种情况。

您是否尝试过此解决方案,确保引用的版本没有冲突。但是基于您的例外情况,您的负载中似乎有两个示例xml文件,您可以在Visual Studio中编译您的项目吗?您可以分享您如何在CMakeLists.txt文件中设置资产文件吗<代码>设置(资产文件${资产文件}..@FranklinChen MSFT我已经将范围缩小到如何添加资产。用于创建.sln的CMake文件是从一个运行并已发布的Win64版本改编而来的。显然,有些内容遗漏了。解决方案编译时没有出现错误。问题发生在链接阶段。我将用我了解到的信息更新问题,他可能会这样做lp clearify.ASSET_文件仍然与Windows项目相同,这解释了为什么我在项目中没有典型的“Assets”过滤器。通过详细的输出,我可以看到添加的文件没有导致冲突的路径。我创建了一个Assets过滤器,然后手动编辑了.vcxproj,将a添加到相对于“Assets”的路径中对于该文件,似乎没有比符号链接和生成I更好的解决方案