FastDDS交叉编译记录

主要流程参考:fastdds交叉编译_fastdds 交叉编译-CSDN博客

CmakeList中的BUILD_SHARED_LIBS 选项可配置是否生成动态库和静态库

option(BUILD_SHARED_LIBS "Create shared libraries by default" ON)

编译前,统一source编译链环境设置脚本,注意sudo前后环境变量会改变

#配置C++编译器
set(CMAKE_CXX_COMPILER /PATH/TO/GXX)
#配置C编译器
set(CMAKE_C_COMPILER /PATH/TO/GCC)
#配置系统目录
set(CMAKE_SYSROOT /PATH/TO/sysroot/arm)
#配置库文件头文件搜索路径
set(CMAKE_FIND_ROOT_PATH /PATH/TO/sysroot/arm)

 

1.fastcdr由于cmake版本太高,厂家交叉编译链无法cmake,采用ubuntu自身cmake编译

/usr/local/bin/cmake .. -DCMAKE_INSTALL_PREFIX=/PATH/TO/INSTALL

2.TinyXML2和asio按照主要流程正常编译 

3.Foonathan_memory_vendor下载源码后不是最终源码,还需要进行git下载,因此按错误提示下载Foonathan_memory源码(离线编译)

Foonathan_memory依赖doctest第三方库,先进行doctest离线编译,doctest为单头文件的库。

进行Foonathan_memory编译时仍要进行doctest下载,此时观察报错,

进入子目录test下的cmakelist,注释fetch,指定doctest的cmakeconfig文件路径doctest_DIR

保存后重新编译Foonathan_memory成功。

参考fetchcontent

cmake学习笔记(六)从GitHub引入第三方库 使用FetchContent_cmake fetchcontent-CSDN博客

参考findpackage

“轻松搞定CMake”系列之find_package用法详解_findpackage 环境变量-CSDN博客

【cmake学习】cmake 引入第三方库(头文件目录、库目录、库文件)_cmake添加第三方库-CSDN博客

# Fetch doctest.
set(doctest_DIR "/PATH/TO/DOCTEST/INTALL/lib/cmake/doctest")
find_package(doctest 2 REQUIRED)

#注释以下内容
#include(FetchContent)
#FetchContent_Declare(doctest URL #https://github.cim/doctest/doctest/archive/refs/tags/v2.4.9.zip)
#FetchContent_MakeAvailable(doctest)

4.编译FastDDS时,需要将前面步骤编译的四个库放到CMAKE_FIND_ROOT_PATH下,即交叉编译工具链下的/usr/bin, /usr/lib,  /usr/include, 由于FastDDS采用find_package查找相关第三方库,因此需要将四个库install中/lib/cmake放到编译链下的/usr/lib/cmake下,使得对应的.cmake能够正常配置相关库

5.进行平台交叉编译时出现

fastdds交叉编译到arm-linux-gnueabi平台时,在check_configureation.cmake中报错the specified c++ cxx_std_11 feature is not supported using default compiler

解决方案:

  1. 创建工具链文件

CMake 需要通过工具链文件(Toolchain File)来识别交叉编译器及其支持的特性。创建一个工具链文件(如 arm-toolchain.cmake),内容如下:

# 设置目标系统名称
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

# 指定交叉编译器
set(CMAKE_C_COMPILER arm-linux-gnueabi-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabi-g++)

# 设置目标平台的根文件系统(Sysroot)
set(CMAKE_SYSROOT /path/to/sysroot)

# 设置库和头文件搜索路径
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF

        2.使用工具链文件

在运行 CMake 时,通过 -DCMAKE_TOOLCHAIN_FILE 指定工具链文件:

cmake -DCMAKE_TOOLCHAIN_FILE=arm-toolchain.cmake ..

编译fastdds时出现:

fastdds交叉编译到arm平台,链接libtinyxml2.a报错relocation R_ARM_THM_MOVW_ABS_NC against 'a local symbol' can not be used when making a shared object; recompile with -fPIC

在进行交叉编译时,遇到 relocation R_ARM_THM_MOVW_ABS_NC against 'a local symbol' can not be used when making a shared object; recompile with -fPIC 这样的错误,通常是因为静态库 libtinyxml2.a 没有使用位置无关代码(Position Independent Code, PIC)进行编译。为了解决这个问题,需要重新编译 tinyxml2 库,并使用 -fPIC 选项

cmake .. \
    -DCMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ \
    -DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc \
    -DCMAKE_SYSTEM_NAME=Linux \
    -DCMAKE_SYSTEM_PROCESSOR=arm \
    -DCMAKE_POSITION_INDEPENDENT_CODE=ON

*****************************************************************************************

和MicroDDS-Gen工具类似,gradle可以拉取对应版本编译,但是编译链中存在git指令需要拉取代码,这里需要修改较多,因此不在ubuntu工作站中进行编译,在可以连接外网的ubuntu下对应执行install doc中的对应步骤即可,编译完成后转移到对应工作站。

*****************************************************************************************

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值