我正在开发一个使用qmake生成Visual Studio 2005项目文件的中型项目。我试图在Visual Studio 2010 Ultimate下构建它。由于qmake不支持此IDE,但我提供了转换助手转换我的解决方案。
尝试构建时,我在其中一个子项目中收到以下错误:
CVTRES:致命错误CVT1100:重复资源。类型:版本,名称:1,语言:苏图语
在Google的结果告诉我之后,似乎在迁移到较新版本的Visual Studio时可能会出现此错误,但我不知道为什么以及那里推荐的黑客对我不起作用。
我已经尝试过将资源重命名为随机数,甚至在每次出现版本信息时都使用不同的“名称”。 当我在读取错误并删除相应的.RC文件后再次构建项目时,它会工作一次。但这太糟糕了。
任何想法? 提前谢谢。
答案 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文件中对清单文件的引用。
答案 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期间失败)资源错误,请执行以下步骤来解决它。
打开.rc文件并注释/在宏下面删除
可移动的纯“ res \ .manifest”
2重命名/从Project目录的Resource文件夹中删除清单文件。
现在重新构建解决方案并享受...