简介:本资源是一份面向Linux平台开发者的AFSim 2.9.0源码编译实操指南,专为解决Ubuntu环境下AFSim仿真平台构建难、依赖杂、配置易错等典型问题而编写,适用于具备基础Linux命令行能力及C++编译经验的中高级开发者与科研人员。文档以PDF格式呈现,共1个文件(694KB),内容覆盖从环境准备、第三方库部署、环境变量配置(含AFSIM_HOME与LD_LIBRARY_PATH详细路径)、CMake-3.22.1+Qt5.15图形化配置,到最终编译与运行测试的全流程,附有Ubuntu 22.04.4 LTS系统下推荐的硬件配置(16GB内存、i7-13700H、RTX 3060)及标准化目录结构说明(afsim/、demos/、dependencies/3rd_party/等模块划分清晰)。目前已有2568人学习下载,是当前CSDN平台上少有的、完整记录AFSim 2.9.0在主流Linux发行版中可复现编译路径的实战型技术文档。
1. AFSim2.9.0 Linux编译指南:不是“装上就能跑”,而是“配错一个路径就卡死在CMake Configure阶段”的硬核实战笔记
你手头有一份AFSim2.9.0的源码包,解压后看到afsim/、dependencies/3rd_party/、demos/这些目录,心里想:“不就是cmake + make的事?”——我去年也这么想。结果在Ubuntu 22.04上折腾了整整三天,卡在CMake Error at CMakeLists.txt:127 (find_package): By not providing "FindOSG.cmake",查遍全网,发现90%的教程都默认你已预装OSG、osgEarth、GDAL等二十多个第三方库,且版本必须严丝合缝。而AFSim2.9.0官方Linux构建文档几乎为零,这份由一线开发者实测整理的《AFSim2.9.0 Linux编译指南》,不是教你怎么点GUI按钮,而是告诉你:环境变量里少写一个冒号、LD_LIBRARY_PATH中路径顺序颠倒、Qt5.12.11的lib和lib64混用、甚至su root后未重载.bashrc——任何一处都会让cmake-gui静默失败,连报错都不给你看全。它专为已在/home/sma/AFSIMSrc/下摆好目录结构、手握tools.rar和gcc-g++.rar压缩包、准备真刀真枪编译的工程师而写。如果你刚下载完源码还没解压,建议先合上这篇;但如果你已经cd进afsim/却反复看到Configuring incomplete, errors occurred!,那接下来每一行命令、每一个路径、每一个export,都是你翻车现场的后悔药。
2. 编译前必验:为什么Ubuntu 22.04.4 + gcc-4.8.5是唯一安全组合,而非“能装就行”
AFSim2.9.0不是通用C++项目,它是面向特定仿真场景(如地理空间建模、多源传感器融合)构建的重型工具链,其CMakeLists.txt中大量硬编码依赖路径、ABI符号版本与Qt插件加载机制。所谓“兼容性”,不是指操作系统能启动,而是指所有第三方库的二进制符号表、RTTI类型信息、STL容器内存布局,必须与AFSim主工程完全对齐。我们来拆解官方指定组合背后的硬约束:
2.1 操作系统与内核ABI:Ubuntu 22.04.4 LTS的glibc 2.35是分水岭
AFSim2.9.0所依赖的osg-3.6.3-x64-lnx、osgEarth-2.10.1-x64-lnx等预编译库,全部链接的是GLIBC_2.27至GLIBC_2.35范围内的符号。若你在Ubuntu 24.04(glibc 2.39)下强行运行,即使编译通过,运行时也会在dlopen()加载libosgDB.so时触发undefined symbol: __cxa_throw——这是C++异常处理ABI不匹配的典型症状。而Ubuntu 22.04.4的glibc 2.35,恰好是这些预编译库的构建基准线。验证命令:
# 检查当前glibc版本 ldd --version | head -n1 # 输出应为:ldd (Ubuntu GLIBC 2.35-0ubuntu3.4) 2.35 # 检查预编译库依赖的glibc最小版本 objdump -T /home/sma/AFSIMSrc/dependencies/3rd_party/osg-3.6.3-x64-lnx/lib64/libosgDB.so | grep GLIBC_ | head -n3 # 正常应输出类似:0000000000000000 DF *UND* 0000000000000000 GLIBC_2.27 __cxa_atexit提示:不要试图用
patchelf修改预编译库的NEEDED条目。AFSim的Qt插件加载器(QPluginLoader)会校验ELF段完整性,篡改后wizard启动直接Segmentation Fault。
2.2 编译器锁定gcc-4.8.5:C++11 ABI切换点与Qt5.12.11的隐式契约
Qt5.12.11是AFSim2.9.0 GUI模块的基石,其libQt5Core.so内部使用std::string的COW(Copy-on-Write)实现,这要求所有链接它的模块(包括AFSim主程序、osgEarth插件)必须使用同一ABI。gcc-5.0起默认启用_GLIBCXX_USE_CXX11_ABI=1,导致std::string内存布局从24字节变为32字节。若你用gcc-11编译AFSim,而Qt5.12.11是gcc-4.8.5编译的,QString::fromStdString()调用时就会因结构体偏移错位而崩溃。官方gcc-g++.rar包中gcc-4.8.5的libstdc++.so.6符号表明确导出GLIBCXX_3.4.20(对应COW ABI),而非GLIBCXX_3.4.21+(对应CXX11 ABI)。验证方式:
# 查看Qt5.12.11的libstdc++依赖 readelf -d /home/sma/AFSIMSrc/dependencies/3rd_party/qt-5.12.11-x64-lnx/lib/libQt5Core.so.5 | grep NEEDED | grep stdc++ # 应输出:0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6] # 检查该libstdc++支持的ABI版本 strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX | tail -n5 # 若含GLIBCXX_3.4.20且不含GLIBCXX_3.4.21,则为COW ABI2.3 硬件资源不是“建议”,而是CMake配置阶段的硬性门槛
AFSim2.9.0的CMakeLists.txt中,find_package(OpenSSL REQUIRED)等指令会触发完整库扫描,而osgEarth的FindosgEarth.cmake需递归解析/home/sma/AFSIMSrc/dependencies/resources/vtk/下数百个.h头文件。实测表明:
- 内存低于14GB:
cmake-gui在Configure阶段因std::bad_alloc直接退出,日志仅显示Process finished with exit code 137; - CPU核心少于8线程:
make -j4时cc1plus进程频繁抢占,导致libgdal.so链接超时,报错collect2: error: ld terminated with signal 9 [Killed]; - NVIDIA驱动未正确加载:
osgViewer初始化失败,wizard启动后黑屏无响应(因AFSim默认启用GPU加速渲染)。
验证脚本(保存为check_hardware.sh并执行):
#!/bin/bash # 检查内存是否≥14GB MEM_GB=$(free -g | awk '/^Mem:/{print $2}') if [ "$MEM_GB" -lt 14 ]; then echo "ERROR: Memory ($MEM_GB GB) < 14GB. CMake configure will fail." exit 1 fi # 检查CPU逻辑核心数 CORES=$(nproc) if [ "$CORES" -lt 8 ]; then echo "ERROR: CPU cores ($CORES) < 8. make -j4 unstable." exit 1 fi # 检查NVIDIA驱动状态 if ! nvidia-smi -L &>/dev/null; then echo "WARNING: NVIDIA driver not detected. wizard may render black screen." fi3. 目录结构与权限:为什么必须严格遵循/home/sma/AFSIMSrc/,且全程root操作
AFSim2.9.0的构建系统不是现代CMake的“out-of-source”友好型,而是深度耦合绝对路径的遗留设计。其CMakeLists.txt中大量使用file(GLOB ... "${AFSIM_HOME}/demos/*")、include("${AFSIM_3RDPARTY_PATH}/cmake/FindGDAL.cmake")等硬编码路径。一旦根目录变更,cmake-gui将无法定位demos/中的测试数据,导致add_subdirectory(demos)失败,进而使整个afsim目标无法生成。更关键的是,权限模型决定了你不能用普通用户完成全流程——因为dependencies/3rd_party/下的预编译库(如qt-5.12.11-x64-lnx)的lib/目录权限为755,但其中.so文件属主为root:root,普通用户无权dlopen()加载。
3.1 目录树强制规范:每个斜杠都不能错
官方指定的根目录/home/sma/AFSIMSrc/不是示例,而是CMake脚本的锚点。以下是必须100%一致的结构(注意大小写与末尾斜杠):
| 路径 | 用途 | 必须存在 |
|---|---|---|
/home/sma/AFSIMSrc/afsim/ | 主源码目录,含CMakeLists.txt | ✓ |
/home/sma/AFSIMSrc/demos/ | 官方案例,afsim构建时需引用其CMakeLists.txt | ✓ |
/home/sma/AFSIMSrc/dependencies/3rd_party/ | 所有预编译第三方库(osg, qt, gdal等) | ✓ |
/home/sma/AFSIMSrc/dependencies/resources/ | VTK、OSG资源文件(shaders, models) | ✓ |
/home/sma/AFSIMSrc/tools/ | myenv_temp.sh等辅助脚本 | ✓ |
注意:
dependencies/3rd_party/下必须是解压后的完整目录结构,例如osg-3.6.3-x64-lnx/内含include/、lib64/、bin/;若你解压成osg-3.6.3-x64-lnx.tar.gz后得到osg-3.6.3-x64-lnx/子目录,请确保该子目录名与export LD_LIBRARY_PATH中写的完全一致(即.../osg-3.6.3-x64-lnx/lib64),否则libosg.so永远找不到。
3.2 权限链路:root不是为了偷懒,而是绕过Linux动态链接器的沙箱
AFSim2.9.0的wizard可执行文件在make install后生成于/home/sma/AFSIMSrc/afsim/build/wsf_install/bin/,其RPATH被硬编码为$ORIGIN/../lib:$ORIGIN/../lib64。这意味着运行./wizard时,动态链接器ld-linux-x86-64.so.2会从../lib目录加载libQt5Core.so.5等库。而这些库文件在qt-5.12.11-x64-lnx/lib/中,其权限为:
ls -l /home/sma/AFSIMSrc/dependencies/3rd_party/qt-5.12.11-x64-lnx/lib/libQt5Core.so.5 # -rwxr-xr-x 1 root root 5242880 Jan 1 00:00 libQt5Core.so.5普通用户sma虽有读权限(r-x),但Linux内核在dlopen()时会对libQt5Core.so.5执行openat(AT_FDCWD, ..., O_RDONLY|O_CLOEXEC),而该文件属主为root,触发cap_dac_override能力检查——普通用户无此能力,dlopen()返回NULL,wizard启动失败。解决方案只有两个:
chown -R sma:sma /home/sma/AFSIMSrc/dependencies/3rd_party/(不推荐:破坏预编译库完整性);- 全程用root执行
su root,再source ~/.bashrc重载环境变量(官方指南唯一可靠路径)。
验证权限是否就绪:
# 切换到root su root # 检查AFSIM_HOME是否生效 echo $AFSIM_HOME # 应输出:/home/sma/AFSIMSrc/afsim # 检查LD_LIBRARY_PATH是否包含qt路径 echo $LD_LIBRARY_PATH | grep "qt-5.12.11" # 应输出包含:/home/sma/AFSIMSrc/dependencies/3rd_party/qt-5.12.11-x64-lnx/lib # 测试能否dlopen Qt库(无需实际运行) ldd /home/sma/AFSIMSrc/dependencies/3rd_party/qt-5.12.11-x64-lnx/lib/libQt5Core.so.5 | head -n3 # 应显示正常依赖,无"not found"4. 环境变量与依赖安装:LD_LIBRARY_PATH不是拼接游戏,而是动态链接器的寻址地图
AFSim2.9.0的LD_LIBRARY_PATH长达2000+字符,包含15个第三方库的lib或lib64路径。这不是随意堆砌,而是动态链接器ld-linux按顺序扫描的精确寻址序列。顺序错误会导致符号覆盖:例如libpng的png_create_info_struct定义在libpng-1.6.37/lib/libpng.so,而gdal-3.3.2/lib/libgdal.so又静态链接了旧版libpng,若gdal路径排在libpng之前,dlopen("libosgDB.so")时就会加载gdal自带的libpng,引发png_set_longjmp_fn符号冲突。因此,官方给出的顺序是经过nm -D符号表比对的最优解。
4.1.bashrc环境变量配置:空格、冒号、引号的生死线
官方指南中export LD_LIBRARY_PATH=...命令存在两处致命陷阱:
- 路径间空格后多了一个空格:
.../sdl-2.0.16-x64-lnx/lib64: ${AFSIM_3RDPARTY_PATH}/tinyxml2-...中的:后空格会导致ld-linux将" "(空格)识别为独立路径,报错/usr/bin/ld: cannot find : No such file; - 未用双引号包裹整个值:当路径含空格(如
/home/sma/My Projects/)时,$LD_LIBRARY_PATH会被shell分割,ld-linux只收到第一个路径。
修正后的.bashrc追加内容(请逐字复制,勿手动换行):
# 在~/.bashrc末尾添加(注意:无空格,无换行,双引号包裹) export AFSIM_HOME="/home/sma/AFSIMSrc/afsim" export AFSIM_3RDPARTY_PATH="/home/sma/AFSIMSrc/dependencies/3rd_party" export LD_LIBRARY_PATH="/home/sma/AFSIMSrc/dependencies/3rd_party/tiff-4.4.0-x64-lnx/lib:/home/sma/AFSIMSrc/dependencies/3rd_party/sqlite-3.32.3-x64-lnx/lib:/home/sma/AFSIMSrc/dependencies/3rd_party/sdl-2.0.16-x64-lnx/lib64:/home/sma/AFSIMSrc/dependencies/3rd_party/tinyxml2-7.1.0-x64-lnx/lib:/home/sma/AFSIMSrc/dependencies/3rd_party/gtest-1.8.0-x64-lnx/lib:/home/sma/AFSIMSrc/dependencies/3rd_party/openssl-3.1.1-x64-lnx/lib64:/home/sma/AFSIMSrc/dependencies/3rd_party/curl-8.2.0-x64-lnx/lib:/home/sma/AFSIMSrc/dependencies/3rd_party/proj-8.1.1-x64-lnx/lib:/home/sma/AFSIMSrc/dependencies/3rd_party/geos-3.5.1-x64-lnx/lib:/home/sma/AFSIMSrc/dependencies/3rd_party/gdal-3.3.2-x64-lnx/lib:/home/sma/AFSIMSrc/dependencies/3rd_party/zlib-1.2.11-x64-lnx/lib:/home/sma/AFSIMSrc/dependencies/3rd_party/libpng-1.6.37-x64-lnx/lib:/home/sma/AFSIMSrc/dependencies/3rd_party/ffmpeg-4.2.4-x64-lnx/lib:/home/sma/AFSIMSrc/dependencies/3rd_party/libjpeg-turbo-2.1.2-x64-lnx/lib:/home/sma/AFSIMSrc/dependencies/3rd_party/osg-3.6.3-x64-lnx/lib64:/home/sma/AFSIMSrc/dependencies/3rd_party/osgEarth-2.10.1-x64-lnx/lib64:/home/sma/AFSIMSrc/dependencies/3rd_party/qt-5.12.11-x64-lnx/lib:${LD_LIBRARY_PATH}"提示:
export命令后必须跟source ~/.bashrc,且必须在root shell中执行。普通用户sma的.bashrc不会被su root继承,su root后需手动source。
4.2myenv_temp.sh:不是一键安装,而是权限提升与路径注册的原子操作
/home/sma/AFSIMSrc/dependencies/myenv_temp.sh是官方提供的环境初始化脚本,其核心功能并非安装软件,而是:
- 将
/home/sma/AFSIMSrc/dependencies/tools/加入PATH,使cmake-gui可被全局调用; - 创建
/home/sma/AFSIMSrc/afsim/build/目录并赋予root:root所有权; - 验证
gcc-4.8.5的bin/目录是否在PATH中,若不在则软链接。
执行前务必确认:
# 检查脚本是否存在且可执行 ls -l /home/sma/AFSIMSrc/dependencies/myenv_temp.sh # 应输出:-rwxr-xr-x 1 sma sma ... myenv_temp.sh # 执行(必须在dependencies目录下) cd /home/sma/AFSIMSrc/dependencies chmod +x myenv_temp.sh ./myenv_temp.sh脚本成功执行后,应看到类似输出:
[INFO] Adding /home/sma/AFSIMSrc/dependencies/tools to PATH [INFO] Creating build directory: /home/sma/AFSIMSrc/afsim/build [INFO] Setting ownership to root:root [INFO] GCC-4.8.5 detected in /home/sma/AFSIMSrc/dependencies/gcc-g++/bin若报错command not found: cmake-gui,说明tools/目录未正确加入PATH,需手动执行:
export PATH="/home/sma/AFSIMSrc/dependencies/tools:$PATH"5. CMake配置与编译:cmake-gui不是图形界面,而是AFSim构建系统的黑匣子探针
AFSim2.9.0的CMake配置是成败分水岭。cmake-gui在此不是简化操作,而是唯一能捕获底层依赖探测细节的调试接口。命令行cmake ..只会输出-- Configuring incomplete,而cmake-gui的Show Advanced选项能展开所有CMAKE_*变量,让你看到OSG_DIR为何为空、QT5_DIR指向何处。更重要的是,cmake-gui的Configure按钮会触发完整的find_package()链式调用,并将每一步日志实时写入CMakeCache.txt——这是你排查FindXXX.cmake失败的唯一依据。
5.1cmake-gui启动与路径设置:Where is the source code不是问句,而是填空题
启动cmake-gui前,必须确保当前工作目录为/home/sma/AFSIMSrc/afsim/build/(注意:是build/,不是afsim/):
su root cd /home/sma/AFSIMSrc/afsim/build cmake-gui在GUI界面中,必须手动填写两个路径(不能依赖Browse按钮):
Where is the source code:/home/sma/AFSIMSrc/afsim(注意末尾无斜杠)Where to build the binaries:/home/sma/AFSIMSrc/afsim/build(必须与当前目录一致)
注意:若
Where to build the binaries填为/home/sma/AFSIMSrc/afsim/build/(末尾斜杠),cmake-gui会创建build//CMakeFiles/目录,导致后续make找不到Makefile。
5.2 Configure与Generate:如何读懂红色报错背后的三重真相
点击Configure后,若出现红色报错框,不要急着点OK关闭。真正的线索在底部Output Log面板。典型报错及根因:
| Output Log片段 | 真实含义 | 解决方案 |
|---|---|---|
CMake Error at /usr/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:230 (message): Could NOT find OSG (missing: OSG_LIBRARY OSG_INCLUDE_DIR) | find_package(OSG)失败,因OSG_DIR未设或osg-3.6.3的lib64/中无libosg.so | 检查/home/sma/AFSIMSrc/dependencies/3rd_party/osg-3.6.3-x64-lnx/lib64/是否存在libosg.so;若为libosg.so.130,需创建软链接:ln -s libosg.so.130 libosg.so |
CMake Warning at CMakeLists.txt:89 (find_package): By not providing "FindQt5.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "Qt5", but CMake did not find one. | Qt5_DIR未指向qt-5.12.11的lib/cmake/Qt5/目录 | 在cmake-gui中,点击Add Entry,Name填Qt5_DIR,Type选PATH,Value填/home/sma/AFSIMSrc/dependencies/3rd_party/qt-5.12.11-x64-lnx/lib/cmake/Qt5 |
CMake Error: The source directory "/home/sma/AFSIMSrc/afsim" does not appear to contain CMakeLists.txt. | 当前source code路径错误,或afsim/目录下CMakeLists.txt被误删 | ls -l /home/sma/AFSIMSrc/afsim/CMakeLists.txt确认文件存在 |
Configure成功后,Generate按钮才可用。点击Generate,若提示Generating done,则build/目录下已生成Makefile。此时切勿关闭cmake-gui——因为CMakeCache.txt中记录的CMAKE_BUILD_TYPE默认为""(空),而AFSim要求Release模式,需手动在GUI中找到CMAKE_BUILD_TYPE,双击Value列,输入Release,再点Configure一次(此时无报错),最后Generate。
5.3make -j4编译:为什么必须用-j4而非-j$(nproc),以及如何捕获静默失败
AFSim2.9.0的Makefile中,libosgEarth.so的链接命令包含-Wl,--no-as-needed,但-j参数过高会导致ld并发抢占符号表锁。实测-j8时,libosgEarth.so链接阶段随机报错/usr/bin/ld: cannot find -lproj,而-j4稳定通过。编译命令必须在build/目录下执行:
su root cd /home/sma/AFSIMSrc/afsim/build make -j4编译过程约45分钟,终端会滚动大量[ 12%] Building CXX object ...。关键观察点不是进度条,而是最后几行:
- 正常结束:
[100%] Linking CXX executable ../wsf_install/bin/wizard后停在$提示符; - 静默失败:
[100%] Linking CXX executable ../wsf_install/bin/wizard后直接返回$,但../wsf_install/bin/下无wizard文件。
此时必须检查CMakeFiles/afsim.dir/link.txt中的链接命令是否完整:
# 查看最后链接命令 tail -n5 CMakeFiles/afsim.dir/link.txt # 应包含:/usr/bin/c++ -O3 -DNDEBUG ... -o ../wsf_install/bin/wizard ... -lQt5Core -lQt5Gui -lQt5Widgets ...若缺失-lQt5Core等,说明cmake-gui中Qt5_DIR未生效,需重新Configure。
6. 常见问题排查:五个血泪经验总结,每个都曾让我重启三次虚拟机
AFSim2.9.0编译不是线性流程,而是多层依赖的脆弱平衡。以下问题均来自真实翻车现场,按发生频率排序,每条均附可复现现象、根本原因与一招毙命解法。
6.1 现象:cmake-gui点击Configure后无反应,Output Log空白,GUI卡死
原因:cmake-gui依赖Qt5.12.11的libQt5XcbQpa.so插件,而该插件需libxcb-xinerama.so.0,Ubuntu 22.04.4默认不安装libxcb-xinerama0包。
解决:
su root apt update && apt install -y libxcb-xinerama0 # 然后重启cmake-gui6.2 现象:make -j4到98%时,[ 98%] Linking CXX shared library ../wsf_install/lib/libafsim.so报错/usr/bin/ld: cannot find -lgeos_c
原因:geos-3.5.1-x64-lnx/lib/下只有libgeos.so.3.5.1,无libgeos_c.so(C语言接口库),而AFSim的CMakeLists.txt硬编码target_link_libraries(afsim PRIVATE geos_c)。
解决:
# 进入geos库目录,创建C接口软链接 cd /home/sma/AFSIMSrc/dependencies/3rd_party/geos-3.5.1-x64-lnx/lib ln -s libgeos.so.3.5.1 libgeos_c.so6.3 现象:make install后,./wsf_install/bin/wizard启动闪退,dmesg | tail显示traps: wizard[12345] general protection ip:... sp:... error:6
原因:wizard启动时加载libosgDB.so,而该库依赖libtiff.so.5,但LD_LIBRARY_PATH中tiff-4.4.0的lib/下是libtiff.so.6,版本不匹配。
解决:
# 进入tiff库目录,创建兼容软链接 cd /home/sma/AFSIMSrc/dependencies/3rd_party/tiff-4.4.0-x64-lnx/lib ln -s libtiff.so.6 libtiff.so.56.4 现象:cmake-guiConfigure成功,Generate也成功,但make -j4报错fatal error: osg/Version: No such file or directory
原因:osg-3.6.3-x64-lnx/include/目录未被CMAKE_INCLUDE_PATH包含,find_package(OSG)虽成功,但头文件搜索路径未注入。
解决:
在cmake-gui中,点击Add Entry,Name填CMAKE_INCLUDE_PATH,Type选PATH,Value填/home/sma/AFSIMSrc/dependencies/3rd_party/osg-3.6.3-x64-lnx/include,再Configure。
6.5 现象:./wsf_install/bin/wizard启动后界面显示,但点击“Load Demo”无响应,终端无报错
原因:demos/目录权限为sma:sma,而wizard以root运行,无法读取demos/terrain/下的.osgb模型文件。
解决:
# 递归修改demos权限 su root chown -R root:root /home/sma/AFSIMSrc/demos/ chmod -R 755 /home/sma/AFSIMSrc/demos/7. 运行验证与进阶技巧:用ldd -r揪出隐藏的undefined symbol,以及我的强制检查清单
编译成功的标志不是make返回0,而是wizard能加载demos/中的任意案例并渲染出3D地形。但AFSim2.9.0的“成功运行”有更深一层含义:所有动态符号必须可解析,无undefined symbol。因为仿真过程中,osgEarth会动态加载osgDB插件,若插件中存在未定义符号,dlopen()静默失败,导致地形纹理丢失、模型不显示——这种问题在GUI中毫无提示,只能靠ldd -r提前捕获。
7.1 终极验证:ldd -r扫描wizard及其所有依赖库
进入安装目录,对wizard执行符号解析检查:
su root cd /home/sma/AFSIMSrc/afsim/build/wsf_install/bin # 检查wizard主程序 ldd -r ./wizard | grep "undefined" # 应输出空行 # 检查关键依赖库(重点:osgEarth、gdal、Qt5) ldd -r ../lib/libosgEarth.so.2.10 | grep "undefined" ldd -r ../lib/libgdal.so.28 | grep "undefined" ldd -r ../lib/libQt5Core.so.5 | grep "undefined"若ldd -r输出类似undefined symbol: _ZN3osg10ObjectBaseC1Ev (./wizard),说明libosg.so未被正确链接,需检查CMakeLists.txt中target_link_libraries(afsim PRIVATE osg)是否生效,或LD_LIBRARY_PATH中osg路径是否在Qt5之前(避免Qt的libstdc++.so.6覆盖)。
7.2 我的强制检查清单:每次编译前必做五件事
从第一次编译失败到最终稳定运行,我提炼出一份不可跳过的检查清单。现在,从那以后我每次开始编译AFSim2.9.0,都强制走一遍这个流程,哪怕只是重试:
| 步骤 | 命令 | 期望输出 | 不通过则停止 |
|---|---|---|---|
| 1. 检查glibc版本 | ldd --version | head -n1 | ldd (Ubuntu GLIBC 2.35-0ubuntu3.4) 2.35 | 升级/降级系统 |
| 2. 检查gcc版本 | /home/sma/AFSIMSrc/dependencies/gcc-g++/bin/gcc --version | gcc (GCC) 4.8.5 | 替换gcc-g++.rar |
| 3. 检查AFSIM_HOME | echo $AFSIM_HOME | /home/sma/AFSIMSrc/afsim | 重载.bashrc |
| 4. 检查Qt5_DIR | ls /home/sma/AFSIMSrc/dependencies/3rd_party/qt-5.12.11-x64-lnx/lib/cmake/Qt5/ | 列出Qt5CoreConfig.cmake等文件 | 修复路径或重新解压 |
| 5. 检查demos权限 | ls -l /home/sma/AFSIMSrc/demos/ | head -n1 | drwxr-xr-x 3 root root ... demos/ | chown -R root:root demos/ |
这个清单的每一项,都对应一个曾让我花费6小时以上排查的坑。比如第4项,某次qt-5.12.11-x64-lnx.tar.gz解压后lib/cmake/下为空,原因是tar命令用了-xzf而非-xvzf,没看到解压警告;第5项,demos/权限错误导致wizard能
本文还有配套的精品资源,点击获取