QNX Fast-DDS交叉编译

QNX Fast-DDS交叉编译

Clone所需要的仓库

编译fastdds一共需要2个仓库(其实还依赖了Fast-CDR, tinyxml2…等其他仓库,但它们是作为Fast-DDS的submodule,不需要手动clone),下面列出了clone地址(注意是clone地址,不是web地址)

Fast-DDS : https://github.com/eProsima/Fast-DDS.git

foonathan_memory_vendor: https://github.com/eProsima/foonathan_memory_vendor.git

根据需要选择fastdds的版本,这里我们以2.6.0, 编译目标平台是qnx710的fastdds

Clone Fast-DDS

首先clone Fast-DDS,checkout到tag v2.6.0,并且更新所有submodule

git clone https://github.com/eProsima/Fast-DDS.git 
cd Fast-DDS
git checkout v2.6.0
git submodule sync --recursive
git submodule update --init --recursive

Clone foonathan_memory_vendor

首先查看Fast-DDS目录内fastrtps.repos文件,查看v2.6.0的Fast-DDS对应foonathan_memory_vendor的版本。可知版本是 v1.2.1(tag)

cat fastrtps.repos 
repositories:
    foonathan_memory_vendor:
        type: git
        url: https://github.com/eProsima/foonathan_memory_vendor.git
        version: v1.2.1
    fastcdr:
        type: git
        url: https://github.com/eProsima/Fast-CDR.git
        version: v1.0.24
    fastrtps:
        type: git
        url: https://github.com/eProsima/Fast-DDS.git
        version: v2.6.0
    fastddsgen:
        type: git
        url: https://github.com/eProsima/Fast-DDS-Gen.git
        version: v2.1.2
    fastddsgen/thirdparty/idl-parser:
        type: git
        url: https://github.com/eProsima/IDL-Parser.git
        version: v1.2.0

clone foonathan_memory_vendor仓库并checkout到v1.2.1

git clone https://github.com/eProsima/foonathan_memory_vendor.git
cd foonathan_memory_vendor
git checkout v1.2.1

QNX cmake编译依赖

根据你qnx编译器安装路径修改QNX_PATH变量,修改后把以下文本保存成qnx710_cross_compile.cmake备用

set(CMAKE_SYSTEM_NAME QNX)
set(QNX_PATH /home/$ENV{USER}/qnx710_safety CACHE STRING "QNX path")
set(CMAKE_FIND_ROOT_PATH  ${QNX_PATH}/target/qnx7/aarch64le/usr ${QNX_PATH}/target/qnx7/aarch64le/usr)
set(CMAKE_CXX_COMPILER ${QNX_PATH}/host/linux/x86_64/usr/bin/q++)
set(CMAKE_C_COMPILER  ${QNX_PATH}/host/linux/x86_64/usr/bin/qcc)
set(CMAKE_C_FLAGS "-Vgcc_ntoaarch64le")
set(CMAKE_CXX_FLAGS "-Vgcc_ntoaarch64le")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_QNX_SOURCE")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_QNX_SOURCE")

编译顺序

仓库之间是有依赖的,所以要按 foonathan_memory_vendor, Fast-CDR, tinyxml2, Fast-DDS的顺序编译

编译foonathan_memory_vendor

执行以下命令进行编译。注意,所有仓库的安装目录需要一致,这里使用/home/dev/dds_install

cd foonathan_memory_vendor
mkdir build
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=/home/dev/qnx710_cross_compile.cmake -DCMAKE_INSTALL_PREFIX=/home/dev/dds_install  #假设qnx cmake文件放在了/home/dev目录,如果不是请自行替换
make
make install

这时候发现编译报错了

make
[ 12%] Performing configure step for 'foo_mem-ext'
container_node_sizes_impl.hpp
CMake Error at src/CMakeLists.txt:99 (message):
  

  Error: Cannot find pre-generated file container_node_sizes_impl.hpp

  Please pre-generate the header file container_node_sizes_impl.hpp by
  following the steps below:

  - Build nodesize_dbg from source:

  
  	/home/dev/dds/foonathan_memory_vendor/build/foo_mem-ext-prefix/src/foo_mem-ext/tool/node_size_debugger.cpp


  - Transfer nodesize_dbg to QNX target and execute:

  	nodesize_dbg --code container_node_sizes_impl.hpp

  - Transfer generated header file back to your development system

  - Set FOONATHAN_MEMORY_CONTAINER_NODE_SIZES_IMPL to the path of the
  pre-generated file and pass it to cmake as an argument



-- Configuring incomplete, errors occurred!

提示大概是说,需要用源码/home/dev/dds/foonathan_memory_vendor/build/foo_mem-ext-prefix/src/foo_mem-ext/tool/node_size_debugger.cpp编译成nodesize_dbg,然后上传到目标设备执行命令nodesize_dbg --code container_node_sizes_impl.hpp,把生成的container_node_sizes_impl.hpp头文件回传编译主机,再进行编译

使用以下命令进行nodesize_dbg编译

qcc -Vgcc_ntoaarch64le /home/dev/dds/foonathan_memory_vendor/build/foo_mem-ext-prefix/src/foo_mem-ext/tool/node_size_debugger.cpp -o nodesize_dbg

如果提示error: ‘VERSION’ was not declared in this scope报错,直接修改源码把版本打印这行删掉,不影响。

编译成功后,上传nodesize_dbg到目标机器任意目录,执行以下命令生成container_node_sizes_impl.hpp

nodesize_dbg --code container_node_sizes_impl.hpp

生成container_node_sizes_impl.hpp后,把头文件回传到任意目录,假设是/home/dev/dds/foonathan_memory_vendor/container_node_sizes_impl.hpp

修改foonathan_memory_vendor目录下的CMakeLists.txt文件,在第86行(编译foo_mem-ext的命令)后添加该头文件的路径变量"-DFOONATHAN_MEMORY_CONTAINER_NODE_SIZES_IMPL=/home/dev/dds/foonathan_memory_vendor/container_node_sizes_impl.hpp"

......
  externalproject_add(foo_mem-ext
  GIT_REPOSITORY git@git.dev.com:mirror/memory.git
  GIT_TAG v0.7-1
  TIMEOUT 600
  # Avoid the update (git pull) and so the recompilation of foonathan_memory library each time.
  UPDATE_COMMAND ""
  CMAKE_ARGS
    -DFOONATHAN_MEMORY_BUILD_EXAMPLES=${BUILD_MEMORY_EXAMPLES}
    -DFOONATHAN_MEMORY_BUILD_TESTS=${BUILD_MEMORY_TESTS}
    -DFOONATHAN_MEMORY_BUILD_TOOLS=${BUILD_MEMORY_TOOLS}
    -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/foo_mem_ext_prj_install
    -DFOONATHAN_MEMORY_CONTAINER_NODE_SIZES_IMPL=/home/dev/dds/foonathan_memory_vendor/container_node_sizes_impl.hpp
    ${extra_cmake_args}
    -Wno-dev
    ${PATCH_COMMAND_STR}
  )
  ......

然后在build目录再次执行make可以编译通过,编译完成后执行make install把库安装到指定目录

编译Fast-CDR

Fast-CDR作为Fast-DDS的submodule在第一步的时候已经同步下来了,如果没有,请回头。

cd Fast-DDS/thirdparty/fastcdr
mkdir build
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=/home/dev/qnx710_cross_compile.cmake -DCMAKE_INSTALL_PREFIX=/home/dev/dds_install
make
make install

编译tinyxml2

tinyxml2作为Fast-DDS的submodule在第一步的时候已经同步下来了,如果没有,请回头。

cd Fast-DDS/thirdparty/tinyxml2
mkdir build
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=/home/dev/qnx710_cross_compile.cmake -DCMAKE_INSTALL_PREFIX=/home/dev/dds_install
make
make install

编译Fast-DDS

cd Fast-DDS
mkdir build
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=/home/dev/qnx710_safety_cross_compile.cmake -DCMAKE_INSTALL_PREFIX=/home/dev/dds_install -DTHIRDPARTY_Asio=ON -DTHIRDPARTY_TinyXML2=ON -DAsio_INCLUDE_DIR=../thirdparty/asio/asio/include/
make
make install

链接时会有报错

[100%] Building CXX object tools/fds/CMakeFiles/fast-discovery-server.dir/server.cpp.o
[100%] Linking CXX executable fast-discovery-server-1.0.0
/home/dev/qnx710_safety/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.1.0-ld: ../../src/cpp/libfastrtps.so.2.6.0: undefined reference to `connect'
/home/dev/qnx710_safety/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.1.0-ld: ../../src/cpp/libfastrtps.so.2.6.0: undefined reference to `freeaddrinfo'
/home/dev/qnx710_safety/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.1.0-ld: ../../src/cpp/libfastrtps.so.2.6.0: undefined reference to `freeifaddrs'
/home/dev/qnx710_safety/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.1.0-ld: ../../src/cpp/libfastrtps.so.2.6.0: undefined reference to `getnameinfo'
/home/dev/qnx710_safety/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.1.0-ld: ../../src/cpp/libfastrtps.so.2.6.0: undefined reference to `getpeername'
/home/dev/qnx710_safety/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.1.0-ld: ../../src/cpp/libfastrtps.so.2.6.0: undefined reference to `shutdown'
/home/dev/qnx710_safety/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.1.0-ld: ../../src/cpp/libfastrtps.so.2.6.0: undefined reference to `send'
/home/dev/qnx710_safety/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.1.0-ld: ../../src/cpp/libfastrtps.so.2.6.0: undefined reference to `getifaddrs'
/home/dev/qnx710_safety/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.1.0-ld: ../../src/cpp/libfastrtps.so.2.6.0: undefined reference to `getsockopt'
/home/dev/qnx710_safety/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.1.0-ld: ../../src/cpp/libfastrtps.so.2.6.0: undefined reference to `recv'
/home/dev/qnx710_safety/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.1.0-ld: ../../src/cpp/libfastrtps.so.2.6.0: undefined reference to `listen'
/home/dev/qnx710_safety/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.1.0-ld: ../../src/cpp/libfastrtps.so.2.6.0: undefined reference to `sendmsg'
/home/dev/qnx710_safety/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.1.0-ld: ../../src/cpp/libfastrtps.so.2.6.0: undefined reference to `inet_ntop'
/home/dev/qnx710_safety/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.1.0-ld: ../../src/cpp/libfastrtps.so.2.6.0: undefined reference to `getsockname'
/home/dev/qnx710_safety/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.1.0-ld: ../../src/cpp/libfastrtps.so.2.6.0: undefined reference to `if_indextoname'
/home/dev/qnx710_safety/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.1.0-ld: ../../src/cpp/libfastrtps.so.2.6.0: undefined reference to `gai_strerror'
/home/dev/qnx710_safety/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.1.0-ld: ../../src/cpp/libfastrtps.so.2.6.0: undefined reference to `sendto'
/home/dev/qnx710_safety/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.1.0-ld: ../../src/cpp/libfastrtps.so.2.6.0: undefined reference to `bind'
/home/dev/qnx710_safety/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.1.0-ld: ../../src/cpp/libfastrtps.so.2.6.0: undefined reference to `setsockopt'
/home/dev/qnx710_safety/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.1.0-ld: ../../src/cpp/libfastrtps.so.2.6.0: undefined reference to `socket'
/home/dev/qnx710_safety/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.1.0-ld: ../../src/cpp/libfastrtps.so.2.6.0: undefined reference to `inet_pton'
/home/dev/qnx710_safety/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.1.0-ld: ../../src/cpp/libfastrtps.so.2.6.0: undefined reference to `recvfrom'
/home/dev/qnx710_safety/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.1.0-ld: ../../src/cpp/libfastrtps.so.2.6.0: undefined reference to `getaddrinfo'
/home/dev/qnx710_safety/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.1.0-ld: ../../src/cpp/libfastrtps.so.2.6.0: undefined reference to `if_nametoindex'
/home/dev/qnx710_safety/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx7.1.0-ld: ../../src/cpp/libfastrtps.so.2.6.0: undefined reference to `accept'
tools/fds/CMakeFiles/fast-discovery-server.dir/build.make:99: recipe for target 'tools/fds/fast-discovery-server-1.0.0' failed
make[2]: *** [tools/fds/fast-discovery-server-1.0.0] Error 1
CMakeFiles/Makefile2:966: recipe for target 'tools/fds/CMakeFiles/fast-discovery-server.dir/all' failed
make[1]: *** [tools/fds/CMakeFiles/fast-discovery-server.dir/all] Error 2
Makefile:145: recipe for target 'all' failed
make: *** [all] Error 2

该问题是Linux与qnx的socket链接库不一样导致的

编辑Fast-DDS/tools/fds/CMakeLists.txt,找到第76行target_link_libraries(${PROJECT_NAME} fastrtps fastcdr fastdds::optionparser),把socket链接上

target_link_libraries(${PROJECT_NAME} fastrtps fastcdr fastdds::optionparser socket)

再次make; make install

完成

到安装目录/home/dev/dds_install查看编译好的库

cd /home/dev/dds_install
tree -l -L 2
.
├── bin
│   ├── fastdds
│   ├── fast-discovery-server -> fast-discovery-server-1.0.0
│   ├── fast-discovery-server-1.0.0
│   ├── nodesize_dbg
│   └── ros-discovery
├── include
│   ├── fastcdr
│   ├── fastdds
│   ├── fastrtps
│   ├── foonathan_memory
│   └── tinyxml2.h
├── lib
│   ├── cmake
│   ├── foonathan_memory
│   ├── libfastcdr.so -> libfastcdr.so.1
│   ├── libfastcdr.so.1 -> libfastcdr.so.1.0.24
│   ├── libfastcdr.so.1.0.24
│   ├── libfastrtps.so -> libfastrtps.so.2.6
│   ├── libfastrtps.so.2.6 -> libfastrtps.so.2.6.0
│   ├── libfastrtps.so.2.6.0
│   ├── libfoonathan_memory-0.7.1.a
│   ├── libtinyxml2.so -> libtinyxml2.so.6
│   ├── libtinyxml2.so.6 -> libtinyxml2.so.6.0.0
│   ├── libtinyxml2.so.6.0.0
│   └── pkgconfig
├── share
│   ├── fastcdr
│   ├── fastrtps
│   ├── foonathan_memory
│   └── foonathan_memory_vendor
└── tools
    └── fastdds

17 directories, 16 files

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 在进行QNX(一种实时操作系统)和Windows之间的交叉编译时,我们需要使用特定的编译工具和开发环境来确保代码可以在目标平台上正确编译和运行。 QNX提供了针对Windows平台的交叉编译工具链,例如QNX Momentics IDE。这个IDE集成了编译器、调试器和其他开发工具,使得在Windows下进行QNX交叉编译变得更加方便。 首先,我们需要安装QNX Momentics IDE。安装完成后,我们可以创建一个新的QNX项目,并配置好编译器和目标平台信息。QNX Momentics IDE提供了丰富的工具和选项,可以根据项目需求来配置编译参数、链接库和环境变量等。我们可以在Windows上编写代码,并在QNX Momentics IDE中进行编译和调试。 在进行交叉编译时,我们需要考虑一个重要的问题是目标平台的架构差异。QNX通常运行在ARM、x86等不同的处理器架构上,而Windows通常运行在x86或x86_64架构上。因此,在编译时我们需要确保代码能够正确地针对目标平台进行优化和生成可执行文件。 为了确保交叉编译顺利进行,我们需要在QNX和Windows之间进行必要的设置和协调。这包括正确安装和配置交叉编译工具链、设置环境变量、导入所需的头文件和库文件等。这些设置将确保编译器能够正确地在Windows上编译生成适用于QNX的目标代码。 总而言之,QNX和Windows的交叉编译需要使用特定的工具链和开发环境,如QNX Momentics IDE,以确保代码可以正确地在目标平台上编译和运行。通过正确配置和协调两个平台之间的设置,我们可以轻松地进行QNX和Windows之间的交叉编译。 ### 回答2: QNX是一个嵌入式实时操作系统,而Windows是一个通用桌面操作系统。交叉编译是将软件在一种操作系统上编译生成在另一种操作系统上执行的二进制文件的过程。 在QNX上进行Windows的交叉编译是可能的,这可以在开发嵌入式系统时非常有用。通过交叉编译,开发者可以在QNX上为Windows平台编写和测试代码,然后将其移植到Windows操作系统上运行。 在进行QNX和Windows的交叉编译时,首先需要安装适当的工具链和交叉编译器。这些工具可用于将QNX系统上的源代码编译为Windows平台上可执行的二进制文件。这些工具通常包括编译器、链接器、调试器和其他构建工具。 在配置交叉编译环境后,可以使用适当的命令和标志来执行交叉编译。开发者需要指定源代码的位置、目标平台的架构和操作系统等信息。一旦编译过程完成,就可以在Windows平台上运行生成的可执行文件。 需要注意的是,尽管交叉编译可以方便地在QNX上进行Windows开发,但在执行过程中可能会遇到一些平台差异和兼容性问题。因此,在进行交叉编译之前,开发者应该仔细检查和调试代码,确保其在目标平台上的兼容性。 总结而言,QNX和Windows交叉编译允许在嵌入式系统开发过程中在QNX上编写和测试代码,然后将其移植到Windows上运行。这样的开发环境可以提高开发效率并简化软件移植过程。 ### 回答3: QNX与Windows的交叉编译是指在Windows操作系统上使用QNX开发工具链来编译运行QNX操作系统或应用程序。 在进行QNX与Windows的交叉编译之前,我们需要安装QNX SDK和相关的交叉编译工具。然后,通过配置环境变量、设置路径等步骤,将QNX开发环境与Windows操作系统进行连接。 一旦环境搭建完成,我们就可以开始进行QNX项目的交叉编译了。首先,我们需要编写QNX的源代码,并将其保存在Windows操作系统上。接下来,我们可以使用QNX开发工具链中的编译器,如QCC (QNX C Compiler)来将源代码编译成二进制文件。可以使用命令行或者集成开发环境 (IDE) 来进行编译和构建。 在进行编译时,我们需要注意一些QNX特有的编译选项和参数,以及可能需要调整的库和依赖项路径。这些都可以在编译文档或相关的QNX开发资源中找到。 一旦编译成功,就可以在Windows操作系统上生成QNX可执行文件。但是要注意,由于QNX是一个实时操作系统,所以在不同平台上可能存在一些不兼容的问题。因此,在将程序部署到实际的QNX平台之前,我们需要进行一些测试和调试,以确保程序在QNX上能够正常运行。 总而言之,QNX与Windows的交叉编译是通过在Windows操作系统上使用QNX开发工具链来编译运行QNX操作系统或应用程序。这需要进行环境搭建、编写源代码、使用QNX编译器进行编译、解决兼容性问题等一系列步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值