开发环境搭建(Linux/Ubuntu):安装Mono、安装.NET SDK、配置环境变量、编译Mission Planner
说实话,很多人在Linux下编译Mission Planner第一步就卡住了。为啥?因为Mission Planner原本是Windows下的.NET Framework项目,要在Linux上跑,得靠Mono这个「翻译官」。我当年第一次搞的时候,光装环境就折腾了两天。嗯,今天咱们把这些坑都填平。
为什么要在Linux下搞?
你可能要问:直接在Windows上开发不香吗?
我个人习惯把开发环境放在Linux上,原因有三:
- 服务器部署方便——很多飞控后端服务跑在Linux上
- 命令行工具链成熟——grep、sed、awk这些,Windows下用着别扭
- Docker支持好——后面做CI/CD流水线,Linux是标配
第一步:安装Mono
Mono是什么?说白了,它就是让.NET程序能在Linux上跑的一个开源实现。Mission Planner的UI层大量用了Windows Forms,Mono正好能处理这个。
安装命令很简单:
sudo apt update
sudo apt install mono-complete
等等,别急着敲回车。这里有个版本问题。我记得有一次帮社区朋友排查问题,他装的是Mono 5.x,结果编译Mission Planner时各种报错。后来发现,Mission Planner需要Mono 6.0以上。
建议用官方源安装最新版:
sudo apt install gnupg ca-certificates
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
echo "deb https://download.mono-project.com/repo/ubuntu stable-focal main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list
sudo apt update
sudo apt install mono-complete
mono --version 检查版本。如果低于6.8,建议升级。我曾经因为版本太低,编译出来的Mission Planner在运行时界面卡死,排查了整整一个下午。
第二步:安装.NET SDK
你可能觉得奇怪:装了Mono为什么还要装.NET SDK?
嗯,这里要区分一下:Mono负责运行时和Windows Forms支持,而.NET SDK是用来编译C#代码的。Mission Planner的构建脚本依赖dotnet CLI。
安装.NET SDK 6.0(目前兼容性最好):
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt update
sudo apt install dotnet-sdk-6.0
装完后验证:
dotnet --version
如果看到6.0.x,恭喜你,这一步过了。
第三步:配置环境变量
环境变量配置不对,编译时你会遇到「找不到msbuild」或者「mono运行时缺失」之类的错误。我当年就被这个坑过——明明装好了,就是跑不起来。
打开 ~/.bashrc,在末尾添加:
export MONO_HOME=/usr/lib/mono
export PATH=$PATH:/usr/lib/mono/bin
export DOTNET_ROOT=/usr/share/dotnet
export PATH=$PATH:$DOTNET_ROOT
然后执行:
source ~/.bashrc
验证一下:
echo $MONO_HOME
which mono
which dotnet
如果都能正常输出路径,说明环境变量生效了。
~/.profile 而不是 ~/.bashrc 里。因为有些桌面环境登录时不会加载.bashrc,但会加载.profile。这样能避免「终端里能编译,但IDE里报错」的尴尬。
第四步:编译Mission Planner
终于到了最激动人心的环节。克隆代码:
git clone https://github.com/ArduPilot/MissionPlanner.git
cd MissionPlanner
然后编译:
msbuild /p:Configuration=Release /p:Platform="Any CPU" MissionPlanner.sln
等等,这里有个坑。如果你直接跑msbuild,大概率会报错。为什么?因为Mission Planner的解决方案里包含了多个项目,有些项目依赖NuGet包,而NuGet在Linux下需要额外配置。
正确的做法是:
nuget restore MissionPlanner.sln
msbuild /p:Configuration=Release /p:Platform="Any CPU" MissionPlanner.sln
如果一切顺利,你会看到一堆绿色的「Build succeeded」。编译产物在 MissionPlanner/bin/Release 目录下。
运行试试:
mono MissionPlanner/bin/Release/MissionPlanner.exe
- 错误:找不到System.Windows.Forms — 检查Mono版本,确保装了mono-complete
- 错误:NuGet包还原失败 — 检查网络,或者手动下载包放到packages目录
- 错误:编译时内存不足 — 给虚拟机分配至少4GB内存,我吃过这个亏
知识体系一览
下面这张图帮你理清整个开发环境的依赖关系:
验证环境是否就绪
全部装完后,我习惯跑一个快速验证脚本:
#!/bin/bash
echo "=== 环境检查 ==="
echo "Mono版本:"
mono --version | head -n 1
echo ""
echo ".NET SDK版本:"
dotnet --version
echo ""
echo "msbuild路径:"
which msbuild
echo ""
echo "NuGet路径:"
which nuget
echo ""
echo "=== 检查完成 ==="
如果所有项都正常输出,恭喜你,开发环境搭建完毕。你可以开始修改Mission Planner的代码了。
好了,环境搭好了,下一步就是真正动手改代码了。记住:环境搭建只是开始,真正的挑战在后面。但有了这套环境,你已经迈出了最艰难的一步。