开发环境搭建(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是标配
我的建议:如果你只是临时改几行代码,用Windows也行。但要做深度二次开发,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内存,我吃过这个亏

知识体系一览

下面这张图帮你理清整个开发环境的依赖关系:

Linux下Mission Planner开发环境依赖关系 Mission Planner Mono运行时(Windows Forms支持) .NET SDK + msbuild(编译工具链) 环境变量(MONO_HOME, DOTNET_ROOT, PATH) Ubuntu 20.04 / 22.04 LTS 提供UI支持 提供编译能力 链接各组件 运行基础

验证环境是否就绪

全部装完后,我习惯跑一个快速验证脚本:

#!/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的代码了。

我的经验:第一次编译成功时,别急着改代码。先跑一遍原版,确认界面能正常显示、能连接飞控。这样后面改出问题,你能快速定位是代码问题还是环境问题。

好了,环境搭好了,下一步就是真正动手改代码了。记住:环境搭建只是开始,真正的挑战在后面。但有了这套环境,你已经迈出了最艰难的一步。

专注资料整理