前言
SOMEIP的原理相较于DDS来讲要简单些,但是SOMEIP的编译要比DDS编译难一点
首先梳理清楚一点,DDS的编译与SOMEIP的编译存在很大的不同,不能用编译DDS的那一套来编译SOMEIP
本篇主要整理SOMEIP源码和其HelloWorld demo分别在x86和arm架构上的编译,不管在什么平台上编译SOMEIP的编译需要依赖于C++的拓展库 Boost 。所以开始之前需要先分别编译安装x86_64和aarch64(ARM)下的Boost库文件。
Boost分别在X86和ARM下的编译安装(为SOMEIP编译做准备)
Boost库分别在X86和ARM上的安装可以参考下文,看过的都在赞喔
ubuntu上安装boost库为SOMEIP的X86和ARM下编译做准备(编译两种版本)
cmake进行编译选项设置(准备x86.cmake和arm.cmake文件用于指定两种架构下boost的安装位置)
假设x86架构的boost安装在/usr/local/boost/install/include、lib
而arm架构的boost则将安装的include、lib头文件和库文件跟一些arm架构库文件一并放在/install_ARM
下面
arm.cmake:(x86.cmake的格式相同,首先屏蔽交叉编译工具链,并且改成x86架构下的boost安装地址,指向其安装包中的头文件和库文件)
# 设置目标系统名称为Linux系统
SET(CMAKE_SYSTEM_NAME Linux)
# 设置目标系统的处理器架构为ARM架构
SET(CMAKE_SYSTEM_PROCESSOR x86_64)
# 将此处的安装位置改成自己的交叉编译工具链所解压放置的位置
# SET(TOOLCHAIN_DIR "/usr/local/arm/aarch64--glibc--stable-2022.03-1")
# 分别指定arm-gcc和arm-g++交叉编译器的位置
#也是编译器为ARM架构下的编译器
# ET(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-linux-gcc)
# 制定boost库的安装位置
set( BOOST_ROOT /usr/local/boost/install/ )
# 安装boost时候include的路径(不要写下一级目录:include/boost)
set( BOOST_INCLUDEDIR /usr/local/boost/install/include/)
set( BOOST_LIBRARY_DIR /usr/local/boost/install/lib )
# 设置编译的版本为debug版本。如果要编译realse版本,直接写realse即可
set(CMAKE_BUILD_TYPE Debug)
处理CMakeLists.txt文件以成功进行源码编译
SOMEIP的源码编译里面需要先将 文档 相关的语句全部注释掉,打开CMakeLists.txt
将报错信息中涉及doxygen
的指令全部屏蔽,非常重要的一点要不然本地编译过不去
执行cmake指令
分别在x86 arm架构中执行:
x86:cmake -DCMAKE_INSTALL_PREFIX=../install_someip_x86 -DCMAKE_TOOLCHAIN_FILE=/home/ubuntu/Documents/install_ARM/x86.cmake ..
arm:cmake -DCMAKE_INSTALL_PREFIX=../install_someip_arm -DCMAKE_TOOLCHAIN_FILE=/home/ubuntu/Documents/install_ARM/arm.cmake ..
报错信息如下:someip中出现的错误X86和ARM相同的,目前没有发现不同的报错,所以下面图示有些是build-x86,有些事build-arm不要紧,问题的解决方案是一样的
显示几个文件不存在,没关系就在对应的位置通过touch指令
新建三个文件,此错误X86和ARM下都是一样的,两种架构下分别在对应位置touch上空文档即可。
所以在X86和ARM架构上源码编译的第一步,也即cmake编译选项设置及cmake指令执行这里,只有两个注意之处,首先新建几个空文件,并且将MC艾克Lists.txt里面的全部关于doxygen的内容全部注释掉即可。虽然会有很多警告但是cmake配置编译选项是可以过的。
make编译
因为前面已经将两个需要处理的点处理明白了,所以此处无障碍,只是编译的时候有很多warning,但不会报错,make顺利完成
make install安装
执行此指令,将会让此程序安装在cmake时指定的install_prefix路径下
次安装路径下的lib中库文件后面需要依赖
该步骤没有任何出问题的地方,不赘述啦
x86和ARM架构下SOMEIP中的HelloWorld编译
cmake编译选项设置及cmake指令执行
首先分别在 x86和ARM架构下源码的根目录下创建build_x86、build_arm
,cd进入,并且进行编译选项设置且执行指令
此处x86和ARM下的在cmake时不会报错,如下图所示:
分别执行下面语句:
x86:cmake -DCMAKE_TOOLCHAIN_FILE=<x86.cmake存放的位置加上该文件> ..
arm:cmake -DCMAKE_TOOLCHAIN_FILE=<arm.cmake存放的位置加上该文件> ..
make编译
make编译的时候出现错误,显示:
/usr/bin/ld: cannot find -lCommonAPI-SomeIP collect2: error: ld returned 1 exit status make[2]: *** [CMakeFiles/E01HelloWorld-someip.dir/build.make:117: libE01HelloWorld-someip.so] Error 1 make[2]: Leaving directory '/home/ubuntu/Documents/X86_CPP_SOMEIP/distack-someip/samples/E01HelloWorld/build-x86' make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/E01HelloWorld-someip.dir/all] Error 2 make[1]: Leaving directory '/home/ubuntu/Documents/X86_CPP_SOMEIP/distack-someip/samples/E01HelloWorld/build-x86' make: *** [Makefile:133: all] Error 2
但是检查了一番之后发现,CommonAPI-SomeIP库都在呢,而且路径也对
但是在make编译的时候总时出现如下的错误:
因此需要修改一下CMakeLists.txt文件,如下所示:
然后就可以成功进行编译,在编译过程中还是会出现很warning,但是不会报错,无碍。
完成之后ll查看文件,如下图所示,证明成功。
总结:
SOMEIP的编译,总体来讲需要动三个点:
1、注释所有与doxygen相关的指令语句
2、新建几个空文件,为了能够顺利完成编译
3、改动CMakeLists.txt文件中link_directories