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