FastDDS v3.2.2 编译安装踩坑全记录:从Ubuntu 16.04到20.04的血泪史 前言最近在项目中需要学习和使用FastDDSeProsima Fast DDS中间件按照Mentor的要求在Ubuntu虚拟机中编译运行FastDDS v3.2.2版本。本以为按照官方文档操作就能顺利完成没想到从环境搭建到最终编译成功整整折腾了两天遇到了各种匪夷所思的问题。本文详细记录了整个过程中遇到的所有坑及其解决方案希望能帮助后来者少走弯路。文章亮点✅ VMware虚拟机配置问题✅ Ubuntu 16.04 vs 20.04 的编译器版本陷阱✅ 网络受限环境下的源码获取方案✅ CMake版本升级的骚操作✅ 依赖库手动编译的降维打击法✅ FastDDS v3.x 版本特性变化一、环境说明1.1 初始环境失败虚拟机软件VMware Workstation 16.2.5操作系统Ubuntu 16.04 LTS (Xenial)编译器GCC 5.4.0CMake3.5.11.2 最终环境成功虚拟机软件VMware Workstation 16.2.5操作系统Ubuntu 20.04 LTS (Focal)编译器GCC 9.4.0CMake4.3.4目标软件eProsima FastDDS v3.2.2二、踩坑记录坑1VMware虚拟机硬件版本冲突问题现象此虚拟机使用的处理器所支持的功能不同于保存虚拟机状态的虚拟机所支持的处理器所支持的功能。原因分析虚拟机配置文件要求硬件版本21virtualHW.version 21但VMware Workstation 16.x版本过低不支持。解决方案修改.vmx文件将virtualHW.version从21改为18删除挂起状态文件.vmss和.lck文件夹或者直接重装Ubuntu 20.04虚拟机推荐坑2Git克隆源码超时与镜像失效问题现象$ git clone https://mirror.ghproxy.com/https://github.com/eProsima/Fast-DDS.git fatal: unable to access https://mirror.ghproxy.com/...: Failed to connect to mirror.ghproxy.com port 443: 连接超时原因分析国内网络环境直连GitHub不稳定且部分公共镜像站已失效。解决方案使用国内Gitee镜像源git clone https://gitee.com/mirrors/Fast-DDS.git坑3核心依赖库Asio版本过低问题现象CMake Error at cmake/modules/FindAsio.cmake:48 (message): Found Asio version 1.10.6, which is not compatible with Fast DDS. Minimum required Asio version: 1.13.0原因分析Ubuntu 16.04官方源中的libasio-dev版本过旧1.10.6无法满足FastDDS的需求。解决方案由于Asio是Header-only纯头文件库直接复制头文件到系统目录# 下载Asio 1.30.2源码包 wget https://github.com/chriskohlhoff/asio/archive/refs/tags/asio-1-30-2.tar.gz tar -xzf asio-1-30-2.tar.gz # 复制头文件到系统目录 cd asio-asio-1-30-2/asio/include sudo cp -r asio /usr/local/include/ sudo cp asio.hpp /usr/local/include/坑4内存分配器foonathan_memory缺失问题现象CMake Error at CMakeLists.txt:262 (find_package): By not providing Findfoonathan_memory.cmake in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by foonathan_memory, but CMake did not find one.原因分析系统未安装该第三方依赖且网络原因导致CMake无法自动下载。解决方案手动下载源码包并独立编译# 下载源码包 wget https://github.com/foonathan/memory/archive/refs/heads/main.tar.gz -O memory.tar.gz tar -xzf memory.tar.gz cd memory-main # 编译安装 mkdir build cd build cmake -DCMAKE_INSTALL_PREFIX/usr/local -DCMAKE_BUILD_TYPERelease .. make -j$(nproc) sudo make install sudo ldconfig坑5Git Submodule (tinyxml2)拉取失败问题现象fatal: unable to access https://github.com/leethomason/tinyxml2.git/: gnutls_handshake() failed: The TLS connection was non-properly terminated. CMake Error at cmake/common/eprosima_libraries.cmake:229 (message): Cannot configure Git submodule TinyXML2原因分析网络波动导致TLS握手失败且使用-DTHIRDPARTYON参数会强制CMake拉取子模块。解决方案从Gitee下载tinyxml2源码包手动放置于thirdparty/tinyxml2关键操作在CMake配置命令中移除-DTHIRDPARTYON参数坑6CMake版本过低致命问题现象CMake Error at CMakeLists.txt:18 (cmake_minimum_required): CMake 3.20 or higher is required. You are running version 3.16.3原因分析FastDDS v3.2.2版本较新要求CMake至少3.20版本而Ubuntu 20.04默认自带CMake 3.16.3。解决方案使用pip3安装最新版CMake# 安装pip3 sudo apt install python3-pip -y # 使用pip3安装最新版cmake pip3 install cmake # 将pip安装的可执行文件路径加入环境变量 echo export PATH$HOME/.local/bin:$PATH ~/.bashrc source ~/.bashrc # 验证版本 cmake --version # 输出cmake version 4.3.4坑7编译器版本过低导致C语法报错最坑问题现象/home/huan/tyx/fastdds_ws/src/Fast-DDS/src/cpp/statistics/types/types.h:174:37: error: array must be initialized with a brace-enclosed initializer std::arrayuint8_t, 4 m_value{0}; ^原因分析Ubuntu 16.04默认的GCC 5.4.0编译器对C11/14的部分新特性如花括号初始化列表支持存在缺陷。而FastDDS v2.14.3源码中大量使用了现代C语法导致编译器无法解析。终极解决方案放弃Ubuntu 16.04重装Ubuntu 20.04Ubuntu 16.04的GCC 5.4.0 → 无法编译现代C代码Ubuntu 20.04的GCC 9.4.0 → 完美支持C17血泪教训在Linux下做C开发尤其是ROS2、FastDDS这种现代项目Ubuntu 20.04是目前的绝对底线16.04早就被官方和开源社区抛弃了。不要在过时的系统上浪费时间坑8Python依赖psutil缺失问题现象$ fastdds discovery -l 127.0.0.1 -p 11811 psutil module not found. Try to install running pip install psutil原因分析FastDDS v3.x的命令行工具fastdds是用Python编写的需要psutil库来监控系统进程和网络状态。解决方案pip3 install psutil坑9FastDDS v3.x版本示例代码结构变化问题现象$ cd ~/fastdds_ws/src/Fast-DDS/build/bin bash: cd: .../build/bin: No such file or directory $ find ~/fastdds_ws/src/Fast-DDS/build -name HelloWorld* -executable -type f 无输出原因分析FastDDS v3.x版本重构了示例代码结构不再默认提供预编译的HelloWorld二进制文件而是把重点放在了核心库和命令行工具上。解决方案运行FastDDS核心组件——Discovery Server来验证中间件fastdds discovery -l 127.0.0.1 -p 11811预期输出#### Server started #### GUID prefix: 01.0f.d1.d7.63.e0.77.67.00.00.00.00 Running on: UDPv4:[127.0.0.1]:11811三、完整编译操作流程3.1 基础环境准备# 1. 更新系统 sudo apt update sudo apt upgrade -y # 2. 安装基础工具 sudo apt install -y git cmake g wget libasio-dev libtinyxml2-dev libssl-dev build-essential python3-pip # 3. 升级CMake到4.3.4 pip3 install cmake echo export PATH$HOME/.local/bin:$PATH ~/.bashrc source ~/.bashrc # 4. 安装Python依赖 pip3 install psutil3.2 编译Fast-CDR依赖cd ~/fastdds_ws/src # 下载Fast-CDR v2.2.2源码包 wget https://github.com/eProsima/Fast-CDR/archive/refs/tags/v2.2.2.tar.gz -O fastcdr.tar.gz tar -xzf fastcdr.tar.gz cd Fast-CDR-2.2.2 # 编译安装 mkdir build cd build cmake -DCMAKE_INSTALL_PREFIX/usr/local -DCMAKE_BUILD_TYPERelease .. make -j$(nproc) sudo make install sudo ldconfig3.3 编译foonathan_memory依赖cd ~/fastdds_ws/src # 下载foonathan/memory源码包 wget https://github.com/foonathan/memory/archive/refs/heads/main.tar.gz -O memory.tar.gz tar -xzf memory.tar.gz cd memory-main # 编译安装 mkdir build cd build cmake -DCMAKE_INSTALL_PREFIX/usr/local -DCMAKE_BUILD_TYPERelease .. make -j$(nproc) sudo make install sudo ldconfig3.4 编译FastDDScd ~/fastdds_ws/src # 使用Gitee镜像克隆源码 git clone https://gitee.com/mirrors/Fast-DDS.git cd Fast-DDS # 切换到v3.2.2版本 git checkout v3.2.2 # 创建build目录 mkdir build cd build # CMake配置注意不要加-DTHIRDPARTYON cmake \ -DCMAKE_INSTALL_PREFIX/usr/local \ -DCMAKE_BUILD_TYPERelease \ -DBUILD_EXAMPLESON \ -DBUILD_SHARED_LIBSON \ .. # 编译耗时15-30分钟 make -j$(nproc) # 安装 sudo make install sudo ldconfig # 配置环境变量 echo export LD_LIBRARY_PATH/usr/local/lib:\$LD_LIBRARY_PATH ~/.bashrc source ~/.bashrc3.5 验证安装# 检查FastDDS工具 ls /usr/local/bin/fast* # 输出 # /usr/local/bin/fastdds # /usr/local/bin/fast-discovery-server # /usr/local/bin/fast-discovery-server-1.0.1 # 运行Discovery Server fastdds discovery -l 127.0.0.1 -p 11811 # 预期输出 # #### Server started #### # GUID prefix: 01.0f.d1.d7.63.e0.77.67.00.00.00.00 # Running on: UDPv4:[127.0.0.1]:11811四、关键问题解决总结4.1 网络受限环境下的源码获取策略问题虚拟机无法直接git cloneGitHub仓库解决方案矩阵依赖库原地址替代方案Fast-DDSGitHubGitee镜像https://gitee.com/mirrors/Fast-DDS.gitFast-CDRGitHubwget下载源码包foonathan_memoryGitHubwget下载源码包tinyxml2GitHubGitee镜像下载源码包4.2 CMake参数配置陷阱错误做法cmake -DTHIRDPARTYON ... # 会强制拉取Git子模块网络受限必死正确做法cmake ... # 去掉-DTHIRDPARTYON使用系统已安装的依赖4.3 编译器版本选择血泪教训Ubuntu版本GCC版本编译FastDDS v3.x建议16.045.4.0❌ 必死无疑立即放弃重装系统18.047.5.0⚠️ 可能成功不推荐20.049.4.0✅ 完美支持强烈推荐22.0411.4.0✅ 完美支持推荐五、FastDDS v3.x 版本特性变化5.1 命令行工具整合v2.x时代fast-discovery-server -l 127.0.0.1 -p 11811v3.x时代fastdds discovery -l 127.0.0.1 -p 11811所有独立工具如discovery-server被整合到统一的fastdds命令中。5.2 示例代码结构重构v2.x提供预编译的HelloWorld二进制文件v3.x不再默认提供预编译示例重点转向核心库和CLI工具六、总结与建议6.1 时间成本统计任务耗时说明Ubuntu 16.04环境挣扎8小时各种编译器报错、依赖缺失重装Ubuntu 20.0430分钟包括系统安装和基础配置Ubuntu 20.04编译FastDDS1小时按本文流程一次成功总计约9小时如果在20.04上直接开始只需1小时6.2 核心建议环境选择大于努力不要在过时的Ubuntu 16.04上浪费时间直接用Ubuntu 20.04网络问题用wget解决Git clone失败就改用wget下载源码包手动编译依赖管理要手动去掉-DTHIRDPARTYON参数手动编译安装所有依赖CMake版本要升级使用pip3安装最新版CMake不要用系统自带的版本特性要了解FastDDS v3.x命令行工具已整合示例代码结构变化6.3 下一步计划任务二已完成接下来将在虚拟机中安装Docker和k3s容器编排工具制作FastDDS Docker镜像在容器中运行FastDDS测试程序输出调试日志七、参考资料FastDDS官方文档https://fast-dds.docs.eprosima.com/FastDDS GitHubhttps://github.com/eProsima/Fast-DDSAsio官方仓库https://github.com/chriskohlhoff/asiofoonathan/memoryhttps://github.com/foonathan/memory最后的话编译FastDDS的过程虽然曲折但通过这个过程我对C编译原理、CMake构建系统、Linux依赖管理有了更深入的理解。希望这篇文章能帮助到同样在踩坑的你如果文章对你有帮助欢迎点赞、收藏、评论你的支持是我继续分享的动力有任何问题欢迎在评论区留言讨论版权声明本文为原创文章遵循 CC 4.0 BY-SA 版权协议转载请附上原文出处链接和本声明。