本文介绍在Ubuntu 16.04上基于通用GCC工具链完成远程运维设备端代码移植到Ubuntu上。
准备工作
下载Toolchain
a. 假设我们在Ubuntu的/tmp/目录下通过下面的命令下载toolchain:
$sudo apt-get install gcc
下载过程如下:
b. 测试gcc可用:
下载设备端代码
a. 假设我们在Ubuntu的/tmp/目录下通过下面的命令下载最新代码包:
git clone https://github.com/alibaba/iot_remote_access.git
注意: 如果您的Ubuntu上并未安装git,请使用以下命令首先安装git:
sudo apt-get install -y git
新增第三方库编译脚本
参考一键编译手册的流程,我们拷贝support_armv7.sh
到script目录,重命名为support_ubuntu16_64.sh
.
- 修改support_ubuntu_16_64.sh里的相关变量,依据规则如下:
_ToolChainRootDirectory: 指的是ToolChain解压的根目录,一般情况下,ToolChain的根目录包含include/bin/lib等目录 _CrossPrefix: 指的所采用的Gcc的前缀,一般在ToolChain的根目录bin下,有*-gcc,比如arm-linux-gnueabi-gcc等。 _Host: 指的是交叉编译器所运行的OS信息,一般情况下,可以通过*-gcc -v获取其中的--host值。 _Target: 指的是交叉编译器所运行的Target信息,一般情况下,可以通过*-gcc -v获取其中的--target值。 _TargetBit: 值的是交叉编译的目标平台的bit数,一般为 32位。 _NewBoardName: 新的平台的名称,最好跟脚本名称里包含的board名称一致,假如为myboard。
_ToolChainRootDirectory: 在当前文档中,我们是/usr
,查看方法如下:
_CrossPrefix: 当前toolchain,gcc编译的通用前缀是空的。
_Host: 当前toolchain,我们这个是 x86_64-linux-gnu
,获取方法如下:
_Target: 当前toolchain,我们这个是 x86_64-linux-gnu
,获取方法如下:
_TargetBit: 就是设备是32bit的还是64bit的机器,当前文档我们使用的是64bit的。
_NewBoardName: 假设我们重新命名为新设备为ubuntu16_64,这样脚本运行后,我们会在board目录看到ubuntu16_64的子目录。
至此,support_ubuntu16_64.sh需要用户自行修改的内容如下:
执行第三方库编译脚本
我们在script
目录下,直接运行刚才新建的脚本:
/tmp/iot_remote_access/script$ ./support_ubuntu16_64.sh
完整的编译日志可以到这里下载: compile_ubuntu_16_64.log.zip
编译完成后的输出如下:
此时,我们可以到board目录下,看到已经新增了一个目录ubuntu16_64,并且ubuntu16_64的目录内容如下:
编译可执行程序
我们在顶层目录下,执行下面的命令,完成编译:
/tmp/iot_remote_access$ CC=gcc make board=ubuntu16_64
可以看到编译结果如下:
我们通过file
命令,可以查看是否编译的产物符合预期:
如果我们需要让二进制flash占用更小些,可以strip
一下:
编译生成物介绍
完整的编译框架使用指南请参考: https://www.yuque.com/yuehu/link_iot_edge_lite/xft9x9