无法使用VC ++ / VS2010针对x64进行编译:LNK1158:无法运行cvtres.exe

时间:2012-02-28 12:27:17

标签: visual-studio-2010 visual-c++ compiler-construction linker 64-bit

作为一名C#开发人员,我最近决定开始编写一些C ++程序,主要是因为我发现了一个我想要使用的有趣的C ++ API。我几天前写了一个非常简单的程序,在x64目标平台上编译,运行它,一切都只是很好。

然而,昨天我改变了一些代码,试图编译它,但随后链接器开始抱怨:

LNK1158:无法运行' cvtres.exe'

由于我对开发C ++程序很陌生,我认为我必须犯一些初学者的错误。但是,在检查了所有配置,搜索谷歌几个小时,并尝试了几个修复后,我开始认为这个问题可能是由更多代表引起的,重点是:我不能似乎解决了这个问题,所以我希望在这里得到一些好的反馈。

首先,让我列出我的配置:

  • 我正在运行Windows 7(x64)并且正在使用VS2010 Premium。
  • 我创建了一个标准且空的Win32控制台应用程序,其中只包含一个包含main函数的.cpp文件。它不是Hello World计划,但距离不远。
  • 由于我有一个x64平台,我也使用x64目标平台配置。我创建了此配置,但没有从Win32配置中复制任何设置。
  • 在项目属性中 - > VC ++目录,我将所有目录保留为默认值(虽然我确实更改了几次以尝试解决问题,但没有成功,所以我回到了默认值)。

最后一点似乎至关重要,因为VC ++目录设置决定了使用哪个编译器和链接器。此时,使用驻留在 $(VCInstallDir)bin \ x86_amd64 目录中的交叉编译器。此外,所有其他目录似乎都指向所有库的x64版本,依此类推。

当您解决此问题时,您会发现使用的链接器(link.exe)想要执行它无法找到的cvtres.exe。当cvtres.exe既不与链接器在同一目录中,也不在使用PATH变量解析的目录中时,也会出现此问题。

所以我验证了这一点,确实没有 $(VCInstallDir)bin \ x86_amd64 中的cvtres.exe版本(尽管它在基本目录中有版本( $( VCInstallDir)bin )和纯' $(VCInstallDir)bin \ amd64 目录中),PATH变量也不包含任何包含目录的列表cvtres.exe的一个版本。

- 尝试#01 - 解决手头的问题 -

因此,您可能会认为该错误实际上是合法的失败,我应该通过直接在 $(VCInstallDir)bin \ x86_amd64中复制cvtres.exe版本来解决此问题。 strong>目录,或编辑PATH变量,使其指向它的可用版本。

不幸的是,这一切都无效。

当我将cvtres.exe从 $(VCInstallDir)bin $(VCInstallDir)bin \ amd64 复制到 $(VCInstallDir)bin \ x86_amd64 并编译,我得到相同的消息(现在指的是确切的位置:'无法运行 $(VCInstallDir)bin \ x86_amd64 \ cvtres.exe ',尽管它在那里)或链接器退出时带有一些未知的错误代码(可能是因为 $(VCInstallDir)bin \ amd64 的版本是本机x64,不像我发现运行的x86交叉编译器在WoW64模式下)。

尝试编辑PATH变量以使链接器可以找到版本cvtres.exe的问题也会失败,因为我不知道要引用的路径(似乎还有更多版本的cvtres。 exe保存在各个位置,例如也在.NET 4.0 SDK目录中。)

- 尝试#02 - 尝试不同的方法来解决问题 -

我采取的另一条路径是尝试使用 $(VCInstallDir)bin \ amd64 中的编译器和链接器而不是交叉编译器。毕竟,我正在运行一台64位计算机,所以我不需要使用交叉编译器,不管你的本地配置/操作系统是什么,微软似乎默认选择这个。

所以我将VC ++目录更改为指向此位置,确实问题不再发生,但现在我遇到了运行CL.exe的跟踪器问题:

TRK0002:[CL.exe]' @ [TempFile] .rsp':句柄无效。

当我查找这个临时文件时,我找不到它,但我不确定它是否在编译完成后立即被删除'或者从来没有出现过。不幸的是,谷歌搜索这个问题也是一个死胡同,MS Visual Studio 2010 team even recognise this issue but have put it on 'Won't Fix'。简而言之,编译本机64位似乎是VS2010的一个已知的常见问题,所以我决定回到原点,特别是因为遇到这个问题的其他人总是说“你能解决这个问题”。只使用交叉编译器而不是本机x64编译器'。

好的,所以现在我发现自己用完了选项......而且疯狂的是,几天前它一切正常,我很确定我没有改变或安装任何关于这个项目的东西,也没有以某种方式更新Visual Studio或.NET Framework。我甚至检查了Windows更新,但过去几天无法找到任何相关更新。

我唯一可以做的,就是作为最后的手段,将整个事件降级为32位并下载32位版本的API,但我真的想避免这个因为在我看来,我应该能够在我的64位笔记本电脑/操作系统上编译和运行64位应用程序。

那么,请问,有什么建议吗?

更新:根据this instruction from MS,链接器的PATH变量必须指向VC ++安装的基本目录。这就是我一直在讨论的 $(VCInstallDir)bin 。我试过这个,但没有解决问题。我想知道当VS Build被解雇时后台发生了什么,我似乎并不知道......

@Hans Passant:Thnx的小费!进程监视器向我显示link.exe正在尝试在以下位置之一上找到cvtres.exe:

  • $(VCInstallDir)BIN \ x86_amd64
  • $(SourceFileDir)
  • C:\ Windows \ System32下\ NV

毋庸置疑,cvtres.exe不存在于这些目录中。奇怪的是搜索这些位置。我至少期望搜索 $(VCInstallDir)bin ,因为这个目录在VC ++目录和PATH变量中都有明确列出(我为此目的手动编辑)。我想这归结为找出为什么这种行为是这样......

Update2 :为了提供一些额外的信息,我决定将 $(VCInstallDir)bin 中的cvtres.exe复制到 $(VCInstallDir) bin \ x86_amd64 目录,基于我使用ProcMon的调查结果,只是为了看看当时发生了什么。首先,和以前一样,Visual Studio告诉我以下内容:

C:\ Program Files(x86)\ MSBuild \ Microsoft.Cpp \ v4.0 \ Platforms \ x64 \ Microsoft.Cpp.x64.Targets(389,5):错误MSB6006:"链接.EXE"退出时使用代码-1073741515。(这里的行只是指一个设置,用于检查哪些非零退出代码是可接受的 - 实际的错误代码是由link.exe返回的。)

然而,在ProcMon的输出窗口中,我可以看到找到了cvtres.exe并且正在执行大量的工作 - 看起来很完整,但我不太确定。无论如何,该错误仍然阻止我执行创建的可执行文件,因为它抱怨找不到某个引用的库。这可能是因为链接器没有正确完成,所以简而言之,它不能解决我的问题。

Update3 :另一个有趣的'我尝试过的是创建一个包含所有MS默认值的新的简单Win32项目,我甚至没有触及为我生成的代码(一个主函数立即返回),只是为了看到至少一个程序编译。令人惊讶的是,我现在得到了与上面相同的错误(link.exe已退出,代码为-1073741515),所以现在我真的开始认为我的安装确实存在问题。

然后我尝试取消并重新安装Visual Studio的VC ++部分,但无济于事......此时完全安装Visual Studio是没有选择的,因为我还处于中间位置开发C#项目,我安装了大量其他加载项,只需要花费大量时间来重新安装和重新配置。如果在那之前没有任何结果,我可能会在周末尝试这个。

相反,我对错误代码进行了一些研究,我认为它与link.exe无法找到或访问它所需的依赖关系有关。我已经关闭了我的VirusScanner只是为了安全(没有帮助),所以现在我下载最新的Windows SDK(7.1)以查看是否有任何帮助。如果这没有帮助,我猜它是一个可怕的错误,或者我的装置真的搞砸了,我可能不得不重新安装VS及其所有东西......

感谢您的建议!

6 个答案:

答案 0 :(得分:6)

C:\Windows\System32\NV路径可能会指出所讨论的问题herehere

似乎某些可以切换图形模式(集成/离散)的NVIDIA驱动程序在某些情况下可能会破坏系统路径(例如,在系统路径上使用英特尔无线路径)。

禁用NV服务可能会解决您的问题。

答案 1 :(得分:4)

重现此错误的一种简单方法如下:

打开命令提示符(cmd.exe),键入:

> powershell
在Power Shell中输入

,输入:

> echo ${Env:PATH}

如果输出如下所示:

C:\Windows\system32\NV;.;

然后你有这个错误。

答案 2 :(得分:1)

我刚刚在我的VS2010(SDK7.1)解决方案中找到了一个(总共3个)项目(项目在顺序线性依赖链中链接),在项目文件中有一个空的.rc文件。 删除空的.rc文件(从项目中删除而不删除它)解决了"致命错误LNK1158:... cvtres.exe"问题

更新:将cvtres.exe的工作版本复制到正确的位置,以便MSBuild可以选择它:

xcopy "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cvtres.exe" "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\x86_amd64\"

答案 3 :(得分:0)

我一直得到例外

  

Microsoft.Cpp.x64.Targets(152,5):错误MSB6006:“CL.exe”已退出,代码为1。

因为我正在使用MFC项目,然后将其转换为CLR / CLI项目,最后发现targetver.h文件是原因。

删除后,项目构建良好。此外,项目在Release / Debug / Win32和Debug / x64下构建良好,只有发布x64才有这个问题。

答案 4 :(得分:0)

我在Nvidia的4200m卡上运行,它改变了我的道路。禁用NV服务没有帮助。然后我从Nvidia的网站安装了新驱动程序310.90,它解决了这个问题。请注意,当我安装驱动程序时,我选中了“执行全新安装”的复选框。

答案 5 :(得分:0)

我在VMWare 11(Win XP 32)上运行VS6时遇到了同样的问题。

我必须从' msconfig - >中禁用.NET服务服务'

干杯