简介:这份PDF文档面向需要在Linux平台从源码编译AFSim仿真工具集的开发者与研究人员,尤其适合具备一定命令行操作经验、希望搭建本地仿真环境的中高级用户。文档完整记录了AFSim 2.9.0在Ubuntu 22.04.4 LTS下的编译过程,涵盖资源目录说明、编译环境配置、库环境变量设置、CMake配置与编译、运行测试等环节,并给出gcc/g++、cmake-qt-gui等工具版本及硬件配置参考。资源包共1个PDF文件,大小约694KB,内容紧凑、步骤清晰,便于按章节对照操作。目前已有2522人学习下载。读者可据此了解源码、示例、第三方库、使用手册、辅助工具与培训资料的组织方式,掌握环境变量与依赖库的配置思路,并借助运行测试环节验证编译结果,减少路径错误与权限问题带来的反复调试,为后续仿真开发打下基础。
1. 为什么 AFSIM 2.9.0 在 Ubuntu 22.04 上编译总卡在依赖环节
AFSIM 是一套面向任务级仿真与体系对抗推演的工具集,源码包里同时塞进了仿真内核、第三方库、示例想定和培训资料,体量不小。很多人拿到源码后第一反应是直接cmake .. && make,结果在 configure 阶段就报找不到 tiff、gdal、osgEarth,或者链接阶段提示 Qt 版本不匹配。问题不在代码,而在于 AFSIM 2.9.0 的构建体系默认依赖一套预编译好的第三方库,路径、库名、ABI 都是固定的,你系统里装的 apt 版本对不上。
这份编译指南的价值就在于把「环境变量 → 依赖安装 → CMake 配置 → make → 安装 → 运行 wizard」这条链路固定下来,让编译结果可复现。它适合两类人:一是第一次在 Linux 上从源码构建 AFSIM 的仿真工程师,二是需要把 AFSIM 集成进自己 CI 或容器环境的运维开发。下面按实际操作顺序拆开讲,重点放在路径约定、环境变量拼接和 CMake 缓存这几个最容易翻车的地方。
2. AFSIM 2.9.0 编译环境与目录结构约定
2.1 版本、系统与硬件基线
先把基线对齐,后面所有命令才有意义。AFSIM 2.9.0 官方验证过的组合是 Ubuntu 22.04.4 LTS + gcc/g++ 4.8.5 + cmake 3.22.1,内存建议 16G 起步,因为make -j4同时链接 osg、gdal 这类大库时峰值内存不低。CPU 和 GPU 不是编译瓶颈,但后续跑三维态势想定时 RTX 3060 这类独显会舒服很多。
| 项目 | 推荐值 | 说明 |
|---|---|---|
| AFSIM 版本 | 2.9.0 | 源码包版本,不要混用其他版本 |
| 操作系统 | Ubuntu 22.04.4 LTS | 官方验证基线 |
| 构建工具 | cmake 3.22.1 + cmake-qt-gui | GUI 用于可视化配置缓存 |
| 编译器 | gcc/g++ 4.8.5 | 由依赖包提供,非系统默认 |
| 内存 | 16G | 并行编译峰值需求 |
| 第三方库 | 随源码 dependencies 提供 | 不要用 apt 版本替换 |
提示:gcc 4.8.5 是随
dependencies/gcc-g++.rar一起提供的,不要用 Ubuntu 22.04 自带的 gcc 11 去编译,否则第三方库的 ABI 会对不上,链接阶段会出现大量 undefined reference。
2.2 目录结构为什么必须照抄
指南里反复强调「编译目录与文档保持一致」,这不是强迫症。AFSIM 的 CMake 脚本里大量使用了相对路径和${AFSIM_3RDPARTY_PATH}变量,一旦你把dependencies挪到别处,configure 阶段就会找不到vtk、osg这些库的.cmake配置文件。
标准布局如下:
/home/sma/AFSIMSrc/ # 根目录 ├── afsim/ # 源码目录 ├── demos/ # 官方案例 ├── dependencies/ │ ├── 3rd_party/ # 第三方库(tiff/gdal/osg/qt 等) │ ├── resources/ # 编译所需 vtk 等资源 │ ├── tools.rar # 编译工具包 │ └── gcc-g++.rar # C++ 环境资源包 ├── tools/ # 辅助工具(含 python) └── training/ # 培训资料如果你非要把根目录换到/opt/AFSIMSrc,那就要同步改后面所有环境变量和 CMake 里的路径,工作量远大于直接照抄。我一般会先mkdir -p /home/sma/AFSIMSrc再解压,避免解压时多套一层目录。
2.3 第三方库清单与用途
dependencies/3rd_party下每个库都有明确分工,理解它们能帮你在报错时快速定位:
tiff-4.4.0、libpng-1.6.37、libjpeg-turbo-2.1.2:图像编解码,地形纹理和图标加载用。gdal-3.3.2、proj-8.1.1、geos-3.5.1:地理坐标转换与矢量数据处理,想定里的经纬度、投影全靠它。osg-3.6.3、osgEarth-2.10.1:三维渲染引擎,态势显示的核心。qt-5.12.11:GUI 框架,wizard 和各类编辑器依赖。openssl-3.1.1、curl-8.2.0:网络与加密。sqlite-3.32.3、tinyxml2-7.1.0:数据存储与配置解析。ffmpeg-4.2.4、sdl-2.0.16:音视频与输入设备。gtest-1.8.0:单元测试。
这些库的lib或lib64目录都要进LD_LIBRARY_PATH,少一个都可能在运行 wizard 时报error while loading shared libraries。
3. 环境变量配置与编译环境安装
3.1 在 .bashrc 中拼接 LD_LIBRARY_PATH
环境变量是整条链路的粘合剂。AFSIM_HOME指向源码根,AFSIM_3RDPARTY_PATH指向第三方库根,LD_LIBRARY_PATH则要把每个库的 lib 目录串起来。注意有的库是lib,有的是lib64,写错一个就白搭。
su root vi ~/.bashrc # 在文件末尾追加以下内容 export AFSIM_HOME=/home/sma/AFSIMSrc/afsim export AFSIM_3RDPARTY_PATH=/home/sma/AFSIMSrc/dependencies/3rd_party export LD_LIBRARY_PATH=${AFSIM_3RDPARTY_PATH}/tiff-4.4.0-x64-lnx/lib:${AFSIM_3RDPARTY_PATH}/sqlite-3.32.3-x64-lnx/lib:${AFSIM_3RDPARTY_PATH}/sdl-2.0.16-x64-lnx/lib64:${AFSIM_3RDPARTY_PATH}/tinyxml2-7.1.0-x64-lnx/lib:${AFSIM_3RDPARTY_PATH}/gtest-1.8.0-x64-lnx/lib:${AFSIM_3RDPARTY_PATH}/openssl-3.1.1-x64-lnx/lib64:${AFSIM_3RDPARTY_PATH}/curl-8.2.0-x64-lnx/lib:${AFSIM_3RDPARTY_PATH}/proj-8.1.1-x64-lnx/lib:${AFSIM_3RDPARTY_PATH}/geos-3.5.1-x64-lnx/lib:${AFSIM_3RDPARTY_PATH}/gdal-3.3.2-x64-lnx/lib:${AFSIM_3RDPARTY_PATH}/zlib-1.2.11-x64-lnx/lib:${AFSIM_3RDPARTY_PATH}/libpng-1.6.37-x64-lnx/lib:${AFSIM_3RDPARTY_PATH}/ffmpeg-4.2.4-x64-lnx/lib:${AFSIM_3RDPARTY_PATH}/libjpeg-turbo-2.1.2-x64-lnx/lib:${AFSIM_3RDPARTY_PATH}/osg-3.6.3-x64-lnx/lib64:${AFSIM_3RDPARTY_PATH}/osgEarth-2.10.1-x64-lnx/lib64:${AFSIM_3RDPARTY_PATH}/qt-5.12.11-x64-lnx/lib:${LD_LIBRARY_PATH}逻辑说明:整条LD_LIBRARY_PATH用冒号分隔,末尾保留${LD_LIBRARY_PATH}是为了不覆盖系统原有路径。参数上唯一要盯的是lib与lib64的区分——sdl、openssl、osg、osgEarth用的是lib64,其余是lib。改完执行source ~/.bashrc让配置立即生效,再用echo $LD_LIBRARY_PATH确认拼接结果没有多余空格或换行。
注意:
vi里粘贴长行容易断行,建议用cat >> ~/.bashrc << 'EOF' ... EOF的方式追加,避免手动换行引入错误。
3.2 执行 myenv_temp.sh 安装编译环境
环境变量就位后,进入dependencies目录执行官方提供的环境安装脚本。这个脚本会解压 gcc/g++ 资源包、设置编译器软链、补齐一些系统级依赖。
cd /home/sma/AFSIMSrc/dependencies chmod +x myenv_temp.sh ./myenv_temp.shchmod +x是给脚本加执行权限,./myenv_temp.sh在 root 下运行。脚本执行过程中如果提示缺少某个 apt 包,按提示apt install补上即可。执行完成后用gcc --version确认当前生效的是 4.8.5 而不是系统默认版本,这一步是后面 CMake 能否找到正确编译器的前提。
3.3 验证环境是否就绪
在正式 CMake 之前,先做三项快速检查,能省掉后面大量返工:
# 1. 检查环境变量 echo $AFSIM_HOME echo $AFSIM_3RDPARTY_PATH # 2. 检查编译器版本 gcc --version | head -1 g++ --version | head -1 # 3. 检查关键库能否被动态链接器找到 ldconfig -p | grep -E "libgdal|libosg|libQt5Core"如果第 3 步查不到库,说明LD_LIBRARY_PATH没生效或路径写错,回到 3.1 逐项核对。三项都通过再往下走,否则 CMake configure 阶段必然报错。
4. CMake 配置与 make 编译实战
4.1 用 cmake-gui 加载缓存并配置
AFSIM 的构建入口在afsim/build,但配置工具用的是 Qt 版的 cmake-gui,路径在第三方库的 qt bin 目录下。先给 qt bin 里的可执行文件加权限,再切回普通用户启动 GUI。
cd /home/sma/AFSIMSrc/dependencies/3rd_party/qt-5.12.11-x64-lnx/bin chmod +x ./* su sma # 切回编译用户,sma 为示例用户名 sudo cmake-gui在 cmake-gui 里填两个路径:
Where is the source code:/home/sma/AFSIMSrc/afsimWhere to build the binaries:/home/sma/AFSIMSrc/afsim/build
如果之前配置过,缓存可能没自动加载,点File | Reload Cache手动加载。然后点Configure,选择生成器为Unix Makefiles。configure 过程中重点看输出里有没有Could NOT find字样,尤其是 gdal、osg、Qt5 这几个。没有报错就点Generate,成功后会提示Generating done,此时build目录下已经生成了 Makefile。
提示:configure 报错时不要急着改 CMakeLists,先看
CMakeError.log和CMakeOutput.log,九成问题出在库路径或编译器版本,而不是源码本身。
4.2 make -j4 并行编译与常见报错
生成 Makefile 后切回 root 执行编译。-j4是并行任务数,16G 内存下 4 路比较稳,内存更大可以上-j8,但再高收益递减且容易 OOM。
su root cd /home/sma/AFSIMSrc/afsim/build make -j4编译过程会持续较长时间,终端显示100%并回到命令行即表示成功。常见报错及处理:
| 报错关键字 | 原因 | 处理 |
|---|---|---|
undefined reference to ... | 库路径或 ABI 不匹配 | 检查 LD_LIBRARY_PATH 与 gcc 版本 |
fatal error: QtCore/... | Qt 头文件路径未进 CMake | 重新 configure,确认 Qt5_DIR |
cannot find -lgdal | gdal lib 目录未加入 | 核对 3.1 中 gdal 路径 |
virtual memory exhausted | 并行数过高 | 降到-j2重试 |
如果编译中途失败,修完问题后直接重新make -j4即可,已编译的目标文件不会重做,这是 Makefile 增量编译的好处。
4.3 make install 与资源目录补齐
编译成功后执行安装,把产物集中到wsf_install目录:
make install mkdir -p ${AFSIM_HOME}/build/wsf_install/resources/site/mil-std2525dmake install会把可执行文件、库、资源按约定布局复制到afsim/build/wsf_install。第二条mkdir是补齐 mil-std2525d 军标符号资源目录,AFSIM 的态势显示会从这里读取符号定义,缺了它 wizard 启动后地图上的军标可能显示异常。安装完成后wsf_install/bin下应该能看到wizard、mission等可执行文件。
5. 运行验证与编译产物排错技巧
5.1 启动 wizard 做冒烟测试
安装完成后最直接的验证就是跑 wizard。进入 bin 目录,用 root 启动:
cd /home/sma/AFSIMSrc/afsim/build/wsf_install/bin su root ./wizardwizard 是 AFSIM 的图形化入口,能正常弹出界面并加载默认想定,说明编译链路整体通了。如果启动时报error while loading shared libraries: libQt5Core.so.5,说明LD_LIBRARY_PATH在 root 会话里没生效——root 的.bashrc和普通用户是分开的,确认 3.1 的配置是写在 root 的~/.bashrc里。
5.2 用 ldd 定位缺失的动态库
wizard 启动失败时,ldd是最快的诊断工具,它会列出每个依赖库的解析结果:
ldd ./wizard | grep "not found"输出里凡是not found的库,就是LD_LIBRARY_PATH里缺的路径。对照 3.1 的清单找到对应库目录补进去,source ~/.bashrc后重试。这个技巧对mission、mystic等其他可执行文件同样适用。
5.3 编译产物的目录布局与二次开发入口
wsf_install的布局值得记一下,做 AFSIM 二次扩展开发时经常要往里放东西:
wsf_install/ ├── bin/ # 可执行文件:wizard、mission 等 ├── lib/ # AFSIM 自身编译出的库 ├── resources/ # 资源文件,含 site/mil-std2525d ├── include/ # 对外头文件,扩展开发用 └── share/ # 想定模板与配置做二次扩展时,自定义插件编译出的.so一般放到lib下,头文件引用include里的接口,想定文件放share或demos下加载。理解这个布局,后面无论是写自定义传感器模型还是接入外部数据源,都能快速找到落点。
5.4 一个容易被忽略的权限细节
整个流程里 root 和普通用户来回切换,容易在文件属主上踩坑。make install用 root 执行,产物属主是 root;如果后续用普通用户跑 wizard 又需要写日志或缓存,就会 permission denied。常见做法是安装完成后统一改属主:
chown -R sma:sma /home/sma/AFSIMSrc/afsim/build/wsf_install把sma换成你的实际用户名。这样普通用户既能运行也能写运行时文件,避免每次都要su root。编译阶段用 root 是为了写系统路径和装依赖,运行阶段用普通用户更安全,这个边界分清楚,后面调试会顺很多。
本文还有配套的精品资源,点击获取