FastDDS v3.2.2 编译安装踩坑全记录:从Ubuntu 16.04到20.04的血泪史

FastDDS v3.2.2 编译安装踩坑全记录:从Ubuntu 16.04到20.04的血泪史

前言

最近在项目中需要学习和使用FastDDS(eProsima 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.0
  • CMake:3.5.1

1.2 最终环境(成功)

  • 虚拟机软件:VMware Workstation 16.2.5
  • 操作系统:Ubuntu 20.04 LTS (Focal)
  • 编译器:GCC 9.4.0
  • CMake:4.3.4
  • 目标软件:eProsima FastDDS v3.2.2

二、踩坑记录

坑1:VMware虚拟机硬件版本冲突

问题现象:

此虚拟机使用的处理器所支持的功能不同于保存虚拟机状态的虚拟机所支持的处理器所支持的功能。

原因分析:虚拟机配置文件要求硬件版本21(virtualHW.version = "21"),但VMware Workstation 16.x版本过低不支持。

解决方案:

  1. 修改.vmx文件,将virtualHW.version从"21"改为"18"
  2. 删除挂起状态文件(.vmss.lck文件夹)
  3. 或者直接重装Ubuntu 20.04虚拟机(推荐)

坑2:Git克隆源码超时与镜像失效

问题现象:

$ 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_TYPE=Release .. make -j$(nproc) sudo make install sudo ldconfig

坑5:Git 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握手失败,且使用-DTHIRDPARTY=ON参数会强制CMake拉取子模块。

解决方案:

  1. 从Gitee下载tinyxml2源码包,手动放置于thirdparty/tinyxml2
  2. 关键操作:在CMake配置命令中移除-DTHIRDPARTY=ON参数

坑6:CMake版本过低(致命)

问题现象:

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::array<uint8_t, 4> m_value{0}; ^

原因分析:Ubuntu 16.04默认的GCC 5.4.0编译器对C++11/14的部分新特性(如花括号初始化列表)支持存在缺陷。而FastDDS v2.14.3源码中大量使用了现代C++语法,导致编译器无法解析。

终极解决方案:放弃Ubuntu 16.04,重装Ubuntu 20.04!

  • Ubuntu 16.04的GCC 5.4.0 → 无法编译现代C++代码
  • Ubuntu 20.04的GCC 9.4.0 → 完美支持C++17

血泪教训:

在Linux下做C++开发(尤其是ROS2、FastDDS这种现代项目),Ubuntu 20.04是目前的绝对底线,16.04早就被官方和开源社区抛弃了。不要在过时的系统上浪费时间!


坑8:Python依赖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

坑9:FastDDS 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 psutil

3.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_TYPE=Release .. make -j$(nproc) sudo make install sudo ldconfig

3.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_TYPE=Release .. make -j$(nproc) sudo make install sudo ldconfig

3.4 编译FastDDS

cd ~/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配置(注意:不要加-DTHIRDPARTY=ON) cmake \ -DCMAKE_INSTALL_PREFIX=/usr/local \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_EXAMPLES=ON \ -DBUILD_SHARED_LIBS=ON \ .. # 编译(耗时15-30分钟) make -j$(nproc) # 安装 sudo make install sudo ldconfig # 配置环境变量 echo "export LD_LIBRARY_PATH=/usr/local/lib:\$LD_LIBRARY_PATH" >> ~/.bashrc source ~/.bashrc

3.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-DDS

GitHub

Gitee镜像:https://gitee.com/mirrors/Fast-DDS.git

Fast-CDR

GitHub

wget下载源码包

foonathan_memory

GitHub

wget下载源码包

tinyxml2

GitHub

Gitee镜像下载源码包

4.2 CMake参数配置陷阱

错误做法:

cmake -DTHIRDPARTY=ON ... # 会强制拉取Git子模块,网络受限必死

正确做法:

cmake ... # 去掉-DTHIRDPARTY=ON,使用系统已安装的依赖

4.3 编译器版本选择

血泪教训:

Ubuntu版本

GCC版本

编译FastDDS v3.x

建议

16.04

5.4.0

❌ 必死无疑

立即放弃,重装系统

18.04

7.5.0

⚠️ 可能成功

不推荐

20.04

9.4.0

✅ 完美支持

强烈推荐

22.04

11.4.0

✅ 完美支持

推荐


五、FastDDS v3.x 版本特性变化

5.1 命令行工具整合

v2.x时代:

fast-discovery-server -l 127.0.0.1 -p 11811

v3.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.04

30分钟

包括系统安装和基础配置

Ubuntu 20.04编译FastDDS

1小时

按本文流程一次成功

总计

约9小时

如果在20.04上直接开始,只需1小时

6.2 核心建议

  1. 环境选择大于努力:不要在过时的Ubuntu 16.04上浪费时间,直接用Ubuntu 20.04
  2. 网络问题用wget解决:Git clone失败就改用wget下载源码包手动编译
  3. 依赖管理要手动:去掉-DTHIRDPARTY=ON参数,手动编译安装所有依赖
  4. CMake版本要升级:使用pip3安装最新版CMake,不要用系统自带的
  5. 版本特性要了解:FastDDS v3.x命令行工具已整合,示例代码结构变化

6.3 下一步计划

任务二已完成,接下来将:

  1. 在虚拟机中安装Docker和k3s容器编排工具
  2. 制作FastDDS Docker镜像
  3. 在容器中运行FastDDS测试程序
  4. 输出调试日志

七、参考资料

  • FastDDS官方文档:https://fast-dds.docs.eprosima.com/
  • FastDDS GitHub:https://github.com/eProsima/Fast-DDS
  • Asio官方仓库:https://github.com/chriskohlhoff/asio
  • foonathan/memory:https://github.com/foonathan/memory

最后的话:

编译FastDDS的过程虽然曲折,但通过这个过程,我对C++编译原理、CMake构建系统、Linux依赖管理有了更深入的理解。希望这篇文章能帮助到同样在踩坑的你!

如果文章对你有帮助,欢迎点赞、收藏、评论,你的支持是我继续分享的动力!🚀

有任何问题,欢迎在评论区留言讨论!


版权声明:本文为原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。