我来为你整理一份完整的编译记录,适合发布到 CSDN。
Windows + VS2022 + UE5.2 编译 Fast DDS 2.14.0 完整记录
一、环境信息
| 项目 | 版本/路径 |
|---|---|
| 操作系统 | Windows 11 |
| IDE | Visual Studio 2022 Community (v17.14) |
| CMake | 3.28 |
| Java | OpenJDK 17 (Temurin) |
| 7-Zip | 任意版本,需加入 PATH |
| 目标引擎 | Unreal Engine 5.2.1 |
二、目录结构规划
E:\03_UE_Project\FastDDS\
├── source\ # 源码压缩包
│ ├── boost_1_82_0.zip
│ ├── asio-asio-1-24-0.zip
│ ├── Fast-CDR-1.1.0.zip
│ ├── Fast-DDS-2.14.0.zip
│ ├── tinyxml2-9.0.0.zip
│ ├── memory-0.7-2.zip
│ └── Fast-DDS-Gen-3.3.2.zip # 代码生成工具
├── build\ # 编译中间文件
│ ├── boost_1_82_0\
│ ├── asio\
│ ├── tinyxml2\
│ ├── memory-0.7-2\
│ ├── Fast-CDR\
│ ├── Fast-DDS\
│ └── Fast-DDS-Gen\ # Gen 源码编译目录
├── install\ # 最终安装目录
│ ├── Release_Static\ # /MT 静态库(Shipping用)
│ ├── Debug_Static\ # /MTd 静态库
│ ├── Release_Shared\ # /MD 动态库(Editor用)⭐
│ └── Debug_Shared\ # /MDd 动态库
└── patches\ # CMake 补丁
└── get_container_node_sizes.cmake
三、源码下载地址
| 依赖 | 下载链接 |
|---|---|
| Boost 1.82.0 | https://www.boost.org/users/history/version_1_82_0.html |
| Asio 1.24.0 | https://think-async.com/Asio/Download.html |
| Fast-CDR 1.1.0 | https://github.com/eProsima/Fast-CDR/releases/tag/v1.1.0 |
| Fast-DDS 2.14.0 | https://github.com/eProsima/Fast-DDS/releases/tag/v2.14.0 |
| TinyXML2 9.0.0 | https://github.com/leethomason/tinyxml2/releases/tag/9.0.0 |
| foonathan_memory 0.7-2 | https://github.com/foonathan/memory/releases/tag/v0.7-2 |
| Fast-DDS-Gen 3.3.2 | https://github.com/eProsima/Fast-DDS-Gen/releases/tag/v3.3.2 |
四、关键坑点与解决
坑点 1:foonathan_memory 编译失败(VS2022 中文输出解析错误)
现象:
CMake Error: Unable to determine alignment of C++ type char
原因: foonathan_memory 的 CMake 脚本通过正则匹配 cl.exe 编译错误输出提取对齐值,但 中文 MSVC 输出导致正则匹配失败。
解决: 打补丁替换 cmake/get_container_node_sizes.cmake,或设置环境变量:
bat
set VSLANG=1033
坑点 2:Fast-DDS 自带残缺 foonathan 头文件覆盖安装版
现象: 编译 Fast-DDS 时找不到 config_impl.hpp
原因: Fast-DDS 2.14.0 源码自带 include/foonathan/memory/ 目录,但缺少编译生成的 config_impl.hpp,且 CMake -I 顺序让源码目录优先于安装目录。
解决: 编译前删除 Fast-DDS 自带的残缺头文件:
bat
rmdir /S /Q "%DDSSRC%\include\foonathan"
坑点 3:CMake MSVC_RUNTIME_LIBRARY 非法值
现象:
MSVC_RUNTIME_LIBRARY value 'MultiThreadedShared' not known
原因: 脚本用字符串拼接 MultiThreaded + Shared = MultiThreadedShared,但 CMake 只认四个固定值。
解决: 正确定义变量:
MultiThreaded→/MTMultiThreadedDLL→/MDMultiThreadedDebug→/MTdMultiThreadedDebugDLL→/MDd
坑点 4:Fast-DDS-Gen 编译需 Java 17
现象:
class file version 55.0, this version only recognizes up to 52.0
原因: Gradle 默认找到系统 Java 8,但 ANTLR 4 需要 Java 11+。
解决: 强制设置 JAVA_HOME 为 Java 17 路径,注意实际目录名是 jdk-17.0.19.10-hotspot 而非带 + 号的版本字符串。
坑点 5:Gradle wrapper 下载超时/文件锁
现象: Timeout waiting for exclusive access to file
解决:
- 结束所有
java.exe进程 - 删除
C:\Users\<用户>\.gradle\wrapper\dists\gradle-7.6-bin\ - 手动下载
gradle-7.6-bin.zip放入目录 - 重新运行
gradlew.bat
五、完整编译脚本
5.1 一键编译脚本 build_all.bat
bat
@echo off
setlocal EnableDelayedExpansion
:: 设置英文 MSVC 输出,避免 foonathan_memory 正则匹配失败
set "VSLANG=1033"
:: 用法: build_all.bat [Release|Debug] [Static|Shared]
set "CONFIG=%~1"
if "%CONFIG%"=="" set "CONFIG=Release"
set "LINKAGE=%~2"
if "%LINKAGE%"=="" set "LINKAGE=Shared"
:: 路径设置
set "ROOTDIR=E:\03_UE_Project\FastDDS"
set "SOURCEDIR=%ROOTDIR%\source"
set "BUILDDIR=%ROOTDIR%\build\%CONFIG%_%LINKAGE%"
set "INSTALLDIR=%ROOTDIR%\install\%CONFIG%_%LINKAGE%"
:: CRT 配置
if /I "%LINKAGE%"=="Static" (
set "BUILD_SHARED=OFF"
set "BOOST_LINK=static"
set "BOOST_RUNTIME=static"
set "CMAKE_CRT=MultiThreaded"
set "CMAKE_CRT_DEBUG=MultiThreadedDebug"
) else (
set "BUILD_SHARED=ON"
set "BOOST_LINK=shared"
set "BOOST_RUNTIME=shared"
set "CMAKE_CRT=MultiThreadedDLL"
set "CMAKE_CRT_DEBUG=MultiThreadedDebugDLL"
)
:: 创建目录
if not exist "%BUILDDIR%" mkdir "%BUILDDIR%"
if not exist "%INSTALLDIR%" mkdir "%INSTALLDIR%"
:: ============================================
:: 1. Boost
:: ============================================
set "BOOSTSRC=%BUILDDIR%\boost_1_82_0"
if not exist "%BOOSTSRC%\bootstrap.bat" (
7z x "%SOURCEDIR%\boost_1_82_0.zip" -o"%BUILDDIR%" -y
)
cd /d "%BOOSTSRC%"
if not exist "b2.exe" call bootstrap.bat
b2.exe --toolset=msvc-14.3 address-model=64 variant=%CONFIG:~0,7% link=%BOOST_LINK% runtime-link=%BOOST_RUNTIME% threading=multi --with-system --with-thread --with-filesystem --with-regex --with-date_time --with-chrono --prefix="%INSTALLDIR%" install
:: ============================================
:: 2. Asio (header-only)
:: ============================================
set "ASIOROOT=%BUILDDIR%\asio"
7z x "%SOURCEDIR%\asio-asio-1-24-0.zip" -o"%BUILDDIR%" -y
:: 处理目录结构后拷贝头文件
:: ============================================
:: 3. TinyXML2
:: ============================================
:: cmake ... -DCMAKE_MSVC_RUNTIME_LIBRARY="%CMAKE_CRT%"
:: ============================================
:: 4. foonathan_memory(需打补丁)
:: ============================================
:: 应用 get_container_node_sizes.cmake 补丁后编译
:: ============================================
:: 5. Fast-CDR
:: ============================================
:: cmake ... -DCMAKE_MSVC_RUNTIME_LIBRARY="%CMAKE_CRT%"
:: ============================================
:: 6. Fast-DDS(核心)
:: ============================================
:: 删除自带残缺 foonathan 头文件
rmdir /S /Q "%DDSSRC%\include\foonathan" 2>nul
:: cmake ... -DCMAKE_MSVC_RUNTIME_LIBRARY="%CMAKE_CRT%"
echo Build Complete!
5.2 Fast-DDS-Gen 编译
bat
:: 克隆源码
git clone --recursive https://github.com/eProsima/Fast-DDS-Gen.git
cd Fast-DDS-Gen
git checkout v3.3.2
:: 设置 Java 17(必须是 17+)
set JAVA_HOME=C:\Program Files\Eclipse Adoptium\jdk-17.0.19.10-hotspot
set PATH=%JAVA_HOME%\bin;%PATH%
:: 编译
gradlew.bat assemble -x test
:: 生成的 jar 位置
:: share\fastddsgen\java\fastddsgen.jar
六、UE5.2 集成配置
6.1 Build.cs(Release Shared /MD 版本)
csharp
using System.IO;
using UnrealBuildTool;
public class FastDDS : ModuleRules
{
public FastDDS(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
string FastDDSInstall = "E:/03_UE_Project/FastDDS/install/Release_Shared";
// 头文件
PublicIncludePaths.Add(Path.Combine(FastDDSInstall, "include"));
// 导入库 .lib
PublicAdditionalLibraries.AddRange(new string[] {
Path.Combine(FastDDSInstall, "lib", "fastrtps-2.14.lib"),
Path.Combine(FastDDSInstall, "lib", "fastcdr.lib"),
Path.Combine(FastDDSInstall, "lib", "foonathan_memory-0.7.2.lib"),
Path.Combine(FastDDSInstall, "lib", "tinyxml2.lib"),
// Boost /MD 版本(无 -s- 后缀)
Path.Combine(FastDDSInstall, "lib", "boost_system-vc143-mt-x64-1_82.lib"),
Path.Combine(FastDDSInstall, "lib", "boost_thread-vc143-mt-x64-1_82.lib"),
Path.Combine(FastDDSInstall, "lib", "boost_filesystem-vc143-mt-x64-1_82.lib"),
Path.Combine(FastDDSInstall, "lib", "boost_regex-vc143-mt-x64-1_82.lib"),
Path.Combine(FastDDSInstall, "lib", "boost_chrono-vc143-mt-x64-1_82.lib"),
Path.Combine(FastDDSInstall, "lib", "boost_date_time-vc143-mt-x64-1_82.lib"),
Path.Combine(FastDDSInstall, "lib", "boost_atomic-vc143-mt-x64-1_82.lib"),
"ws2_32.lib",
"iphlpapi.lib",
});
// DLL 运行时依赖
if (Target.Platform == UnrealTargetPlatform.Win64)
{
RuntimeDependencies.Add(Path.Combine(FastDDSInstall, "bin", "fastrtps-2.14.dll"));
RuntimeDependencies.Add(Path.Combine(FastDDSInstall, "bin", "fastcdr.dll"));
}
PublicDefinitions.AddRange(new string[] {
"BOOST_ALL_NO_LIB",
"ASIO_STANDALONE",
"FASTDDS_DYN_LINK",
});
bEnableExceptions = true;
}
}
6.2 IDL 代码生成批处理
bat
:: gen.bat
@echo off
set "GEN_JAR=%~dp0Fast-DDS-Gen-3.3.2\fastddsgen.jar"
java -jar "%GEN_JAR%" -replace -d "%~dp0Generated" "%~1"
七、版本匹配关系
| Fast DDS 库 | Fast DDS-Gen | 兼容性 |
|---|---|---|
| 2.14.0 | 3.3.2 | ✅ 官方推荐 |
| 2.14.x | 3.3.x | ✅ 兼容 |
| 2.14.0 | 2.x | ❌ 不兼容 |
| 3.x | 3.3.x | ⚠️ 需确认 |
八、编译产物确认
编译完成后 install\Release_Shared\ 目录结构:
Release_Shared\
├── include\
│ ├── fastdds\ # Fast DDS 头文件
│ ├── fastcdr\ # Fast CDR 头文件
│ └── boost\ # Boost 头文件
├── lib\ # 导入库 .lib
│ ├── fastrtps-2.14.lib
│ ├── fastcdr.lib
│ ├── foonathan_memory-0.7.2.lib
│ ├── tinyxml2.lib
│ └── boost_*.lib
└── bin\ # 运行时 DLL
├── fastrtps-2.14.dll
└── fastcdr.dll
九、总结
| 配置 | 适用场景 | CRT | 文件 |
|---|---|---|---|
| Release Static | Shipping 发布 | /MT | .lib 单文件 |
| Debug Static | 调试静态版 | /MTd | .lib |
| Release Shared | Editor/Development ⭐ | /MD | .dll + .lib |
| Debug Shared | 调试动态版 | /MDd | .dll + .lib |
UE 5.2.1 Editor 默认使用 /MD,因此 Release Shared 是最常用配置。