34

如何让 Visual Studio 2012 使用本机 amd64 工具链,而不是默认的 x86_amd64 交叉编译器?

我正在构建一个大型库,导致链接器在进行整个程序优化和链接时代码生成时内存不足。

我发现两个较旧的帖子(此处此处)提出了同样的问题,但还没有答案。Microsoft 提供了有关如何在命令行上指定工具链的文档,而不是在 IDE 中。

4

5 回答 5

39

对于 Visual Studio 2013,还有另一种在每个项目的基础上强制使用 64 位链接器的方法。编辑 .vcxproj 文件并在行后插入以下内容<Import...Microsoft.Cpp.Defaults

  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
  <PropertyGroup>
    <PreferredToolArchitecture>x64</PreferredToolArchitecture>
  </PropertyGroup>
于 2014-09-02T15:06:38.870 回答
37

在启动 Visual Studio 2012 IDE 之前,您需要将环境变量“_IsNativeEnvironment”设置为“true”:

set _IsNativeEnvironment=true
start "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\devenv.exe" your_solution.sln

对于 Visual Studio 2013,环境变量的名称不同:

set PreferredToolArchitecture=x64
sbm start "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\devenv.exe" your_solution.sln

请注意,如果 IDE 的版本与工具链的版本不匹配,则此技术不起作用。也就是说,如果您使用配置为运行 VS2012 编译器的 VS2013 IDE,那么您就不走运了。但这样的组合并不常见。

以下是一些链接以获取更多信息:

VS12 和 VS13 的区别

如何将 PreferredToolArchitecture 嵌入到 VS13 中的项目中

于 2014-05-21T20:22:11.883 回答
10

如果您的目标是使用本环境而不是专门amd64_x86,您可以UseNativeEnvironment在项目文件中设置属性:

<PropertyGroup>
  <UseNativeEnvironment>true</UseNativeEnvironment>
</PropertyGroup>

(我已成功将其添加到“Globals”PropertyGroup。)

/Bv您可以通过添加编译器选项来检查正在使用的工具链。示例输出如下。请注意,工具链目录出现在bin\(amd64_x86在这种情况下) 之后。

2>ClCompile:
2>  Compiler Passes:
2>   C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64_x86\CL.exe:        Version 18.00.31101.0
2>   C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64_x86\c1.dll:        Version 18.00.31101.0
2>   C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64_x86\c1xx.dll:      Version 18.00.31101.0
2>   C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64_x86\c2.dll:        Version 18.00.31101.0
2>   C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64_x86\link.exe:      Version 12.00.31101.0
2>   C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64\mspdb120.dll:      Version 12.00.31101.0
2>   C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64_x86\1033\clui.dll: Version 18.00.31101.0
于 2016-03-18T06:11:50.613 回答
1

我知道这是一篇相当老的帖子,但它仍然与 VS 2017 相关。这里还有“PreferredToolArchitecture”环境变量,并且 IDE 中的“内置”设置并不容易获得。

但是,您可以通过项目库轻松地将其集成到项目中,以便您始终可以选择要使用的工具架构。也许这对某些人有帮助。做这个:

  • 转到属性管理器并创建一个新的属性表,例如命名为“x64 Toolchain.props”,以便您知道它的作用。使用单独的属性表,您可以通过在项目中包含或不包含该表来适当地切换工具架构。
  • 打开该新工作表的属性,导航到“Common Properties\User Macros”,然后单击“Add Macro”。
  • 在对话框中,您将名称设置为“PreferredToolArchitecture”,将值设置为“x64”并启用复选框“将此宏设置为构建环境中的环境变量”。
  • 可以选择导航到“Common Properties\C/C++\Command Line”并在“Additional Options”下添加“/Bv”。这将使编译器输出它使用的工具,包括它的路径和版本号,可能有助于检查是否真的使用了所需的架构。它将在日志输出窗口中放置条目,如下所示:

    编译器通过:
    C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\bin\HostX86\x64\CL.exe:版本 19.15.26730.0
    C:\Program Files ( x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\bin\HostX86\x64\c1.dll:版本 19.15.26730.0
    C:\Program Files (x86)\Microsoft Visual Studio\2017\ Enterprise\VC\Tools\MSVC\14.15.26726\bin\HostX86\x64\c1xx.dll:版本 19.15.26730.0
    C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15 .26726\bin\HostX86\x64\c2.dll:版本 19.15.26730.0
    C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\bin\HostX86\x64\ link.exe:版本 14.15.26730.0
    C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\bin\HostX86\x86\mspdb140.dll:版本 14.15.26730.0
    C:\Program Files (x86)\ Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\bin\HostX86\x64\1033\clui.dll:版本 19.15.26730.0

  • 现在对于应该使用 x64 工具架构构建的所有项目,将新的属性表包含到属性管理器中的项目中。对于那些不应该简单地不包括它的人。而已。

HTH

编辑:不幸的是,这似乎不可靠!请参阅下面的评论。如果 MS 将此设置连接到某些 GUI 元素并使其始终如一地工作,我将不胜感激……

于 2018-10-11T08:24:38.297 回答
0

我在 XP 64 SP2 上使用 Visual Studio 2010 时遇到了类似的问题。如果我将 VC++ 可执行目录设置为 amd64 bin(本机 x64 文件夹)作为搜索路径中的第一个,那么我收到 TRK0002 错误...无效的句柄值。

但是,如果我在 Visual Studio 2010 命令提示符中设置 _IsNativeEnvironment=true 并像之前发布的那样从命令行启动 ide,那么错误就会消失。显然,32 位 GUI IDE 环境正在接收来自 64 位进程的信息,并期待来自 32 位进程(例如 x86\cl.exe 或 x86_64\cl.exe)的信息。

在您想要编译 IA64 位可执行文件并使用 x86_ia64\cl.exe 编译器的场景中。由于您使用的是 32 位交叉编译器并将 _IsNativeEnvironment 变量设置为 true,因此在 IDE 的窗口控制台中发布消息时,这一定会扰乱 IDE。设置 _IsNativeEnvironment=false,如果您之前已将其设置为 true。

IDE 应该知道在本机 64 位机器上正在使用本机编译器,并且应该在从 IDE 中选择本机编译器时自动将此变量设置为适当的值。从未应用简单的修复程序来修补此问题。解决方案。根据提示自行执行,或从 Microsoft 购买最新的 IDE 来解决问题。

因此,微软真正的天才是主要从命令行工作的开发人员。而其他戴着尖顶帽子坐在角落里的开发者,肯定是从苹果公司挖来的,他们更关心的是外观而不是功能。

IDE 的全部目的是使编码变得简单,并不比使用文本编辑器和命令行中的 Makefile 更复杂。

于 2019-01-08T19:59:33.933 回答