openwrt环境下expect交叉编译及使用

1. 配置交叉编译环境

       首先说一下什么是交叉编译:我们在 ubuntu 中写了一个程序,比如 main.c,然后使用 ubuntu 的编译器进行编译,生成的可执行文件自然可以在 ubuntu 中运行。但是生成的可执行文件可以在我们的开发板中能运行吗?答案当然是否定的,原因很简单,就是平台不同,芯片架构不同。那我们如何使得 ubuntu 编译出来的可执行文件在开发板上面运行呢,当然就要借助一些工具了,通过一些工具进行对程序编译,生成在开发板上可以运行的文件,那这些工具我们把它叫做交叉编译工具,把这种从一个平台开发另一个平台应用的方式称为交叉编译。
        Toolchain 即交叉编译工具,要在 ubuntu 编译我们写的应用程序使得生成开发板可以执行的文件,必须有这一套工具才可以进行!

      首先,配置OpenWrt 使得支持toolchain。在openwrt/目录下运行 make menuconfig,并且选中 toolchain:

      保存退出之后,编译 OpenWrt: make V=99。编译完成之后,我们可以查看openwrt/bin/文件夹中有没有交叉编译工具:

      可以看到,已经编译出了交叉编译工具。进到/openwrt/bin/targets/x86/generic/openwrt-toolchain-x86-generic_gcc-8.3.0_musl.Linux-x86_64/toolchain-i386_pentium4_gcc-8.3.0_musl/bin/目录ls命令查看编译出的交叉编译工具:

       现在修改环境变量PATH,增加交叉编译工具所在位置,这样我们编译程序时会根据这个环境变量找到交叉编译工具。
以 root权限修改~/.bashrc文件,增加如下内容:

        保存并退出,然后执行source .bashrc生效。至此,交叉编译环境就搭建好了。

2. 交叉编译tcl

        tcl源码下载:

wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz

        目标机器是一台运行着openwrt系统的x86机器。工具链为 i486-openwrt-linux-, 下载完代码后,解压,进入tcl源码目录/tcl8.4.11/unix/,执行如下命令生成Makefile:

./configure --prefix=$PWD/tmp --host=i486-openwrt-linux --build=i686-linux
# --prefix 安装路径
# --host   平台架构(编译出的程序在哪个平台运行,就用那个平台的工具链名去掉 gcc)
# --build  编译的主机

        生成Makefile文件后,修改Makefile文件里的CC和SHLIB_LD:

CC          = i486-openwrt-linux-gcc -m32 -pipe

SHLIB_LD    = i486-openwrt-linux-gcc -pipe -shared

        (此处CC的 -m32选项是在编译过程中出现的问题,因为是在64位ubuntu编译32位的程序,此处需要加-m32选项,具体问题描述及解决办法见:https://ccm.net/faq/1137-compiling-testing-in-32-bit-on-ubuntu-x86-64)

        修改完CC和SHLIB_LD后,保存并退出,然后执行make & make install,即可。

3. 交叉编译expect

        Expect源码下载:

wget http://sourceforge.net/project/expect/Expect/5.45/expect5.45.tar.gz

        下载完代码后,解压,进入expect源码目录/expect5.45/,执行如下命令生成Makefile:

./configure --prefix=$PWD/tmp --with-tcl=/home/work/tcl8.4.11/unix/tmp/lib --with-tclinclude=/home/work/tcl8.4.11/unix/tmp/include
# --with-tcl  指定tcl安装目录下的lib路径(要交叉编译过的)
# --with--tclinclude 指定tcl安装目录下的 include 路径

        生成Makefile文件后,修改Makefile文件里的CC:

CC          = i486-openwrt-linux-gcc

         修改完CC后,保存并退出,然后执行make即可。

4. 使用expect

        想要在openwrt环境下使用expect的话,需要将一下几个目录下的文件都拷贝到目标机器上。

/expect/expect               --->    /usr/sbin/
/expect/libexpect5.45.so     --->    /usr/lib/
/tcl8.4.11/unix/tmp/lib/*    --->    /usr/lib/

        运行expect -v,查看expect版本信息,说明在openwrt环境已经能正常使用expect了。

5. 参考文章

(1)https://blog.csdn.net/u013162035/article/details/78823465

(2)https://blog.csdn.net/u011641885/article/details/47153135

(3)https://blog.csdn.net/aa120515692/article/details/47122773

(4)https://ccm.net/faq/1137-compiling-testing-in-32-bit-on-ubuntu-x86-64


版权声明:本文为kakabuqinuo原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。