< 返回版块

2019-04-30 21:43    责任编辑:jay

标签:Windows,MinGW-w64,GDB

本文转载自:https://zhuanlan.zhihu.com/p/49515204

Rust 在 Windows 下使用 CLion 进行调试

6enmel

6enmel

勿以人言而畏之

16 人赞同了该文章

前言:

就性能、兼容性或者其他各方面来说,在 Windows 上使用 MSVC 作为后端当然是最好的,也是官方默认的安装选项。

滚动到页面下方展开即可看到

勾选 Visual C++ 生成工具

只是需要下载大概 1G 左右的数据,占用 5G 左右的安装空间,对开发者来说倒是习以为常,对很多想尝试或者了解的人就有点不太友好了。

初学者可以选择 x86_64-pc-windows-gnu 版本的 msi 安装包(不到 200MB),图形化界面,安装即用,除非你用到了需要 C/C++ 编译的第三方库,或者生成的结果需要和 ABI 不同目标代码进行交互,否则就不用再安装其他或者配置什么。GNU ABI target 的 exe 在性能和大小上可能会和 MSVC ABI target 有一些差距:

不用太在意

其实使用 MSVC 作为后端更主要的问题是调试(参看 https://areweideyet.com 列出的 IDE / Editer 在各平台上对 Debugging 的支持情况)。虽然在 Windows 上可以比较方便地使用 VS Code 来调试,但是就目前的使用体验来说,调试问题是解决了,写代码的体验却真的不怎么样,rls-vscode 只是勉强能用。

使用 CLion + intellij-rust 是目前的理想选择,不过 CLion 不支持 MSVC 工具链的调试,所以我们需要生成 GNU ABI 的目标文件,然后在 CLion 里使用 GDB 来调试。

获取 GCC 工具链的推荐做法是安装 MSYS2 ,再使用 MSYS2 中的 pacman 安装 MinGW toolchains,但是目前 CLion (2018.2.5 版本)还不支持 MinGW-w64 的 GDB 8.2 版本:

踩坑了

没关系,除了MSYS2,还有 GCC for Windows 64 & 32 bits [mingw-w64] 可选择,Cygwin 已经过时就不要再用了。


安装:

安装很简单,步骤为:

下载 MinGW-w64 并解压 -> 配置环境变量 Path -> 配置 CLion -> 安装或者配置 Rust 。

1、在 MinGW-w64 - for 32 and 64 bit Windows 页面下方可以找到安装文件,可以下载 installer 按步骤安装,也可以直接下载 7z 压缩包。我选择了 GCC-6.4.0 x86_64-posix-seh 7z 包,线程模型和异常处理以及版本和你的 Rust GNU 工具链中的 GCC 版本保持一致。

如果你安装了 stable-gnu 的 toolchain ,那选择一个兼容的 MinGW 版本即可,我们只会用到 GDB 相关组件;没有安装的话,就要考虑版本,因为 cargo 需要 gcc 作为后端参与编译,这个时候对 MinGW 版本是有要求的 。如果你不确定选择哪个 MinGW 版本,你可以运行 rustup toolchain install stable-gnu 来安装 gnu 工具链,完成后然后找到 .rustup\toolchains...gnu\lib\rustlib...-gnu\bin\ 下的工具链附带的 gcc.exe ,运行 gcc -v 来查看其信息,然后确定版本。这不是必须的,之后你可以运行 rustup toolchain uninstall stable-gnu 来删除掉。

将下载的 7z 压缩包解压缩到你喜欢的目录,我解压缩在 C:\Dev 下。

2、添加 MinGW-w64 的 bin 到环境变量 Path 中:

3、在 CLion 的 Settings > Build, Execution, Deployment > Toolchains 里配置 MinGW :

4、下载并运行 x86_64-pc-windows-gnu-rustup-init ,按提示完成安装即可。

补充:

如果你下载的是默认的 rustup-init.exe ,可以先跳过它的警告,Continue 继续到下一步,输入 2 (Customize installation)回车,在 Default host triple? 下输入 x86_64-pc-windows-gnu ,剩下两项直接回车保持默认,最后输入 1 回车开始安装,效果一样:

如果你之前已经安装好了Rust,你还是可以方便地通过 rustup 来切换目标,实现交叉编译。运行 rustup target add x86_64-pc-windows-gnu 安装编译组件, cargo build --target=x86_64-pc-windows-gnu 即可生成 GNU ABI 的目标代码。交叉编译不需要切换工具链,使用你已有的工具链即可。

最后打开一个 Rust 项目测试下:

调试展示


后记:

pc-windows-gnu 工具链是自带 gcc 和 ld 的:

所以它可以不依赖 MSVC 生成 exe ,不过目录里的 GCC-WARNING.txt 有云:

gcc.exe contained in this folder cannot be used for compiling C files - it is onlyused
as a linker.

CLion 自带的 JRE 是基于 OpenJDK 的,在字体渲染上有点问题,可以把安装目录下的 jre64 删除或者重命名成其他,再在 Oracle 下载一个 .tar.gz 版本的 JRE ,解压缩后文件夹更名为 jre64 粘贴到 CLion 安装目录,或者在环境变量中配置 JAVA_HOME ,都可。