Visual studio 2010 无法使用VC++/VS2010目标为x64:LNK1158:无法运行cvtres.exe 作为一个C开发者,我最近决定尝试编写一些C++程序,主要是因为我找到了一个有趣的C++ API,我想玩。几天前我写了一个非常简单的程序,在x64目标平台上编译并运行,一切都很顺利

Visual studio 2010 无法使用VC++/VS2010目标为x64:LNK1158:无法运行cvtres.exe 作为一个C开发者,我最近决定尝试编写一些C++程序,主要是因为我找到了一个有趣的C++ API,我想玩。几天前我写了一个非常简单的程序,在x64目标平台上编译并运行,一切都很顺利,visual-studio-2010,visual-c++,compiler-construction,linker,64-bit,Visual Studio 2010,Visual C++,Compiler Construction,Linker,64 Bit,然而,昨天我修改了一些代码,试图编译它,但随后链接器开始抱怨: LNK1158:无法运行“cvtres.exe” 因为我对开发C++程序很陌生,我想我一定犯了一些初学者的错误。然而,在检查了所有配置、搜索了谷歌几个小时并尝试了几次“修复”之后,我开始认为这个问题可能是由一些更具代表性的问题引起的,重点是:我似乎根本无法解决这个问题,所以我希望在这里得到一些好的反馈 首先,让我列出我的配置: 我运行的是Windows7(x64),使用的是VS2010 Premium 我创建了一个标准的空Win3

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

LNK1158:无法运行“cvtres.exe”

因为我对开发C++程序很陌生,我想我一定犯了一些初学者的错误。然而,在检查了所有配置、搜索了谷歌几个小时并尝试了几次“修复”之后,我开始认为这个问题可能是由一些更具代表性的问题引起的,重点是:我似乎根本无法解决这个问题,所以我希望在这里得到一些好的反馈

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

  • 我运行的是Windows7(x64),使用的是VS2010 Premium
  • 我创建了一个标准的空Win32 Console应用程序,其中只有一个包含main函数的.cpp文件。这不是一个Hello World节目,但也不远
  • 因为我有一个x64平台,所以我也使用x64目标平台配置。我创建此配置时没有复制Win32配置中的任何设置
  • 在projectproperties->VC++目录中,我将所有目录保留为默认目录(尽管我确实更改了几次以尝试解决问题,但没有成功,所以我返回默认目录)
最后一点似乎很关键,因为VC++目录设置决定使用哪个编译器和链接器。此时,将使用驻留在$(vInstallDir)bin\x86\u amd64-目录中的交叉编译器。此外,所有其他目录似乎指向所有库的x64版本等等

当你用谷歌搜索这个问题时,你会发现使用的链接器(link.exe)想要执行cvtres.exe,但它找不到。当cvtres.exe既不在链接器所在的目录中,也不在使用PATH变量解决的目录中时,似乎会出现此问题

因此,我验证了这一点,并且在$(vInstallDir)bin\x86\u amd64中确实没有cvtres.exe的版本(尽管在基本目录($(vInstallDir)bin)和'pure'$(vInstallDir)bin\amd64目录中有它的版本),PATH变量也不包含包含cvtres.exe版本的目录的任何列表

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

因此,您可能会认为该错误实际上是一个法律故障,我应该通过直接在$(VCInstallDir)bin\x86\u amd64目录中复制cvtres.exe的版本,或者编辑PATH变量,使其指向可用版本来修复此错误

不幸的是,这些都不起作用

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

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

--尝试#02-通过尝试不同的方法规避问题--

我采取的另一种方法是尝试使用$(vinstalldir)bin\amd64中的编译器和链接器,而不是交叉编译器。毕竟,我运行的是一台64位机器,所以我不需要使用交叉编译器,尽管微软似乎默认选择了这个,不管您的本地配置/操作系统如何

因此,我将VC++目录更改为指向此位置,实际上问题不再出现,但现在我在运行CL.exe时遇到了跟踪器问题:

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

当我查找这个临时文件时,我找不到它,但我不确定它是在编译“完成”后立即被删除,还是根本不存在。不幸的是,谷歌搜索这个问题也是一条死胡同。简而言之,在VS2010中,编译本机64位似乎是一个已知的普遍问题,因此我决定在这个问题上回到第一步,特别是因为有这个问题的其他人总是说“你可以通过使用交叉编译器而不是本机x64编译器来解决这个问题”

好吧,现在我发现自己没有选择了。。。疯狂的是,就在几天前,它还运行得很好,我很确定我没有更改或安装与此项目有关的任何内容,也没有以某种方式更新Visual Studio或.NET Framework。我甚至检查了Windows Update,但在过去几天里找不到任何相关更新

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

那么,有什么建议吗

更新:根据,链接器的PATH变量必须指向VC++安装的基本目录。这就是我一直在谈论的$(vInstallDir)bin。我试过这个,
> powershell
> echo ${Env:PATH}
C:\Windows\system32\NV;.;
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\"