4、环境搭建:在Linux/Windows上安装Fast DDS、依赖库(如Foonathan memory)、编译测试示例
Fast DDS(原名Fast RTPS)是eProsima公司开发的高性能DDS(Data Distribution Service)实现,广泛应用于机器人、自动驾驶、工业物联网等实时通信场景。在开始编写发布/订阅代码之前,必须先完成一套可靠、可复现的环境搭建流程。本章将围绕Linux(Ubuntu 22.04 LTS)和Windows 10/11两个主流平台,详细讲解Fast DDS及其核心依赖库(尤其是Foonathan memory)的安装步骤、编译验证方法以及常见排障思路。环境搭建的成败往往不取决于单个命令,而取决于对依赖关系、编译工具链和运行时路径的整体理解。
上图展示了Fast DDS环境搭建的整体依赖链路:从平台工具链出发,经过核心依赖库(Foonathan memory、Fast CDR等),再到Fast DDS本体,最终通过CMake构建并验证示例程序。右侧列出了最常见的排障入口,这些内容将在后续小节中逐一展开。
4.1 核心原理:Fast DDS的依赖树与构建系统
Fast DDS并非一个孤立的库,它依赖多个底层组件协同工作。理解依赖树是避免“装完跑不起来”的关键。Fast DDS 2.x版本的主要依赖包括:
- Foonathan memory:提供高性能内存分配器,用于管理DDS内部的数据缓存和队列,是Fast DDS性能优化的基石。
- Fast CDR:负责数据序列化与反序列化,是DDS数据在网络上传输的编码/解码层。
- TinyXML2:用于解析XML配置文件(如QoS策略文件、发现协议配置)。
- OpenSSL(可选):用于TLS加密通信和安全认证。
- Asio(可选):用于异步I/O,提升网络吞吐量。
构建系统方面,Fast DDS采用CMake作为元构建工具,支持静态库和动态库两种方式。在Linux上,默认使用GCC/G++;在Windows上,则依赖Visual Studio的MSVC编译器。CMake的find_package机制会搜索这些依赖库的安装路径,因此依赖库的安装位置必须与Fast DDS的搜索路径一致,否则会出现“找不到包”的错误。
/usr/local(默认前缀),这样CMake的默认搜索路径就能直接找到。在Windows上,建议统一使用vcpkg或CMake的CMAKE_PREFIX_PATH变量指定依赖库的安装根目录。
4.2 操作流程:Linux(Ubuntu 22.04)上的完整安装步骤
以下步骤在干净的Ubuntu 22.04 LTS上验证通过,适用于Fast DDS 2.10及以上版本。整个过程分为四个阶段:准备工具链、安装依赖库、编译Fast DDS、编译测试示例。
阶段一:安装基础工具链
sudo apt update
sudo apt install -y build-essential cmake git python3-pip
# 验证版本
g++ --version # 应显示 g++ 11.x
cmake --version # 应显示 cmake 3.22.x
阶段二:安装Foonathan memory及其他依赖
Foonathan memory推荐从源码编译,以获得最佳性能匹配。Fast DDS官方提供了foonathan_memory_vendor仓库,可以自动拉取并编译。
# 克隆Fast DDS及其依赖仓库(使用--recursive获取子模块)
git clone --recursive https://github.com/eProsima/Fast-DDS.git
cd Fast-DDS
# 方式A:使用vendor脚本(推荐,自动处理依赖)
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_TESTING=ON
make -j$(nproc)
sudo make install
如果网络受限或需要手动安装Foonathan memory,可单独执行:
git clone https://github.com/foonathan/memory.git
cd memory
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
make -j$(nproc)
sudo make install
阶段三:编译测试示例
Fast DDS源码中自带多个示例,位于examples/目录。编译并运行HelloWorld示例:
cd /path/to/Fast-DDS/examples/C++/HelloWorld
mkdir build && cd build
cmake ..
make -j$(nproc)
# 运行发布者(终端1)
./HelloWorldPublisher
# 运行订阅者(终端2)
./HelloWorldSubscriber
如果终端2的订阅者能持续打印Received: HelloWorld N,则说明环境搭建成功。
4.3 操作流程:Windows 10/11上的安装步骤
Windows环境推荐使用Visual Studio 2022 + CMake + vcpkg的组合。vcpkg可以自动解决依赖库的编译和安装问题,极大降低手动配置的复杂度。
步骤1:安装Visual Studio 2022
安装时勾选“使用C++的桌面开发”工作负载,确保包含MSVC编译器、Windows SDK和CMake工具。
步骤2:安装vcpkg并集成
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
.\bootstrap-vcpkg.bat
.\vcpkg integrate install
步骤3:通过vcpkg安装Fast DDS
.\vcpkg install fastdds:x64-windows
该命令会自动编译并安装Fast DDS及其所有依赖(包括Foonathan memory、Fast CDR等)。安装完成后,vcpkg会输出库文件的路径,例如C:\vcpkg\installed\x64-windows。
步骤4:编译测试示例
cd C:\path\to\Fast-DDS\examples\C++\HelloWorld
mkdir build && cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=C:\vcpkg\scripts\buildsystems\vcpkg.cmake
cmake --build . --config Release
# 运行
.\Release\HelloWorldPublisher.exe
.\Release\HelloWorldSubscriber.exe
fastdds.dll或foonathan_memory.dll。解决方案是将C:\vcpkg\installed\x64-windows\bin添加到系统PATH环境变量中,或者将DLL文件复制到可执行文件同目录下。
4.4 案例拆解:一次典型的“CMake找不到Foonathan”排障
以下案例来自实际教学过程中一位学员的反馈,具有典型性。
背景与约束:学员在Ubuntu 20.04上手动编译了Foonathan memory,但安装前缀使用了默认的/usr/local。随后编译Fast DDS时,CMake报错:Could not find a package configuration file provided by "foonathan_memory"。
初始现象:CMake在find_package(foonathan_memory REQUIRED)阶段失败,终止构建。
分析判断过程:首先检查Foonathan memory是否真的安装成功:ls /usr/local/lib/cmake/foonathan_memory,发现该目录存在,说明安装成功。接着检查CMake的搜索路径,发现CMake默认搜索/usr/lib/cmake和/usr/local/lib/cmake,理论上应该能找到。进一步检查发现,学员在编译Foonathan memory时使用了-DCMAKE_INSTALL_PREFIX=/usr,导致配置文件被安装到了/usr/lib/cmake,而Fast DDS的CMakeLists.txt中明确指定了CMAKE_PREFIX_PATH为/usr/local,因此搜索路径不匹配。
实际操作步骤:重新编译Foonathan memory,指定与Fast DDS一致的前缀:
cd memory/build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
make -j$(nproc)
sudo make install
然后重新编译Fast DDS,问题解决。
结果对比:修复后,CMake成功找到Foonathan memory,编译通过,示例程序运行正常。
复盘经验:依赖库的安装前缀必须与主项目的CMAKE_PREFIX_PATH保持一致。建议在项目根目录的CMakeLists.txt中统一设置set(CMAKE_PREFIX_PATH "/usr/local" CACHE PATH ""),避免歧义。
4.5 常见误区与总结复盘
| 误区/问题 | 现象 | 根因 | 解决方案 |
|---|---|---|---|
| 忽略子模块 | 编译报错找不到fastcdr头文件 | git clone时未加--recursive |
执行git submodule update --init --recursive |
| Windows PATH未配置 | 运行时提示缺少DLL | vcpkg的bin目录未加入PATH | 添加C:\vcpkg\installed\x64-windows\bin到PATH |
| CMake缓存残留 | 修改依赖路径后仍报旧错误 | build目录中的CMakeCache.txt未清理 | 删除build目录,重新执行cmake |
| OpenSSL版本冲突 | 链接时出现SSL函数未定义 | 系统OpenSSL与Fast DDS期望版本不匹配 | 使用vcpkg安装openssl并指定-DOPENSSL_ROOT_DIR |
总结复盘:环境搭建的核心在于“依赖一致性”。无论是Linux还是Windows,只要确保以下三点,就能避免绝大多数问题:
- 工具链版本匹配:CMake版本不低于3.16,编译器支持C++14及以上。
- 依赖库前缀统一:所有依赖库安装到同一前缀,并在CMake中显式指定。
- 运行时路径正确:动态库的搜索路径(Linux的
LD_LIBRARY_PATH,Windows的PATH)必须包含Fast DDS及其依赖库的bin/lib目录。
eProsima/fast-dds:latest),避免污染宿主机环境;vcpkg则能自动处理依赖链,减少手动编译的出错概率。在团队协作中,建议将环境配置脚本(如setup.sh或vcpkg.json)纳入版本控制,确保所有成员使用一致的构建环境。