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

Wim*_*ool 9 compiler-construction 64-bit linker visual-studio-2010 visual-c++

作为一名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 -directory中的交叉编译器.此外,所有其他目录似乎都指向所有库的x64版本,依此类推.

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

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

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

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

不幸的是,这一切都不起作用.

当我将$(VCInstallDir)bin$(VCInstallDir)bin\amd64中的 cvtres.exe复制到$(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位计算机,所以我不需要使用交叉编译器,尽管Microsoft似乎默认选择这个,无论您的本地配置/操作系统如何.

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

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

当我查找这个临时文件时,我找不到它,但我不确定它是在编译完成后立即删除还是从未出现过.不幸的是,谷歌搜索这个问题也是一个死胡同,MS Visual Studio 2010团队甚至认识到这个问题,但已经把它放在'不会修复'上.简而言之,编译原生的64位似乎是VS2010的一个已知的一般问题,所以我决定回到原点,特别是因为有这个问题的其他人总是说"你能解决这个问题"使用交叉编译器而不是本机x64编译器.

好的,所以现在我发现自己用完了选项...而且疯狂的是,几天前它都运行良好我很确定我没有更改或安装任何关于这个项目的东西,也没有更新Visual Studio或某种程度上的.NET Framework.我甚至检查了Windows更新,但在过去几天找不到任何相关更新.

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

所以请问,有什么建议吗?

更新:根据MS的此指令,链接器的PATH变量必须指向VC++安装的基本目录.这就是我一直在讨论的$(VCInstallDir)垃圾箱.我试过这个,但没有解决问题.我想知道在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:为了得到一些额外的信息,我决定根据我使用ProcMon的调查结果将cvtres.exe从$(VCInstallDir)bin复制到$(VCInstallDir)bin\x86_amd64目录,只是为了看看当时发生了什么.首先,和以前一样,Visual Studio告诉我以下内容:

C:\ Program Files(x86)\ MSBuild\Microsoft.Cpp\v4.0\Platforms\x64\Microsoft.Cpp.x64.Targets(389,5):错误MSB6006:"link.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)以查看是否有任何作用.如果这没有帮助,我猜它是一个可怕的bug,或者我的安装真的搞砸了,我可能不得不重新安装VS及其所有东西......

无论如何,谢谢你的建议!

小智 6

C:\Windows\System32\NV路径可能指向此处此处讨论的问题.

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

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