1. 环境准备:避开版本冲突的深坑
第一次在Windows上编译Airsim 1.3.1的经历简直像在雷区跳舞。我的开发机上同时装着VS2015、VS2017、VS2019三套Visual Studio,还有UE4.22和UE4.24两个虚幻引擎版本。这种混合环境就像把不同年代的汽车零件混在一起组装,结果刚运行build.cmd就爆出几十个编译错误。
关键版本锁定是成功的第一步。实测发现必须满足三个铁律:
- Visual Studio 2019(社区版或专业版均可,但绝对不能是2017)
- Windows 10 SDK 10.0.18362(在VS安装器里勾选)
- Unreal Engine 4.24(官方明确标注的适配版本)
这里有个隐藏陷阱:即使你安装了UE4.24,系统可能仍然默认调用旧版本。我就遇到过明明在Epic Games Launcher里设置了4.24为默认引擎,但编译时还是跳转到4.22的情况。后来发现需要手动修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\EpicGames\Unreal Engine\Builds下的安装路径。
2. 网络加速:改写下载链接的实战技巧
build.cmd执行时最折磨人的就是依赖库下载。原始脚本直接从GitHub拉取rpclib等组件,速度经常卡在个位数KB/s。通过Process Monitor抓包分析,发现脚本会依次下载:
- rpclib-v2.2.1.zip(核心通信库)
- car_assets.zip(车辆模型资源)
- Eigen-3.3.7.tar.gz(数学运算库)
链接替换方案需要三步操作:
- 用文本编辑器打开
AirSim\Unity\build.cmd - 查找所有
github.com的下载链接 - 替换为国内镜像站地址(注意保持文件名一致)
例如将:
https://github.com/rpclib/rpclib/archive/v2.2.1.zip改为:
https://mirror.example.com/rpclib-v2.2.1.zip注意:镜像站可能会定期清理文件,建议自己搭建本地缓存。我用Python的http.server模块临时托管这些文件,速度直接跑满千兆带宽。
3. 编译排错:手动指定构建工具的秘诀
当执行到update_from_git.bat时,90%的失败都源于版本选择错误。系统默认调用逻辑非常迷惑:
- 优先读取注册表中最新安装的UE版本
- 自动匹配该UE版本对应的VS工具链
- 完全忽略项目实际需要的版本
强制指定版本的方法是在命令行最后添加参数:
"UE_4.24\Engine\Binaries\DotNET\UnrealBuildTool.exe" -projectfiles -project="Blocks.uproject" -game -rocket -progress -2019关键点在于:
- 显式指向UE4.24目录下的UnrealBuildTool.exe
-2019参数强制生成VS2019工程文件- 绝对不要依赖批处理脚本的自动选择
我后来养成的习惯是直接修改bat文件,把最后一行改成:
start "UBT" /wait "%UE4_24_PATH%\Engine\Binaries\DotNET\UnrealBuildTool.exe" -projectfiles -project="%PROJECT_PATH%" -game -rocket -progress -20194. 依赖管理:第三方库的编译陷阱
即使通过前几步生成了VS工程,编译时还可能遇到MavLinkCom等库的链接错误。根本原因是Airsim使用的第三方库有严格的版本要求:
| 库名称 | 必须版本 | 常见冲突来源 |
|---|---|---|
| Eigen | 3.3.7 | 其他AI框架预装的3.4.0 |
| MavLinkCom | 2.0.0 | PX4自动安装的新版本 |
| Boost | 1.70.0 | 系统环境变量中的1.75 |
环境变量清理是解决这类问题的关键:
# 检查冲突的PATH项 where eigen3 # 临时清除无关路径 set PATH=%PATH:C:\Program Files\PX4\bin;=%对于Boost这种系统级依赖,建议使用VS2019的vcpkg管理:
vcpkg install boost:x64-windows@1.70.05. 工程配置:VS2019的参数调优
成功生成解决方案后,这些VS设置能避免90%的编译错误:
- 平台工具集必须设为"Visual Studio 2019 (v142)"
- Windows SDK版本选择10.0.18362.0
- C++语言标准设为C++17(不是最新的20!)
- 在"配置属性→C/C++→预处理器"中添加:
_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING _CRT_SECURE_NO_WARNINGS
对于经常出现的LNK2005重复定义错误,需要:
- 右键项目→属性→链接器→命令行
- 添加
/FORCE:MULTIPLE
6. 测试验证:确保仿真环境可用
编译通过只是第一步,真正的考验是运行Block环境。常见启动崩溃的原因有:
- 插件加载失败:检查
Plugins/AirSim目录是否完整 - 着色器编译错误:删除
Saved/Shaders目录强制重建 - 车辆模型缺失:确认
Content/VehicleAdv存在且包含Pawn资产
建议首次运行时添加日志参数:
Blocks.exe -log -FullStdOutLogOutput如果看到控制台输出SimMode: Car后卡住,大概率是物理引擎初始化失败。这种情况需要检查显卡驱动是否支持CUDA 10.2,或者回退到DirectX模式。
7. 持续维护:版本控制的注意事项
为了避免下次编译又踩坑,这些文件需要加入.gitignore:
# 编译中间文件 /Build/ /Binaries/ /Intermediate/ # 下载的第三方库 /External/ /Unreal/Plugins/AirSim/External/ # 本地设置 *.user *.log同时建议保留修改过的build.cmd为build_local.cmd,原始文件保持不变以便后续版本升级时对比差异。我在实际项目中会额外维护一个patch文件夹,存放所有修改过的脚本和配置文件。