无法使用面向 x64 的 VC++/VS2010 进行编译:LNK1158:无法运行 cvtres.exe

2024-01-23

作为一名 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 版本等等。

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

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

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

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

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

当我从以下位置复制 cvtres.exe 时$(VCInstallDir)bin or $(VCInstallDir)bin\amd64 to $(VCInstallDir)bin\x86_amd64并编译,我要么收到相同的消息(现在指的是确切位置:'无法运行$(VCInstallDir)bin\x86_amd64\cvtres.exe',尽管它在那里)或链接器退出时出现一些未知的错误代码(可能是因为$(VCInstallDir)bin\amd64是原生 x64 与 x86 交叉编译器不同,我发现 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 团队甚至认识到这个问题,但已将其标记为“无法修复” http://connect.microsoft.com/VisualStudio/feedback/details/505682/x64-c-c-projects-cannot-compile。简而言之,本地编译 64 位似乎是 VS2010 的一个已知的普遍问题,所以我决定回到这个问题的第一个方面,特别是因为其他遇到这个问题的人总是说“好吧,你可以通过以下方式解决这个问题”使用交叉编译器而不是本机 x64 编译器”。

好吧,现在我发现自己已经没有选择了...而疯狂的是,几天前一切都运行良好,我很确定我没有更改或安装与该项目有关的任何内容,也没有更新 Visual Studio或 .NET Framework 以某种方式。我什至检查了 Windows 更新,但最近几天找不到任何相关更新。

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

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

Update: 根据来自 MS 的指令 http://msdn.microsoft.com/en-us/library/aa448630.aspx,链接器的 PATH 变量必须指向 VC++ 安装的基目录。那就是$(VCInstallDir)bin我一直在谈论。我已经尝试过这个,但没有解决问题。我想知道当 VS Build 被触发时后台发生了什么,我似乎不知道......

@Hans Passant:谢谢你的提示!进程监视器显示 link.exe 正在尝试在以下位置之一查找 cvtres.exe:

  • $(VCInstallDir)bin\x86_amd64
  • $(源文件目录)
  • C:\Windows\System32\NV

不用说,cvtres.exe 不存在于这些目录中。比较奇怪的是only搜索这些位置。我至少会期望$(VCInstallDir)bin已被搜索,因为该目录已明确列在 VC++ 目录和 PATH 变量(我为此目的手动编辑的)中。我想这可以归结为找出这种行为的原因......

Update2:只是为了提供一些额外的信息,我决定从$(VCInstallDir)bin to the $(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:“link.exe”退出,代码为-1073741515。(此处的行仅指检查哪些非零退出代码可接受的设置 - 实际的错误代码由 link.exe 返回。)

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

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

所以然后我尝试卸载并重新安装 Visual Studio 的 VC++ 部分,但无济于事...此时完全安装 Visual Studio 是不可能的,因为我还处于开发 C# 项目的过程中,而且我安装了大量其他加载项,目前需要花费太多时间来重新安装和重新配置。如果到那时还没有解决的话,我可能会在周末尝试这个。

相反,我对错误代码做了一些研究,我认为这与 link.exe 无法找到或访问它所需的依赖项有关。为了安全起见,我已经关闭了 VirusScanner(没有帮助),所以现在我正在下载最新的 Windows SDK (7.1),看看它是否有任何作用。如果这没有帮助,我猜这要么是一个可怕的错误,要么我的安装确实在某个地方搞砸了,我可能不得不重新安装 VS 和所有它的东西......

不管怎样,谢谢你的建议!


The C:\Windows\System32\NV路径可能指向正在讨论的问题here http://answers.microsoft.com/en-us/windows/forum/windows_7-windows_programs/path-variable-shows-only-pathcwindowssystem32nv/454fd1fb-84b0-439a-9a42-6d93ef15e074 and here http://forums.nvidia.com/index.php?showtopic=217920.

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法使用面向 x64 的 VC++/VS2010 进行编译:LNK1158:无法运行 cvtres.exe 的相关文章

随机推荐

  • HTML5 中的

    有几篇关于这个主题的文章 但我无法理解之间的相关区别
  • gridview 内的 CheckBox 选中状态

    我有一个简单的网格视图
  • 如何使用 RxJS 在 Angular 6 中发出一系列 http 请求

    我一直在网上寻找解决方案 但找不到任何适合我的用户案例的解决方案 我正在使用 MEAN 堆栈 Angular 6 并且我有一张注册表 我正在寻找一种方法来执行对 API 的多个 HTTP 调用 每个调用都依赖于前一个调用的返回结果 我需要看
  • 如何在 Angular4 中获取 FormControl 的值

    我对 Angular4 有一些经验 但我只是继承了一段使用 FormControls 的代码 我不知道如何使用它们 我正在设置一个注释文本区域 如果 isRegulatoryAuditRequired 的值等于 false 则需要该注释文本
  • jquery - 如何显示隐藏的div

    我的页面中嵌入了一个谷歌地图 其可见性设置为隐藏 我想使用按钮在页面上显示地图 应该使用jquery来完成 我的代码 不工作 div style height 350px border 1px solid 979797 div 任何人都可以
  • 在 C++ Microsoft Visual Studio 2010 中调试器多个环境变量

    在设置环境变量时 我在 Visual Studio 2010 Professional C 调试器中遇到了一个非常简单的问题 描述于 http msdn microsoft com en en library kcw4dzyf aspx h
  • 是否可以使用eclipse仅构建一次java项目并共享?

    是否有可能实际构建一个包含java代码的maven项目 构建一次并且二进制文件可以共享 问题 我尝试构建的项目大约需要 3 4 小时 并且需要高互联网带宽 我正在尝试检查在其他几台机器中重新使用这个构建项目的可能性 我之前曾处理过涉及 ma
  • 如何在 using 语句中使用对象初始值设定项?

    有没有什么方法可以重构此代码 以便不必使用临时变量 而仍然使用与对象初始值设定项关联的语法糖 FrmSomeForm someTempForm new FrmSomeForm SomePropA A SomePropB B SomeProp
  • Go 闭包变量作用域

    我正在阅读 CreateSpace Go 2012 编程简介 在第 86 页我发现了这个邪恶的魔法 func makeEvenGenerator func uint i uint 0 return func ret uint ret i i
  • TypeScript - 将动态属性名称传递给子级

    我正在开发一个带有嵌套路由的路由库 我试图定义一个推断父路径的子处理函数 原因是我有另一种类型 可以从字符串推断动态路径参数 例如 users id to id string 因此 我希望能够将推断的路径参数从父路由传递到每个子路由处理函数
  • 使用 Jasmine 在 Angular 5 中进行单元测试模型绑定

    我正在尝试编写一个单元测试来测试从组件方法调用返回的 JSON 数据是否成功绑定到打字稿模型 我的模型如下所示 export interface IPlayerAccount playerId number name string phon
  • 如何从 TFS 源代码管理中排除特定文件

    我们有多个配置文件 app DEV config app TEST config 等 和一个将正确的配置文件复制到 app config 的预构建事件 显然 配置特定文件位于源代码管理中 但目前 App Config 也是如此 但不应该如此
  • 从后台工作程序中的循环更新文本框

    我知道这个问题有人问过 至少从我到目前为止在这里发现的情况来看 但我无法真正理解它 已经尝试过 msdn 的示例 但仍然没有成功 这是我想要做的 我有一个连接到 TLL 标尺的 USB 计数器 我想在循环中不断读取值并将读数写入文本框而不阻
  • 如何从方法返回对对象的 const 引用? [复制]

    这个问题在这里已经有答案了 public Item getItem ulong itemId Item item items itemId return item 现在的问题是 被调用者getItem必须能够检索以下信息item持有 但不修
  • 多处理代码重复运行

    所以我希望使用 python 多处理模块创建一个进程 我希望它成为更大脚本的一部分 我还想从中得到很多其他东西 但现在我会满足于此 我从以下位置复制了最基本的代码多处理文档 https docs python org 3 6 library
  • 在 ExtJS 4 中具有相同视图并多次存储的最佳实践

    我想在 ExtJS 应用程序中同时拥有不同商店的同一视图的不同实例 目前 我在视口中创建了同一视图 Ext view View 的多个实例 但是在每个视图中都有不同的商店的最佳实践是什么 我发现的每个示例都在使用控制器的stores Con
  • MapKit (Swift 4) Xcode 9.2 - “无法从角 4 插入合法归属”

    我正在做一个处理 MapKit 的项目 我的问题是 当我运行该应用程序时 我收到 无法从第 4 角插入法律归属 的消息 错误 我可以采取什么解决方案来解决这个问题 error https i stack imgur com jw7rk pn
  • 使用 Tf Estimator 时如何获得可训练变量计数?

    我使用 tf 估计器框架创建了 CNN 分类器模型 但是 我无法访问模型中定义的变量 tf trainable variables 始终返回 0 如何使用 tf 估计器访问变量 特别是 我如何获得参数总数的计数 将所有变量的维度相加 谢谢
  • 自动使用相对于函数调用位置的 __LINE__ 和 __FILE__

    我有一个函数log text 这一切所做的就是写 text到数据库 我想包括 LINE and FILE 但不想像我现在那样每次都将其作为参数包含在内 function log text file null line null write
  • 无法使用面向 x64 的 VC++/VS2010 进行编译:LNK1158:无法运行 cvtres.exe

    作为一名 C 开发人员 我最近决定尝试编写一些 C 程序 主要是因为我发现了一个我想使用的有趣的 C API 几天前我写了一个非常简单的程序 在 x64 目标平台上编译它 运行它 一切都很顺利 然而 昨天我更改了一些代码 尝试编译它 但链接