Windows + VS2022 + UE5.2 编译 Fast DDS 2.14.0 完整记录

我来为你整理一份完整的编译记录,适合发布到 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/MT
  • MultiThreadedDLL/MD
  • MultiThreadedDebug/MTd
  • MultiThreadedDebugDLL/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

解决:

  1. 结束所有 java.exe 进程
  2. 删除 C:\Users\<用户>\.gradle\wrapper\dists\gradle-7.6-bin\
  3. 手动下载 gradle-7.6-bin.zip 放入目录
  4. 重新运行 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 是最常用配置。


相关推荐
顶点多余2 小时前
自定义协议、序列化、反序列化实现
java·linux·开发语言·c++·tcp/ip
Bruce_kaizy2 小时前
c++ linux环境编程——从应用层到linux内核深入了解文件io的调用机制(爆肝)
linux·c++·c·嵌入式linux·文件io
z200509302 小时前
C++中的右值引用
开发语言·c++
代码中介商2 小时前
C++文件流操作全解析
开发语言·c++
会周易的程序员3 小时前
aiDgeScanner架构与实现
c++·ide·物联网·架构·node.js·aiot
王老师青少年编程3 小时前
csp信奥赛C++高频考点专项训练之字符串 --【字符串排序】:生日
c++·字符串·csp·高频考点·信奥赛·生日·字符串排序
kyle~3 小时前
ROS2---消息过滤
开发语言·c++·机器人·ros2
雪度娃娃3 小时前
C++异步日志系统
开发语言·c++
kyle~3 小时前
ROS2---路径机制辨析
c++·机器人·ros2