centos上用cmake交叉编译树莓派版的dlib

本文详细介绍了如何在CentOS系统上利用cmake进行交叉编译,以生成适用于树莓派的dlib库。过程中涉及到的步骤包括设置交叉编译环境、解决依赖问题、配置cmake文件以及解决rpath相关链接错误。作者通过实践,最终成功在树莓派上运行了编译后的dlib,并分享了整个过程中遇到的问题及解决方案。
摘要由CSDN通过智能技术生成

 

人工智能大火,自然大家都会想要在树莓派上跑个模型折腾折腾。在树莓派上有跑TF的,有跑CAFFE的,自然少不了dlib,想到dlib性能比较好,我也想在树莓派上试试dlib,但是网上查了半天,发下树莓派上跑dlib的,基本都是靠在树莓派上直接编译dlib源码生成的库来弄,而dlib编译又需要很多的内存,树莓派的1G内存有显得很紧张,所以网上的方法基本都是增加swap区,把tf卡上的空间用来和内存交换,这么做效率低不说,还很伤tf卡,所以我决定另辟蹊径,用交叉编译的方法去解决,从此跳入了一个大坑。

首先交叉编译需要环境,这个好办,树莓派的交叉编译环境还是很成熟的,github上有工具仓库,https://github.com/raspberrypi/tools/,不过windows上的交叉编译以失败告终,试过mingw, cygwin,都没成功,还折腾了很久很久,只能转向用linux交叉编译,毕竟平台相似,坑少些。于是我转向采用我的centos 7的机器交叉编译。

主要参考的是这篇:https://stackoverflow.com/questions/19162072/how-to-install-the-raspberry-pi-cross-compiler-on-my-linux-host-machine

先弄清交叉编译的原理,因为我的centos是x86的架构,而树莓派是arm的,所以不通过交叉编译,在其中一个平台上编译的程序显然无法在另一个平台上运行,毕竟指令集都不一样,即使操作系统一样,那只代表操作系统的线程管理、内存管理、文件系统等一样,但是程序执行还依赖硬件环境。所以交叉编译就是使用专用的编译器,在主机平台(centos)上编译目标平台(raspberry pi)上的程序,这里专用编译器就是https://github.com/raspberrypi/tools/里的GCC,经过改造,使得该GCC能在特定主机平台运行,并能够编译出在目标平台上运行的程序。所以交叉编译第一步就是是的编译的命令能通过交叉编译工具里的GCC去执行。

对了,前述参考链接里有说到,需要先安装的软件

apt-get install git rsync cmake ia32-libs

git、cmake就不多说了,rsync是用来树莓派和主机平台依赖库文件传输的,ia32-libs是32位兼容库,没有的话无法编译32位的程序。因为这个库比较老,一些新版本的linux摒弃了该库,那么就安装

libc6-i386  lib32z1  lib32stdc++6 以替代ia32-libs

在执行下面的命令前,我现在home目录下新建一个文件夹raspberrypi3b+,在其下再新建rootfs文件夹,此后交叉编译工具会将此位置作为根目录进行库文件的查找/重定向,用来存放和交叉编译相关的文件,后面都会引用这个路径,当然放在其他位置都是可以的,进入这个路径,执行

git clone git://github.com/raspberrypi/tools.git

工具在arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian路径下,如果主机系统是64位的,那么要使用arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64。

接下来,要使得默认GCC指向交叉编译的gcc,需要export PATH环境变量。

export PATH=$PATH:$HOME/raspberrypi3b+/rootfs/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin

可以添加到 /etc/profile或者 ~/.bashrc, 完事用source /etc/profile 或者source ~/.bashrc让环境生效。

然后测试前述交叉编译gcc是否配置成功

arm-linux-gnueabihf-gcc -v

如果看到正确的版本信息,恭喜你可以进入下一步了。否则再回顾下前面的步骤,看看哪里出了问题。

往往到这一步,交叉编译环境搭建差不多了,此时可以随便找个hello world程序编译下拷贝到树莓派上试试,往往是成功的。

arm-linux-gnueabihf-gcc-4.8.3 -o helloworld helloworld.c

但是由于我们要编译dlib,这个包含很多依赖库,所以光有上述的步骤不行,因为上述步骤里只提供了最基本的依赖库的交叉编译支持,如果需要更多的库支持怎么办,rsync来解决。

rsync -rl --delete-after --safe-links pi@192.168.1.PI:/{lib,usr} $HOME/raspberrypi3b+/rootfs

这个命令将树莓派上的/lib /usr文件夹整个拷贝到rootfs根目录下&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值