使用64位的编译工具进行编译

简介: 本文记录了使用64位的编译工具进行编译的过程

缘起

最近在编译项目的时候总是报虚拟内存不足(项目中使用了大量的模板)。一般情况下,vs会使用32位的编译工具进行编译,用64位的编译工具应该能解决类似的问题。本以为是一件挺简单的事,但是没想到遇到不少坑,本文记录了折腾的过程,希望对有类似需求的小伙伴有所帮助。

说明:本文总结的不是怎么设置 vs来生成 64位的程序,而是怎么使用 64位的编译工具来生成程序,可以生成 32位的,也可以生成 64位的。

尝试1:在vs中查找相关设置

在低版本的vs中找了很久也没有找到相关选项,看来vs只能使用默认的32位编译器进行编译。实在是不太合理啊!不过确实没找到,如果有小伙伴知道怎么设置,欢迎留言告知。

vs2019(V16.1)终于添加了相关的设置选项。

尝试2:使用msbuild

我们知道其实vs是调用msbuild进行编译链接的(msbuild会调用CL.exe进行编译,调用link.exe进行链接)。我们可以直接使用msbuild进行生成。

帮助文档

可以通过msbuild -h或者MSBuild command-line reference来查看msbuild的命令行参数。但是,貌似没有哪个参数是告诉我们如何使用64位的编译工具进行编译的。继续搜

官网指南1

在微软官方找到一篇参考文档 How to: Enable a 64-Bit, x64 hosted MSVC toolset on the command line,根据文档中的的描述,尝试过程如下:
Use-64-bit-hosted-developer-command-prompt

我们发现,编译时使用的是CL.exe,链接时使用的是link.exe。这两个文件都是子目录\bin\HostX86\x64下的。我们看下这两个程序是32位的还是64位的。
check-cl-link-bit

我们发现这个子目录下的CL.exelink.exe都是32位的。什么情况?为什么按官方文档进行操作,结果还是使用的32位的 :code_sweat:。暂时先不追究了1。继续搜

[曹景游关于MSBuild的博客]

找到了[曹景游关于MSBuild的博客],根据其中的 msbuild /p:PreferredToolArchitecture=x64 成功调用了64位的CL.exelink.exe
build-with-PreferredToolArchitecture-x64

PreferredToolArchitecture是什么?

官方参考文档

[曹景游关于MSBuild的博客]中有一个微软的官方链接(中文版),介绍了一些msbuild的内部选项,其中有关于关键字PreferredToolArchitecture的介绍。我切换到了英文版并摘录了关于PreferredToolArchitecture的介绍。如下:

PreferredToolArchitecture property

The PreferredToolArchitecture property determines whether the 32-bit or 64-bit compiler and tools are used in the build. This property does not affect the output platform architecture or configuration. By default, MSBuild uses the x86 version of the compiler and tools if this property is not set.

For example, set the PreferredToolArchitecture property to x64 to use the 64-bit compiler and tools to build your application:

msbuild myProject.vcxproj /p:PreferredToolArchitecture=x64

提示:可以把URL中关于语言的部分改成其它语言的标识即可切换到对应的语言下。中文对应着zh-cn,英文对应着en-us

其它相关资料

根据关键字PreferredToolArchitecturestackoverflow上搜到了这篇帖子how-to-make-visual-studio-use-the-native-amd64-toolchain。里面提到了vs2019(V16.1)已经支持设置编译工具了。从另外一个回复中得知,可以使用/Bv来查看编译使用的工具的全路径。

vs2019中的Preferred Build Tool Architecture设置选项

在工程文件上右键PropertyConfiguration Properties -> Advanced -> Preferred Build Tool Architecture,设置为64-bit(x64)即可使用64位的编译工具进行编译。如下图。
choose-build-tool-architecture

/Bv设置选项

在工程文件上右键 PropertiesConfiguration Properties -> C/C++ -> Command Line,添加/Bv选项。如下图。
Bv-option

输出结果

build-with-Bv

可以看到使用PreferredToolArchitecture后,确实使用了64位的编译工具。

其它尝试

  • bin\Hostx86,用bin\Hostx64的内容替换之,简单粗暴有效。:tada::tada::tada:
  • 其它说多了都是泪的尝试。:sob::sob::sob:

总结

遇到问题,关键字搜索非常重要,找对关键字,基本上成功了一半。

参考资料


  1. 关于此问题,我确实使用dnSpy进行了逆向调试,有时间会把整个过程整理出来。
相关文章
|
存储 搜索推荐 API
AppsFlyer 研究(六) 域名及用户邀请归因
AppsFlyer 研究(六) 域名及用户邀请归因
744 0
|
C++ Python
探索Python与C/C++混合编程的艺术
探索Python与C/C++混合编程的艺术
352 1
|
存储 Prometheus 监控
监控堆外内存使用情况
监控堆外内存使用情况
667 4
|
C++
C++代码来计算一个点围绕另一个点旋转45度后的坐标
C++代码来计算一个点围绕另一个点旋转45度后的坐标
320 0
|
前端开发 数据库
文本----富文本数据如何存入到数据库当中,解决方法,看其他大佬写的文章
文本----富文本数据如何存入到数据库当中,解决方法,看其他大佬写的文章
文本----富文本数据如何存入到数据库当中,解决方法,看其他大佬写的文章
|
数据安全/隐私保护
【Qt 学习笔记】Qt常用控件 | 输入类控件 | Line Edit的使用及说明
【Qt 学习笔记】Qt常用控件 | 输入类控件 | Line Edit的使用及说明
1962 0
|
算法 数据安全/隐私保护
常用的有限元网格生成方法
本文介绍了三种常见的有限元网格生成方法:映射法、四(八)叉树法和Delaunay三角化法。映射法通过坐标变换将物理域映射到规则参数域,适合生成结构化和非结构化网格,但处理复杂区域时较困难。四(八)叉树法基于栅格,通过递归细分逼近边界,适用于非结构化网格,但内部和边界网格的相容剖分较复杂。Delaunay三角化法通过保证外接圆特性生成高质量网格,适用于凸区域,但在凹区域需进行边界恢复。前沿推进法则从边界开始逐步向内生成网格,边界质量好,但数据结构设计和推进规则制定有一定挑战。这些方法各有优缺点,常结合使用以优化网格剖分。
1997 1
|
缓存 关系型数据库 数据库
Tornado 也太厉害了吧!高性能 Web 开发的神器,快来看看这逆天的强大引擎!
【8月更文挑战第31天】在互联网时代,Web应用的性能至关重要。Tornado作为高性能Python Web框架,凭借其异步非阻塞I/O模型,能够高效处理大量并发连接,降低资源消耗并提升响应速度。其简洁易用的特性及丰富的功能(如路由管理、模板引擎等),使开发者能快速构建强大的Web应用。通过合理运用异步编程、优化数据库操作、使用缓存以及优化模板渲染等最佳实践,可充分发挥Tornado的优势,打造高性能Web应用。
381 0
|
前端开发 JavaScript 安全
深入探索 Qt6 web模块 WebEngineCore:从基础原理到高级应用与技巧
深入探索 Qt6 web模块 WebEngineCore:从基础原理到高级应用与技巧
2111 0
|
机器学习/深度学习 存储 编解码
阿里云ARM计算架构云服务器最新收费标准与活动价格表参考
ARM计算架构阿里云服务器有计算型c8y、通用型g8y、内存型r8y、ARM 通用型g6r、ARM 计算型c6r等实例规格可选,不同实例规格的租用收费价格是不一样的,本文为大家汇总了目前基于ARM计算架构下的各个实例规格的阿里云服务器收费标准,以供参考。
阿里云ARM计算架构云服务器最新收费标准与活动价格表参考