如何解决Visual Studio 2010 Ultimate中的CVT1100?

时间:2010-08-04 07:16:52

标签: visual-studio-2010 resources

我正在开发一个使用qmake生成Visual Studio 2005项目文件的中型项目。我试图在Visual Studio 2010 Ultimate下构建它。由于qmake不支持此IDE,但我提供了转换助手转换我的解决方案。

尝试构建时,我在其中一个子项目中收到以下错误:

  

CVTRES:致命错误CVT1100:重复资源。类型:版本,名称:1,语言:苏图语

在Google的结果告诉我之后,似乎在迁移到较新版本的Visual Studio时可能会出现此错误,但我不知道为什么以及那里推荐的黑客对我不起作用。

我已经尝试过将资源重命名为随机数,甚至在每次出现版本信息时都使用不同的“名称”。 当我在读取错误并删除相应的.RC文件后再次构建项目时,它会工作一次。但这太糟糕了。

任何想法? 提前谢谢。

14 个答案:

答案 0 :(得分:20)

通过将配置属性>清单工具>输入和输出>嵌入清单下的设置更改为,从VC ++ 2010迁移到2012时,我解决了这个问题。我不知道那是什么,但我查看了.manifest文件的内容,看起来我可以在没有嵌入的情况下生活。

答案 1 :(得分:12)

我最近解决了Qt 4.8.2和Visual Studio 2012的类似问题.Qt 4.8.2不支持VS2012作为mkspec,因此我将win32-msvc2010 mkspec复制到win32-msvc2012(更改{{1到1700)并使用其他一些解决方法(QtWebKit修复等 - 你可以通过互联网找到它们)用VS2012构建Qt 4.8.2。但是qmake并不知道VS2012 _MSC_VER项目文件,所以它继续生成VS2010项目。将这些项目文件转换为VS中的新2012格式后,出现上述错误。

解决方案是在所有配置(Debug和Release)中从构建中排除生成的.vcxproj文件。要执行此操作,请在解决方案资源管理器中打开“生成的文件”文件夹,右键单击.res文件,打开“属性”,从下拉列表中选择“所有配置”,然后设置“常规”部分的“从构建中排除”属性'是'。

每次都用手重复这些动作是非常繁琐的,所以我编写了Python脚本来实现自动化。您可以使用它(风险自负!)更新qmake生成的.res文件。

    import sys
    import os
    from xml.etree import ElementTree

    def updateProject(filename):

        def getXmlns(tag):
            return tag[1:].split('}')[0]

        tree = ElementTree.parse(filename)
        root = tree.getroot()
        xmlns = getXmlns(root.tag)
        for cb in root.iter('{' + xmlns + '}CustomBuild'):
            if(not 'Include' in cb.attrib):
                continue
            if(not cb.attrib['Include'].endswith('.res')):
                continue
            for excl in cb.iter('{' + xmlns + '}ExcludedFromBuild'):
                if('Condition' in excl.attrib):
                    del excl.attrib['Condition'] # delete ExcludedFromBuild condition
        ElementTree.register_namespace('', xmlns)
        tree.write(filename)

    if(len(sys.argv)>=2): # use project files specified in command line:
        for i in range(1, len(sys.argv)):
            updateProject(sys.argv[i])
    else: # update all project files in current directory:
        for filename in os.listdir(os.getcwd()):
            if(filename.endswith('.vcxproj')):
                updateProject(filename)

感谢Xandy指出您需要将工作目录传递给.vcxproj,以便脚本在Python 2中工作。

答案 2 :(得分:6)

如果您在编译时遇到此错误(通常是从Internet下载的项目),请删除清单文件并删除.rc文件中对清单文件的引用。

Reference

答案 3 :(得分:4)

我最近遇到了这个问题,但最终导致了一个没有资源冲突的项目文件。在我的例子中,我将VS2008的QT qmake生成项目导入VS2010。使用VcprojFormatter和很多差异后,我发现了差异(对我而言)。我认为这是导入向导或VS 2010的核心中的一个错误。

http://www.codeproject.com/KB/macros/vcproj_formatter.aspx

我的资源文件名为win32_resources.rc您需要编辑与构建配置相对应的每个中间数据文件夹(发布,调试等)

在vcxproj文件中查找以下部分:

<ItemGroup>
  <Resource Include="debug\win32_resources.res">
    <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
  </Resource>
  <Resource Include="release\win32_resources.res">
    <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
  </Resource>
</ItemGroup>

所有“资源”文本都应替换为“CustomBuildStep”:

<ItemGroup>
  <CustomBuildStep Include="debug\win32_resources.res">
    <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
  </CustomBuildStep>
  <CustomBuildStep Include="release\win32_resources.res">
    <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
  </CustomBuildStep>
</ItemGroup>

VS2008文件中的问题是默认(?)设置不明确:

<File RelativePath="release\win32_resources.res">
  <FileConfiguration
    Name="Debug|Win32"
    ExcludedFromBuild="true"
    >
    <Tool Name="VCCustomBuildTool"/>
  </FileConfiguration>
</File>

缺少“工具名称”字段。

答案 4 :(得分:3)

  

如果您在编译时遇到此错误(通常是下载的   来自互联网的项目),然后删除清单文件并删除   引用.rc文件中的清单文件。

对于我遇到的情况,hB0的答案是100%正确。

这对我非常有用,我希望其他人知道这一点,而不是假设hB0的答案应该被忽略,因为其他人有投票而hB0的票数为零。我必须在单独的答案中说出来,因为我系统不会让未注册的用户投票。我甚至注册了,以便能够对这个答案进行投票,但系统仍然不会让我投票,直到我成为一个更成熟的用户。

答案 5 :(得分:2)

这是一个延伸,但我在Visual Studio 2005下遇到了类似的问题。它可能会有所帮助,或完全偏离基础:

我正在使用具有自己的版本资源的静态库(.lib)进行链接 - 非常合理,它显示了库的版本。在某些电台上,我的应用会链接。在其他电台上,我会收到相同的重复资源信息。

事实证明它与链接器优化设置有关:“使用库依赖关系输入”(UseLibraryDependencyInputs =),可能与“链接库依赖关系”结合使用。启用“使用库依赖项输入”时,链接器将被提供用于构建.lib的.obj和.res文件,而不是仅搜索.lib。

问题是你不想将.lib的.res文件作为链接器的输入文件。我的项目有自己的版本资源。如果引入.lib的资源,则现在有两个版本资源,因此出现错误。如果链接器只是搜索.lib,它没有理由引入.lib的资源,一切都很好。

我的项目配置没有强制设置“使用库依赖项输入”,它继承了它。在某些电台上,它继承了“否”,我可以链接。在一些电台上,它继承了“是”,我们得到了错误。

如果Visual Studio 2010仍具有此设置,请尝试将其强制关闭。

答案 6 :(得分:1)

我遇到了这个问题,它通过确保从构建中排除任何包含的.rc文件来解决,除了#include其余的主.rc之外。

答案 7 :(得分:1)

我遇到了这个问题,它通过确保从构建中排除任何包含的.rc文件来解决,除了#include其余的主.rc。 理查德海因为我工作。我正在使用VS2013进行编译。

答案 8 :(得分:1)

我在Visual Studio C ++ 2010中遇到了类似的问题。我没有安装任何Service Pack或VS的更新,当我有两个试图使用ICON的rc文件时出现了这个问题。所以我只是将一个文件的内容删除并将其切换到主文件中。因此,只有一个文件包含图标,第二个文件为空。像沙姆一样工作: - )。

答案 9 :(得分:0)

将Dmitry Markin中的else块替换为递归更新所有项目文件

else: # recursively update all project files in current directory:
    rootdir = os.getcwd()
    for root, subFolders, files in os.walk(rootdir):        
        for filename in files:
            if(filename.endswith('.vcxproj')):
                filePath = os.path.join(root, filename)
                print "file: %s" % (filePath)
                updateProject(filePath)

答案 10 :(得分:0)

我来这里寻找这个错误的答案。我很抱歉爆破了泡沫。没有一个答案适合我。 我的错误是我已经定义了3个具有相同ID的MACRO。这就是我得到问题中提到的错误的原因。

错误显示之前的代码:

#define IDB_MARKER_NORMAL_LINE          21**6**   
#define IDB_MARKER_ARROW_LINE           21**6**   
#define IDB_MARKER_DOTTED_LINE          21**6**  

我改为:

#define IDB_MARKER_NORMAL_LINE          21**6**   
#define IDB_MARKER_ARROW_LINE           21**7**   
#define IDB_MARKER_DOTTED_LINE          21**8**  

错误已经消失!!!!!!!!!!

答案 11 :(得分:0)

我有这个,我在resource.h中做了以下

#undef VS_VERSION_INFO
#define VS_VERSION_INFO                 310

由于VS_VERSION_INFO在WinRes.h中被赋予了资源ID 1,因此仅通过其他方法解决了我的问题。

答案 12 :(得分:0)

  

如果您在编译时遇到此错误(通常是从Internet下载的项目),请删除清单文件并   删除对.rc文件中清单文件的引用。

     

hB0给出的答案对于我遇到的情况是100%正确的。

     

这对我非常有用,我希望其他人可以从中受益   知道这一点,而不是假设应该忽略hB0的答案   因为其他人拥有选票,而hB0的拥有零选票。我必须说   在一个单独的答案中,因为我系统不会让未注册的   用户投票。我什至注册以便能够对此答案进行投票   但直到我变得更成熟为止,系统仍无法让我投票   用户。

此答案指出了一种解决我遇到的问题的方法。在我的Senario中,导入道具具有以下代码:

<ResourceCompile Include="$(VersioningDir)**Version.rc" />

删除后,所有工作都完成了。

答案 13 :(得分:0)

如果您在Visual Studio 20XX中遇到CVT1100(重复资源)和LNK1123(转换为COFF期间失败)资源错误,请执行以下步骤来解决它。

  1. 打开.rc文件并注释/在宏下面删除

    可移动的纯“ res \ .manifest”

2重命名/从Project目录的Resource文件夹中删除清单文件。

现在重新构建解决方案并享受...