ubuntu20.04上交叉编译libprotobuf

前言

博主在编译libprotobuf过程中出了一些问题,但在查找资料时发现要么是找不到解决方法,要么是描述的不清晰,有些地方都是一笔带过,这对于初次编译libprotobuf库的朋友来说是不够的,所以写这篇博客记录一下自己编译时遇到的一些问题与解决方法,或许能提供一些帮助。另外建议首次编译时,仔细阅读资源文件自带的README.md,或许它会在你不知所措的时候让你有一些意外收获。

准备工作

1.ubuntu20.04(x86_64 GNU/Linux)
2.交叉编译链(自行下载安装arm\aarch64均可),并配置好交叉编译环境
3.protobuf源码(例如protobuf3.0.0,版本自定)

**

一.阅读README.md

**
1.将下载的压缩包解压后找到README.md,打开可以找到不同编译语言对应的源文件路径:在这里插入图片描述
2.阅读src文件夹下的README.md;
进入src目录,再次找到README.md,打开文件确认编译步骤(本文以c++(src)为例,进行相关叙述):
在这里插入图片描述
**

二.编译安装x86_64 GNU/Linux平台的protobuf

**
1.执行指令安装编译所需外部资源(根据README.md)

sudo apt-get install autoconf automake libtool curl make g++ unzip

2.执行指令

./autogen.sh

该指令会下载gmock源程序并加载编译所需要的资源,生成configure脚本;
在此过程中可能会出现无法获取gmock(gmock是Google开发的单元测试框架,直接访问)的情况:
curl: (7) Failed to connect to googlemock.googlecode.com port 443: 拒绝连接
在这里插入图片描述
查看autogen.sh脚本,定位到gmock部分

if test ! -e gmock; then
  echo "Google Mock not present.  Fetching gmock-1.7.0 from the web..."
  curl $curlopts -O https://googlemock.googlecode.com/files/gmock-1.7.0.zip
  unzip -q gmock-1.7.0.zip
  rm gmock-1.7.0.zip
  mv gmock-1.7.0 gmock
fi

该脚本是通过curl指令访问https://googlemock.googlecode.com/files/gmock-1.7.0.zip来下载压缩包,但如果同目录下存在gmock文件夹则不会执行访问下载,所以我们可以自行下载gmock-1.7.0.zip进行解压并修改文件夹名称为gmock即可;
3.步骤2后,当前目录下会生成configure脚本,一般来说交叉编译动态或静态链接库仅需要对下载好的资源执行编译三件套即可(./configure、make、make install),但是protobuf交叉编译时会用到可执行程序protoc、资源库libprotoc.so.10.0(随版本变更)、配置信息pkgconfig等,所以如果想交叉编译安装嵌入式libprotobuf动态库或静态库,需要先编译安装host平台版本的protoc(x86);
执行指令:

./configure#可添加参数,默认编译位置在/usr/local/bin和/usr/local/lib中
make
make install

**

三、编译安装交叉编译资源库-libprotobuf

**
1.配置libprotobuf编译资源
完成x86_64 GNU/Linux(host主机)版本编译安装后,找到安装可执行程序protoc、资源库libprotoc.so.10.0(随版本变更)、配置信息pkgconfig的位置(如不确定可通过find指令查询,例如:sudo find / -name "protoc"——含义是查找所有目录下名字为protoc的文件)后,即可再次为交叉编译protobuf配置资源环境:sudo vi /etc/profile
添加以下指令

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib#路径自行更改
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/#路径自行更改

2.执行./configure
执行以下指令(所有路径均为绝对路径,可根据自身路径进行相应替换):

sudo ./configure --host=aarch64-rockchip-linux-gnu --prefix=/home/mgy/lib_source_file/aarch64-libprotubuf --with-protoc=/usr/local/bin/protoc CC=/opt/m3568-sdk-v1.0.0-ga/gcc-buildroot-9.3.0-2020.03-x86_64_aarch64-rockchip-linux-gnu/bin/aarch64-rockchip-linux-gnu-gcc CXX=/opt/m3568-sdk-v1.0.0-ga/gcc-buildroot-9.3.0-2020.03-x86_64_aarch64-rockchip-linux-gnu/bin/aarch64-rockchip-linux-gnu-g++ --enable-shared --enable-static

通过指令./configure --help可查看所有附加参数的含义,其中:

  • –host=是编译运行主机(一般是交叉编译链前半部分名称——aarch64-rockchip-linux-gnu-gcc/aarch64-rockchip-linux-gnu-g++)
  • –prefix=是编译文件输出路径
  • –with-protoc=是x86编译生成的可执行程序protoc的路径(如果不加此项可能会出现[unittest_proto_middleman]、cannot execute binary file: Exec format error相关报错
  • CC=和CXX=是指定交叉编译链(采用绝对路径是因为初次编译时ubuntu默认采用x86本机自身的编译链)
  • –enable-shared是动态链接库
  • –enable-static是静态链接库

3.完成后执行make和make install:

sudo make

如果make过程报错:error while loading shared libraries: libprotoc.so.10: cannot open shared object file: No such file or directory
如果此时已经将将x86上编译成功的lib及pkgconfig库添加到环境中,source运行生效后再次执行make,观察报错是否还存在;若存在该报错,执行指令sudo ldconfig # refresh shared library cache(注:此步骤在README.MD中有描述)后再次make即可,完成后执行指令sudo make install安装链接库。

四.检查是否编译是否正常

1.编译完成后会在--prefix=目录下生成三个文件:

  • bin/
  • include/
  • lib/

2.其中:

  • bin目录下存放交叉编译后的可执行程序protoc
  • include目录下存放Google/protobuf的相关资源文件
  • lib目录下存放生成的动态链接库和静态链接库(嵌入式移植时仅需移植动态链接库或静态链接库即可)

3.验证链接库可用性
通过指令file查看生成文件的属性,判断是否嵌入式移植是否可用(交叉编译生成链接库均是ARM架构下的)。
例如:查询不同编译器下生成的libprotobuf.so.10.0.0文件

 file libprotobuf.so.10.0.0
#x86_64 GNU/Linux下本地编译器生成的
libprotobuf.so.10.0.0: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, 
#交叉编译链 GNU/Linux编译器生成的(嵌入式也用的linux系统)
libprotobuf.so.10.0.0: ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值