小编Wim*_*ool的帖子

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

作为一名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 …

compiler-construction 64-bit linker visual-studio-2010 visual-c++

9
推荐指数
1
解决办法
1万
查看次数

MSTest:如何在TestExplorer中更改TestMethod的名称?

我目前正在构建一个示例应用程序,我使用MS Test在VS2012中实现基于场景的Given-When-Then风格的UnitTest项目.为此,我有一个抽象的Scenario(基础)类,它具有虚拟的Given() - 和When() - 在TestInitialization阶段运行的方法.然后存储When() - 方法的结果,并且可以在任何具体的Scenario类中使用任意TestMethods来验证,表示'Then'语句.一切都很完美.

不过还有一件事我想控制:所有TestMethods的名称都显示在Visual Studio的TestExplorer中.这是因为许多TestMethods具有相同或相似的名称,但是在不同的场景中执行(例如'ExpectedExceptionIsThrown').我原以为MS Test会支持这样的事情,也许是通过TestMethodAttribute的原生支持,如下所示:

[TestMethod("DisplayName here...")]
public void ThenThisShouldHappen()
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

我查看了MS Test的API,但似乎无法找到任何方法来做到这一点.MS Test是否可以实现这一切?

mstest visual-studio-2012

8
推荐指数
1
解决办法
942
查看次数