使用WSL搭建嵌入式开发环境
一、启用虚拟机平台和 Linux 子系统功能
Windows 10 的1903版本以上支持WSL(windows下的Linux子系统)
方法一:先在设置(
设置
->
更新和安全
->
开发者选项
)中开启开发人员模式,然后在
控制面板
中(
控制面板
->
程序和功能
->
启动或关闭Windows功能
)启用
适用于 Windows 的 Linux 子系统
功能
方法二:以管理员权限启动 PowerShell,然后输入以下命令启用虚拟机平台
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
在以上每一步命令执行完之后,PowerShell 中可能会提示你重新启动计算机。按“Y”可以重新启动。
二、安装一个 Linux 发行版
打开微软商店应用,在搜索框中输入“Linux”然后搜索,你可以看到搜索结果中有很多的 Linux 发行版可以选择。选择一个你喜欢的 Linux 发行版本然后安装:
搜索:
选择ubuntu:
注意:在商店中的安装并没有实际上完成 Linux 子系统的安装,你还需要运行一次已安装的 Linux 发行版以执行真正的安装操作。
查看系统信息
# 安装screenfetch
sudo apt install screenfetch
# 启动sceenfetch
screenfetch
三、配置ubuntu开发环境
(1) 更改软件包源为阿里云
# 解决访问国外源失败的问题
sudo sed -i "s/archive\.ubuntu\./mirrors\.aliyun\./g" /etc/apt/sources.list
sudo apt update
(2)安装交叉编译的工具链:
交叉编译
交叉编译通俗地讲就是
在一种平台上编译出能运行在体系结构不同的另一种平台上的程序
,比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放到ARM CPU平台上才能运行,虽然两个平台用的都是Linux系统。
何为交叉编译环境
搭建交叉编译环境,即安装、配置交叉编译工具链。在Ubuntu环境下编译出嵌入式Linux系统所需的操作系统、应用程序等,然后再上传到目标机上。
交叉编译工具链是为了编译、链接、处理和调试跨平台体系结构的程序代码。对于交叉开发的工具链来说,在文件名称上加了一个前缀,用来区别本地的工具链。例如,arm-linux-表示是对arm的交叉编译工具链,arm-linux-gcc表示是使用gcc的编译器。除了体系结构相关的编译选项以外,其使用方法与Linux主机上的gcc相同,所以Linux编程技术对于嵌入式同样适用。不过,并不是任何一个版本拿来都能用,各种软件包往往存在版本匹配问题。例如,编译内核时需要使用arm-linux-gcc-4.3.3版本的交叉编译工具链,而使用arm-linux-gcc-3.4.1的交叉编译工具链,则会导致编译失败。
gcc和arm-linux-gcc的区别就是gcc是linux下的C语言编译器,编译出来的程序在本地执行,而arm-linux-gcc用来在linux下跨平台的C语言编译器,编译出来的程序在目标机(如ARM平台)上执行,嵌入式开发应使用嵌入式交叉编译工具链。
注意:
工具是32位的,系统是64位的,需要安装32位的库
(3)安装32位的库和宿主的工具
# 宿主开发环境
sudo apt install -y build-essential
# 32位库
sudo apt install -y lib32ncurses5 lib32z1
sudo apt install -y lib32stdc++6
(4)安装编译器:
# 安装gcc
sudo apt install gcc
# 安装arm-linux-gcc
sudo apt-get install gcc-arm-linux-gnueabihf
# 安装arm-linux-g++
sudo apt-get install g++-arm-linux-gnueabihf
如果需要安装老版本的,也可以手动下载压缩包安装,这里不介绍,请自行解决。
如果需要卸载编译器:
# 卸载gcc
sudo apt-get remove gcc
# 卸载arm-linux-gcc
sudo apt-get remove gcc-arm-linux-gnueabihf
# 卸载arm-linux-g++
sudo apt-get remove g++-arm-linux-gnueabihf
如果出现
E:Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
那么可以运行以下代码修复依赖
sudo apt-get update --fix-missing
(5)检查安装是否完成
# 查看gcc版本
gcc -v
# 查看arm-linux-gcc版本
arm-linux-gnueabihf-gcc -v
# 查看arm-linux-g++版本
arm-linux-gnueabihf-g++ -v
(6)为Ubuntu开启32位支持
sudo dpkg --add-architecture i386
退出所有的WSL的bash生效
(7)使用VS code编辑代码
使用
VS code
编译一个C文件,在工作台打开终端窗口(①
ALT
+
F12
②
查看
->
终端
)
使用一下命令进入WSL,再进入C文件目录
wsl
cd /mnt/c/Users/22920/Desktop/Hello/C/ # 更改为你的目录
将C文件用gcc编译并在本机运行
gcc hello.c -o hello
./hello
将C文件用arm-linux-gnueabihf-gcc编译并在嵌入式上运行(本机无法运行)
(8)将文件传送到嵌入式上运行
可以使用MobaXterm软件连接板子,然后把文件传送过去(直接拉过去就ok啦)
在新版本中微软提供了新的WSL2,但是
比较 WSL 2 和 WSL 1
,WSL2的跨 OS 文件系统的性能没有WSL好,这里又经常需要交叉编译,所以建议还是使用WSL。
参考资料
[1] 使用Windows的Linux子系统搭建嵌入式开发环境
https://www.cnblogs.com/Johness/p/use-wsl-build-cross-compile-environment.html
[2] WSL 和 WSL2 简单对比
https://www.v2ex.com/amp/t/587642/2
[3] 如何在 Windows 10 中安装 WSL2 的 Linux 子系统
https://blog.csdn.net/WPwalter/article/details/101508601Ubuntu
[4] 安装arm-linux-gcc编译器
https://blog.csdn.net/Utotao/article/details/86604733
[5] Ubuntu系统下arm-linux-gcc交叉编译环境搭建过程
https://blog.csdn.net/gsh_hello_world/article/details/70237123
[6] ARM交叉编译工具链分类说明
https://blog.csdn.net/qq_16149777/article/details/82349868
[7] 3分钟看懂gcc、arm-Linux-gcc和arm-elf-gcc的组成及区别
https://blog.csdn.net/eagle11235/article/details/54620203
[8] 微软官方文档:适用于 Linux 的 Windows 子系统文档
https://docs.microsoft.com/zh-cn/windows/wsl