整体模块结构:
Linux下cmake编译:
按照源码中的.md文档,屏蔽cpptoml模块编译可以正常生成。可以直接在各模块的CMakeLists.txt上建立build文件进行cmake..。每个模块从底向上依次编译,编译后su make install, make install后才能确保find_package()成功。
iceoryx_hoofs模块:
生成两个动态库
iceoryx_posh模块:
生成可执行文件:iox-roudi
四个动态库: libiceoryx_posh_gateway.so libiceoryx_posh.so libiceoryx_posh_config.so
libiceoryx_posh_roudi.so
iceoryx_binding_c模块:
生成动态库:libiceoryx_binding_c.so
icehello案例运行情况:
root环境下启动iox-roudi进程,随后依次启动server和client进行通讯。
交叉编译QNX:
使用源码脚本方式:
基本操作:
源码installation.md中有说明如何使用代码自带的交叉工具链的编译操作。
注意:
- 使用编译脚本之前需要先source qnxsdp-env.sh,设置qnx环境。
- ./tools/iceoryx_build_test.sh -t /home/user/toolchains/qnx/qnx_sdp70_aarch64le.cmake,在使用时需要用绝对路径指定.cmake工具。
遇到的问题:
cpptoml工具的下载编译。
工作环境的虚拟机是不连接外网的。Iceoyrx整个编译体系中,是采用Cmake ExternalProject_Add 命令直接从github下载cpptoml源码作为第三方库进行编译的。
所以在编译的配置阶段由于无法access到此仓库,编译会终止。
第一种:绕过cpptoml模块的下载编译,在iceoryx_build_test.sh脚本中设置flag变量为off。此方法经过试验,会编译出几个基础模块的库,但是不能生成iox-roudi这个daemon进程的bin文件。
第二种:将对应发行版本的cpptoml的源码下载到本地,修改cmake文件不从github下载,改用本地的.zip文件(相对路径,解压的或者其他压缩格式的没有试验)。
编译成功后可生成相关bin文件,头文件,库文件和配置文件。生成的这些文件可以放到对应的qnx代码仓库环境中做为依赖模块进行使用。
动态库和头文件的使用:
需要注意的是,iceoryx的源码包括一些例程采用了c++14的新特性,需要在common.mk中添加c++14标准。
最开始我使用CXXFLAGS += -D_LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL -std=c++14,但是却出现某些posix的接口不能使用的情况,后来咨询qnx改用了-std=gnu++14的方式,解决了此类问题。
重写.mk适配项目编译架构:(待更新)
基本思路:梳理iceoryx模块下各模块的CMakeLists.txt,在qnx环境下编写mk文件指定模块所需的源文件,输出对应的目标文件。最底层的iceoryx_hoofs模块开始生成一个libiceoryx_hoofs.so。随后编译iceoryx_posh模块的各个目标文件时,有上下游模块的依赖关系。