vsomip跨平台编译
1.下载源码
vsomeip是宝马开源的基于TCP UDP协议的"中间件"通信。之所以说它为“中间件”,是因为简单来说它就是一个封装库,实现远程RPC通信的部件
尤其在现在汽车行业SOA架构下使用得比较多,废话不多说,首先下载源码和相关依赖库
1.1 vsomeip源码:https://github.com/COVESA/vsomeip
1.2 vsomeip里面实现很多依赖boost库,所以需要安装boost:下载地址:https://www.boost.org/users/download/
2.源码编译
2.1 首先进行boost库编译
因为要进行交叉编译,所以,在本地编译能够在ubuntu上运行的库,建立一个boost_lib文件目录里面保存ubuntu 上运行的target_pc目录和后续arm上运行的target_arm目录
进入源码根目录:建立编译脚本build_boost.sh(编译ubuntu用)和build_arm_boot.sh(arm 上使用)
脚本内容
build_boost.sh
#!/bin/sh
COMPILER_PREFIX=$(pwd)/../boost_lib/target_pc #需要安装的库路径,这里是上述说到的ubuntu运行的路径
rm -rf project-config.jam*
./bootstrap.sh --with-libraries=all --prefix=$COMPILER_PREFIX
./b2 install
然后执行脚本,等待编译安装结束,根据电脑配置,稍微需要点时间,等待就行
build_arm_boost.sh内容
#!/bin/sh
#编译工具路径
QL_CROSSTOOLS=xxx/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin #修改成自己的交叉编译工具链路径
#SYSROOT路径
QL_SYSROOTS=xxx/buildroot/output/rockchip_rv1126_rv1109/host/arm-buildroot-linux-gnueabihf/sysroot/
COMPILER_SYSROOT="--sysroot=$QL_SYSROOTS"
#编译工具
COMPILER_CC=$QL_CROSSTOOLS/arm-linux-gnueabihf-gcc
#编译选项
COMPILER_FLAGS="-march=armv7-a -marm -mfpu=neon -mfloat-abi=hard"
#安装位置
COMPILER_PREFIX=$(pwd)/../boost_lib/target_arm
rm -rf project-config.jam*
./bootstrap.sh --with-libraries=all --prefix=$COMPILER_PREFIX
#将gcc替换成交叉编译工具的gcc并添加编译选项和sysroot路径
sed -i "/using gcc/c using gcc : : $COMPILER_CC $COMPILER_FLAGS $COMPILER_SYSROOT ;" project-config.jam
./b2 install variant=release abi=aapcs address-model=32 architecture=arm binary-format=elf threading=multi toolset=gcc
执行自己需要的平台编译脚本,boost库编译结果如下
现在boost库成功编译安装了,解下来正式进入vsomeip源码编译安装,我这里是用的vsomeip-3.1.20.1版本(为什么说版本,是因为不同的vsomeip编译,可能依赖的boost库版本不一致,会编译出错,亲身经历。所以这里我使用的是vsomeip-3.1.20.1,boost是1.74)在源码目录下创建build_pc(ubuntu使用得版本),并在build_pc目录下创建编译脚本build.sh,内容如下,本人不喜欢将库默认都安装在系统目录下所以,这里选择安装在vsomeip-lib/target_pc(ubuntu上使用得版本)
#!/bin/sh
#编译工具
COMPILER_CC=gcc
COMPILER_CXX=g++
#编译选项
COMPILER_FLAGS="-lpthread"
#安装位置
COMPILER_PREFIX=$(pwd)/../../vsomeip-lib/target_pc
#boost编译后的安装位置
BOOST_ROOT=/home/book/work/boost/boost_lib/target_pc
cmake -DCMAKE_INSTALL_PREFIX=$COMPILER_PREFIX \
-DCMAKE_C_COMPILER=$COMPILER_CC \
-DCMAKE_CXX_COMPILER=$COMPILER_CXX \
-DCMAKE_C_FLAGS="$COMPILER_FLAGS" \
-DCMAKE_CXX_FLAGS="$COMPILER_FLAGS" \
-DBOOST_ROOT=$BOOST_ROOT \
-DBoost_INCLUDE_DIR=$BOOST_ROOT/include/boost \
-DBoost_LIBRARY_DIR=$BOOST_ROOT/lib \
-DENABLE_SIGNAL_HANDLING=1 \
-DIAGNOSIS_ADDRESS=0x10 \
-DENABLE_SESSION_HANDLING_CONFIG=1 \
..
make
make install
一样的在vsomeip源码目录下创建build_arm目录,在build_arm目录下创建交叉编译脚本build_arm.sh,内容如下
#!/bin/sh
#编译工具路径
QL_CROSSTOOLS=xxx/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin #修改成自己的交叉编译工具路径
#SYSROOT路径
QL_SYSROOT=xxx/buildroot/output/rockchip_rv1126_rv1109/host/arm-buildroot-linux-gnueabihf/sysroot/ #修改成自己的交叉编译工具路径
COMPILER_SYSROOT="--sysroot=$QL_SYSROOT"
#编译工具
COMPILER_CC=$QL_CROSSTOOLS/arm-linux-gnueabihf-gcc
COMPILER_CXX=$QL_CROSSTOOLS/aarm-linux-gnueabihf-g++
#编译选项
COMPILER_FLAGS="-lpthread -march=armv7-a -marm -mfpu=neon -mfloat-abi=hard"
#安装位置
COMPILER_PREFIX=$(pwd)/../../vsomeip-lib/target_arm/
#boost编译后的安装位置
BOOST_ROOT=$(pwd)/../../../boost/boost_lib/target_arm/
cmake -DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_INSTALL_PREFIX=$COMPILER_PREFIX \
-DCMAKE_C_COMPILER=$COMPILER_CC \
-DCMAKE_CXX_COMPILER=$COMPILER_CXX \
-DCMAKE_C_FLAGS="$COMPILER_FLAGS $COMPILER_SYSROOT" \
-DCMAKE_CXX_FLAGS="$COMPILER_FLAGS $COMPILER_SYSROOT" \
-DCMAKE_FIND_ROOT_PATH=$QL_SYSROOT \
-DBOOST_ROOT=$BOOST_ROOT \
-DBoost_INCLUDE_DIR=$BOOST_ROOT/include/boost \
-DBoost_LIBRARY_DIR=$BOOST_ROOT/lib \
-DENABLE_SIGNAL_HANDLING=1 \
-DIAGNOSIS_ADDRESS=0x10 \
-DENABLE_SESSION_HANDLING_CONFIG=1 \
..
make
make install
然后根据自己的平台进入对应的目录执行相关的脚本即可
4.验证
可以根据我之前的文章,https://blog.csdn.net/weixin_44723188/article/details/130118930?spm=1001.2014.3001.5502进行编译demo程序跑起来
5.问题
在编译过程中,遇到很多问题其中最典型的就是libvsomeip-cfg.so加载不成功,后续会专门说一下相关问题