如何让 Visual Studio 2012 使用本机 amd64 工具链,而不是默认的 x86_amd64 交叉编译器?
我正在构建一个大型库,导致链接器在进行整个程序优化和链接时代码生成时内存不足。
我发现两个较旧的帖子(此处和此处)提出了同样的问题,但还没有答案。Microsoft 提供了有关如何在命令行上指定工具链的文档,而不是在 IDE 中。
对于 Visual Studio 2013,还有另一种在每个项目的基础上强制使用 64 位链接器的方法。编辑 .vcxproj 文件并在行后插入以下内容<Import...Microsoft.Cpp.Defaults
:
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup>
<PreferredToolArchitecture>x64</PreferredToolArchitecture>
</PropertyGroup>
在启动 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,那么您就不走运了。但这样的组合并不常见。
以下是一些链接以获取更多信息:
如果您的目标是使用本机环境而不是专门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
我知道这是一篇相当老的帖子,但它仍然与 VS 2017 相关。这里还有“PreferredToolArchitecture”环境变量,并且 IDE 中的“内置”设置并不容易获得。
但是,您可以通过项目库轻松地将其集成到项目中,以便您始终可以选择要使用的工具架构。也许这对某些人有帮助。做这个:
编译器通过:
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
HTH
编辑:不幸的是,这似乎不可靠!请参阅下面的评论。如果 MS 将此设置连接到某些 GUI 元素并使其始终如一地工作,我将不胜感激……
我在 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 更复杂。