前言
上篇文章记录了安装WSL的方法和过程,现在要在CLion的STM32工程里设置WSL为工具链,目的是能使build和run通过。
首先在settings →Build, Execution, Deployment→toolchain中新增WSL,Clion会检测本机安装的WSL,在Toolset那一栏会显示绿✔和具体版本,但是后面的选项比如CMake/Build Tool/C Complier/C++ Complier/Debugger则通通提示找不到:
这是因为WSL里的Ubuntu还没有安装这些工具。我们一项一项来安装。
Ubuntu内安装工具链
1.CMake
运行WSL里的Ubuntu,执行命令sudo apt install cmake,但运行到一半,出现错误,提示CMake所依赖的libssl1.1 is not installable.
1.1安装libssl1.1.1
使用wget命令进行安装,网上搜了一些文章,给出的安装链接不一样,试了好几个要不是连接出错,要么是版本不匹配系统。
经过尝试,后来发现,大家给出的链接都出自两个目录:
第一个目录里没有amd64版本的,第二个有。
而我们要选择的是amd64的版本,而不是arm64,因为机器是英特尔/AMD架构的,不是arm架构。是不是对amd64这个名字感到困惑,去搜搜就知道了,英特尔IA-32架构之后,是amd率先推出兼容IA-32位架构的64位指令集架构,称为AMD64。
在1999年,AMD公司首先在IA-32基础上,增加了64位寄存器,兼容早期的16位和32位软件系统,推出了x86-64的64位微处理器,后来命名为AMD64,实现了超车。然后intel公司也接受了该方案,叫做Intel64。x86-64应该只算是x86指令集的64位扩展,并不是一种全新的64位架构。
由于amd64和intel64本质上是一样的,叫法也是很多。AMD通常叫它x86-64、x86_64,微软和sun等软件公司叫它x64,操作系统厂商则通常用AMD64或者amd64来指代AMD64和Intel64。
(15 封私信 / 1 条消息) 为什么有的地方叫X86-64,有的地方叫AMD64? - 知乎 (zhihu.com)
所以去第二个链接的目录里找就行了,这里直接给出我写这个文章时可用的一个版本,放到wget命令里并解压安装:
wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1-1ubuntu2.1~18.04.20_amd64.deb
sudo dpkg -i libssl1.1_1.1.1-1ubuntu2.1~18.04.20_amd64.deb
记得要用sudo执行安装,不然权限不够。
1.2 安装CMake
安装好了libssl后,就可以执行CMake的安装了:
sudo apt install cmake
再回到CLion设置界面,可以检测到CMake了:
界面显示找不到GDB,请安装。
2.安装GDB
执行下列命令:
sudo apt install gdb
如果能成功安装本节以下内容可以忽略,如果遇到 'unable to locate package gdb'的问题,请参考下列解决办法:
由于此文写于调试后的第三天,我已记不得是否一次成功。且留存的截图显示我当时命令打错了,gdb打成了gbd:
不知当时是否发现并纠正命令,且依然出现同样的“unable to locate package gdb”问题。
总之,我当时是搜索了这个问题,找到的解决方案是:
sudo apt-get update -- 从服务器获取软件列表,并在本地保存为文件。
不管我是否遇到了这个问题,我是执行了这个命令的。
再执行安装gdb的命令,成功了。
安装完GDB之后,回到CLion设置界面,已经可以侦测到GDB了:
到这里看似一切安好,应该可以编译了吧
3.尝试编译(新的问题出现)
3.1找不到编译器
回到CLion主界面,刷新CMake,出现新的问题:
提示找不到C/C++/ASM(汇编)compiler,根据提示,C和ASM对应的编译器是
arm-none-eabi-gcc,C++对应的是arn-none-eabi-g++.(要注意这两个和gcc和g++的不同。)
作为一个小白,一开始是不太明白为什么的,既然CLion的工具链设置界面都正常了(没有错误提示),为什么还出现错误呢。
就我目前的理解,原因在于工具链设置界面的C compiler 和 C++ compiler不是对应STM32嵌入式开发用的。
注意前面红字的部分,gcc/g++和arm-none-eabi-gcc/g++是两个东西:
Ubuntu 自带的 gcc 编译器是针对 X86 架构的!而我们现在要编译的是 ARM 架构的代码,所以我们需要一个在 X86 架构的 PC 上运行,可以编译 ARM 架构代码的 GCC 编译器,这个编译器就叫做交叉编译器,总结一下交叉编译器就是:
(1)它是一个 GCC 编译器;
(2)这个 GCC 编译器是运行在 X86 架构 PC 上的;
(3)这个 GCC 编译器是编译 ARM 架构代码的,也就是编译出来的可执行文件是在 ARM 芯片上运行的。
交叉编译器中“交叉”的意思就是在一个架构上编译另外一个架构的代码,相当于两种架构“交叉”起来了。
虽然设置界面侦测到了gcc/g++,但build的时候发现这个编译器不对,去找相应的针对arm架构的编译器,也就是arm-none-eabi-gcc/g++,却没找到。也就是Ubuntu里没有arm-none-eabi-gcc/g++。
为了验证,那么在WSL Ubuntu里面运行which命令:
请看which命令的简介:
尝试运行 which arm-none-eabi-gcc 和which arm-none-eabi-g++
结果是没有任何返回
而运行which cmake 和 which gdb看看:
却返回了所在目录👇
所以可以断定是 arm-none-eabi-gcc和arm-none-eabi-g++这两个程序没有安装。
具体arm-none-eabi-gcc这种交叉编译器的名字代表的意思可以去搜索一下,参阅文章:
arm 交叉编译器各种gcc 傻傻分不清楚:gnueabi,gnueabhf,none-eaib - 知乎 (zhihu.com)
简单来讲,这是要编译 ⌈arm架构的裸机系统程序(包括 ARM Linux 的 boot、kernel,不适用编译 Linux 应用 Application)⌋ 的编译器,但开发的主机环境是别的操作系统,比如windows/Linux/Mac Os,所以叫做交叉编译器。
3.2 安装arm-none-eabi-gcc/g++
用版本查看命令会提示没有,并提示安装所要使用的命令。
3.2.1 使用命令自动安装
不知道为什么这里的名称顺序是gcc在前了:
sudo apt install gcc-arm-none-eabi
3.2.2 手动安装
前往官方下载链接:下载链接https://launchpad.net/gcc-arm-embedded/+download
先下载再手动安装, 但具体教程请自行搜索
懒人可参考下列文章:
Ubuntu中gcc-arm-none-eabi的安装、移除和版本切换_arm-none-eabi-gcc-优快云博客
Linux下开发STM32:使用gcc-arm-none-eabi工具链编译生成bin、hex文件-优快云博客
我是直接用linux命令安装的。
注:用命令安装下载好像文件很大,貌似比在官网下载东西更多,但小白不想折腾可以选自动。
这是执行成功后的提示:
用arm-none-eabi-gcc –v查看版本信息:
用which arm-none-eabi-gcc 查看安装目录:
(除了which, 类似的命令还有Linux查看软件安装目录及位置 方法 - 付杰博客 (fujieace.com)):
这样,再刷新CMake已经可以了:
虽然,工具链设置界面看上去和之前并无任何区别:
3.3 gcc和arm-none-eabi-gcc版本查看
既然都安装好了,可以通过查看版本看二者有何差异:
查看gcc版本, 执行gcc -v :
查看arm-none-eabi-gcc,执行arm-none-eabi-gcc -v:
版本不一样,不是一个东西。
4.build和run
执行build,顺利通过:
run也下载成功:
毕 !!!