最平凡日子 最卑微梦想

Fast-DDS在Linux平台编译

本文记录Fast DDS在国产芯片及国产系统下的编译,具体情况每个环境有个别差异,酌情参考,另外本文直接在目标机器编译,不涉及交叉编译。

Fast DDS 是 eProsima 开发的一个高性能、实时的通信中间件,基于 Data Distribution Service (DDS) 标准。它是一种发布/订阅的架构,广泛用于需要高效率、低延迟通讯的系统中,如机器人、自动驾驶、工业自动化以及物联网。

环境如下:
芯片: Phytium,D2000/8 E8C
架构: aarch64
CPU 运行模式: 32-bit, 64-bit
OS版本: Linux kylin-pc 5.4.18-110-generic

涉及到的第三方库版本如下:asio-1.30.2、Fast-CDR-2.2.5、tinyxml2-v10.0.0、foonathan_memory_vendor-v1.3.1

以及Fast-DDS-2.10.5

第三方库准备

Fast_CDR

Fast_CDR是做idl序列化和反序列化的核心库,他不依赖任何库。

github下载源码,建议下载Fast-CDR-2.2.5的tag分支。

#源码路径
mkdir build
cmake ..  -DCMAKE_INSTALL_PREFIX=/data/DDSDEV/thirdparty/Fast_CDR 
make -j8
make install

TinyXML2

github下载源码,建议下载 tinyxml2-v10.0.0 的tag分支。

#源码路径
mkdir build
cmake .. -DCMAKE_CXX_FLAGS="-fPIC" -DCMAKE_C_FLAGS="-fPIC" -DCMAKE_INSTALL_PREFIX=/data/DDSDEV/thirdparty/Fast_CDR
make -j8
make install

这里需要注意的是,需要加上-DCMAKE_CXX_FLAGS="-fPIC" -DCMAKE_C_FLAGS="-fPIC",主要目的是为了编译生成使用 -fPIC 编译的静态库(libtinyxml2.a),如果未使用该标志位,则链接到生成共享对象(.so)的过程会产生错误。

在 Linux 系统上,用于创建共享库的所有对象文件通常需要使用 -fPIC(Position Independent Code)编译。

如果不用,则编译Fast-DDS时会报错:

/usr/bin/ld: /data/DDSDEV/thirdparty/tinyxml2/lib/libtinyxml2.a(tinyxml2.cpp.o): relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `__stack_chk_guard@@GLIBC_2.17' which may bind externally can not be used when making a shared object; recompile with -fPIC

/usr/bin/ld: /data/DDSDEV/thirdparty/tinyxml2/lib/libtinyxml2.a(tinyxml2.cpp.o)(.text+0x4a8): unresolvable R_AARCH64_ADR_PREL_PG_HI21 relocation against symbol `__stack_chk_guard@@GLIBC_2.17'

/usr/bin/ld: 最后的链结失败: bad value

collect2: error: ld returned 1 exit status

make[2]: *** [src/cpp/CMakeFiles/fastdds.dir/build.make:3656:src/cpp/libfastdds.so.3.1.0] 错误 1

make[1]: *** [CMakeFiles/Makefile2:1158:src/cpp/CMakeFiles/fastdds.dir/all] 错误 2

当然,也可以使用动态库:

-DTINYXML2_LIBRARY=/data/DDSDEV/thirdparty/tinyxml2/lib/libtinyxml2.so

Asio

Asio是一个跨平台的C++库,用于网络和底层I/O编程。Asio库不用编译,直接下载源码,建议下载 asio-1.30.2 的tag分支。

代码下载后解压到/data/DDSDEV/thirdparty下备用。

Foonathan_memory

github下载源码,建议下载 foonathan_memory_vendor-v1.3.1 tag分支。

#源码路径
mkdir build
#关闭所有主功能外的功能
cmake .. -DFOONATHAN_MEMORY_BUILD_EXAMPLES=OFF -DFOONATHAN_MEMORY_BUILD_TESTS=OFF -DFOONATHAN_MEMORY_BUILD_TOOLS=OFF -DCMAKE_INSTALL_PREFIX=/data/DDSDEV/thirdparty/Foonathan_memory
make -j8
make install

fastrtps(Fast-DDSs)编译安装

cmake -DTHIRDPARTY=ON -DCOMPILE_TOOLS=ON -DCMAKE_PREFIX_PATH=/data/DDSDEV/thirdparty/Fast_CDR -DCMAKE_MODULE_PATH=/data/DDSDEV/thirdparty/Fast_CDR/lib/cmake -DAsio_INCLUDE_DIR=/data/DDSDEV/thirdparty/asio-1.30.2/include -DTINYXML2_INCLUDE_DIR=/data/DDSDEV/thirdparty/tinyxml2/include -DTINYXML2_LIBRARY=/data/DDSDEV/thirdparty/tinyxml2/lib/libtinyxml2.a -DCMAKE_INSTALL_PREFIX=/data/DDSDEV/thirdparty/Fast-DDS ..

注意里面的大小写,尤其是Asio,不是ASIO。

编译完成后用自带的demo测试:

cd /data/DDSDEV/Fast-DDS-2.10.5/examples/cpp/hello_world
mkdir build && cd build
make -j8
./hello_world publisher

另起一终端:

./hello_world subscriber

即可看到收发关系。