3. Fast DDS环境搭建
Fast DDS(原名Fast RTPS)作为OMG DDS标准的高性能C++实现,其环境搭建质量直接决定后续开发调试效率。本章围绕源码编译、依赖管理、跨平台配置与安装验证四个核心环节展开,帮助读者建立一套可复现、可诊断的构建环境。我们将以Ubuntu 22.04 LTS与Windows 11 64位为双主线,覆盖从工具链准备到运行示例的完整闭环。
3.1 核心原理:Fast DDS构建系统的依赖层次
Fast DDS并非一个孤立的库,其构建依赖分为三个层次:基础工具链(CMake、编译器)、第三方库(Foonathan Memory、TinyXML2、ASIO)、可选扩展(如Fast CDR、Security插件)。理解依赖层次有助于在编译失败时快速定位问题根源。
| 依赖组件 | 作用 | Linux包名 | Windows获取方式 |
|---|---|---|---|
| CMake ≥ 3.16 | 构建系统生成器 | cmake | 官方安装包或choco |
| GCC ≥ 7 / MSVC ≥ 2019 | C++14编译器 | build-essential | Visual Studio Build Tools |
| Foonathan Memory | 高效内存分配器 | 源码编译 | vcpkg或源码 |
| TinyXML2 | XML配置文件解析 | libtinyxml2-dev | vcpkg |
| ASIO (可选) | 网络异步I/O | libasio-dev | vcpkg |
| OpenSSL (可选) | DDS Security支持 | libssl-dev | vcpkg |
在Linux下,推荐使用apt安装大部分依赖,而Foonathan Memory需要从源码编译,因为它对编译选项有特定要求(如C++14标准)。Windows下,vcpkg是最高效的依赖管理工具,但需要注意其默认的triplet(如x64-windows)与Fast DDS的Release配置匹配。
3.2 判断方法与操作流程:Linux源码编译全流程
在开始编译前,先检查系统是否满足最低要求:cmake --version、gcc --version、python3 --version。若CMake版本低于3.16,需通过pip3 install cmake --upgrade或源码安装升级。
# 1. 安装基础依赖
sudo apt update
sudo apt install -y cmake g++ libasio-dev libtinyxml2-dev \
python3-pip python3-vcstool python3-colcon-common-extensions
# 2. 编译Foonathan Memory(Fast DDS的强制依赖)
git clone https://github.com/eProsima/foonathan_memory_vendor.git
cd foonathan_memory_vendor
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
sudo cmake --build . --target install
# 3. 获取Fast DDS源码
cd ~
mkdir -p Fast-DDS && cd Fast-DDS
git clone https://github.com/eProsima/Fast-DDS.git
cd Fast-DDS
# 4. 使用colcon构建(推荐,自动处理依赖顺序)
mkdir -p build install log
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=./install
# 5. 设置环境变量
echo "source ~/Fast-DDS/install/setup.bash" >> ~/.bashrc
source ~/.bashrc
若使用纯CMake构建,则执行:
cmake -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local
cmake --build build --target install -j$(nproc)
构建过程中常见的错误包括:fatal error: asio.hpp: No such file or directory(缺少ASIO)、Could NOT find TinyXML2(未安装解析库)。此时应返回依赖安装步骤逐一排查。
3.3 跨平台配置:Windows 11下的vcpkg与CMake集成
Windows环境推荐使用vcpkg作为依赖管理器,它能够自动处理库的二进制兼容性问题。首先安装vcpkg并集成到Visual Studio:
# 在PowerShell中执行
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
.\bootstrap-vcpkg.bat
.\vcpkg integrate install
# 安装Fast DDS及其依赖(x64架构)
.\vcpkg install fastdds --triplet x64-windows
安装完成后,在CMake项目中通过工具链文件引用vcpkg:
cmake -B build -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake \
-DVCPKG_TARGET_TRIPLET=x64-windows -DCMAKE_BUILD_TYPE=Release
需要注意,Windows下Fast DDS默认使用eprosima::fastdds命名空间,且Debug与Release版本的库文件不兼容,必须保持编译类型一致。若使用Visual Studio直接打开CMake工程,需在CMakeSettings.json中指定CMAKE_TOOLCHAIN_FILE。
3.4 案例拆解:HelloWorld示例验证安装
安装完成后,通过官方示例验证环境是否可用。以Linux为例,进入Fast DDS源码目录下的examples/C++/HelloWorldExample:
cd ~/Fast-DDS/Fast-DDS/examples/C++/HelloWorldExample
mkdir build && cd build
cmake .. -DCMAKE_PREFIX_PATH=~/Fast-DDS/install
make -j4
启动两个终端,分别运行发布者和订阅者:
# 终端1
./HelloWorldExample publisher
# 终端2
./HelloWorldExample subscriber
预期输出:订阅者终端显示Received: HelloWorld with index: 0,且索引递增至9。若出现Failed to create DomainParticipant,通常是因为共享库路径未设置,执行export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/Fast-DDS/install/lib即可。
fastdds.dll、foonathan_memory.dll等动态库,或将install/bin加入PATH环境变量。若使用静态库构建,则无需此步骤。3.5 常见误区与总结复盘
误区一:忽略编译类型一致性。Fast DDS的Debug与Release库混用会导致链接错误或运行时崩溃。解决方案:统一使用Release构建,并在CMake中显式指定CMAKE_BUILD_TYPE=Release。
误区二:依赖版本过旧。Ubuntu 20.04自带的CMake 3.16勉强满足要求,但TinyXML2版本可能过旧。建议使用apt install libtinyxml2-dev后检查版本,若低于8.0则从源码编译。
误区三:Windows下路径包含中文或空格。Fast DDS的CMake脚本对路径中的特殊字符处理不完善,建议将源码和构建目录放在纯英文路径下,如C:\FastDDS。
误区四:忘记设置环境变量。Linux下未source setup.bash,Windows下未添加DLL路径,都会导致运行时找不到库。建议将环境变量配置写入.bashrc或系统环境变量。
undefined reference to `eprosima::fastdds::...',请检查是否链接了正确的库文件(libfastdds.so或fastdds.lib),并确认链接顺序——Fast DDS库应放在依赖库之前。