下载源码:
TCL源码:
http://iweb.dl.sourceforge.net/project/tcl/Tcl/8.6.4/tcl8.6.4-src.tar.gz
Expect源码:
http://colocrossing.dl.sourceforge.net/project/expect/Expect/5.45/expect5.45.tar.gz
由于 expect 是基于 tcl 语言的,所以需要先编译 TCL。
交叉编译 TCL
tcl 直接交叉编译,会提示重复定义失败,所以先执行下面的声明
export tcl_cv_type_64bit="long long"
export ac_cv_c_bigendian=no
export tcl_cv_strtod_buggy=1
export ac_cv_func_strstr=yes
export ac_cv_func_opendir=yes
然后 生成 Makefile
./configure --prefix=$PWD/tmp --host=i486-openwrt-linux --build=i686-linux
# --prefix 安装路径
# --host 平台架构(编译出的程序在哪个平台运行,就用那个平台的工具链名去掉 gcc)
# --build 编译的主机
生成 Makefile 之后 就执行
make
# make 之后有提示错误,就解决掉错误
# 比如提示少某个库,就去制作工具链的目录下找,找到就cp过去,找不到,就自己下载源码,然后交叉编译,然后cp过去
# 提示少某个头文件,就去找个头文件 cp 过去。这次我缺少的头文件,有一部分是直接拿的PC的头文件
# make 之后 执行 make install
# 注意设置的安装路径
make install
交叉编译 expect
由于 expect 不支持交叉编译,所以生成 Makefile 时需要先用 X86 的 gcc,生成 Makefile 之后在修改 Makefile 的CC
./configure --prefix=$PWD/tmp --with-tcl=/home/gino/tcl8.6.4/unix/tmp/lib --with-tclinclude=/home/gino/tcl8.6.4/unix/tmp/include
# --with-tcl 指定tcl安装目录下的lib路径(要交叉编译过的)
# --with--tclinclude 指定tcl安装目录下的 include 路径
修改 Makefile
CC = i486-openwrt-linux-gcc
然后 执行 make
执行 make 之后一样会提示缺这个 少那个,想办法搞定吧。
这里只描述一个关于 ieee 库(因为这个需要源码编译 =。=)
下载地址:https://launchpadlibrarian.net/10140745/libieee1284_0.2.11.orig.tar.gz
下载之后 解压 交叉编译
./configure --prefix=$PWD/tmp --host=i486-openwrt-linux --build=i686-linux
make
# make 有错,想办法搞定
make install
将安装目录的 lib目录下、include目录下的文件,拷贝到交叉工具链下对应的目录
cp lib/* /opt/openwrt-i386-gcc/lib
cp inlucde/* /opt/openwrt-i386-gcc/include
做完这些之后,去到 expect 目录,继续执行 make,还是会报错。需要改 expect 的 Makefile
修改之后的内容如下:
expect: exp_main_exp.o $(PKG_LIB_FILE)
$(CC) \
-pipe ${CFLAGS_DEFAULT} ${CFLAGS_WARNING} ${SHLIB_CFLAGS} \
-Wl,--export-dynamic \
-o expect exp_main_exp.o \
-L/work/src/openwrt_x86/expect5.45 -lexpect5.45 \
-L/work/src/openwrt_x86/expect/tcl8.4.20/unix/tmp/lib -ltcl8.4 \
-ldl -lieee1284 -lutil -lm \
-Wl,-rpath,${LIB_RUNTIME_DIR} \
-Wl,-rpath,${LIB_RUNTIME_DIR}/${PACKAGE_NAME}${PACKAGE_VERSION}
$(SETUID) expect
再次 make 就成功了。
测试运行
要在目标机上运行这个程序,需要把交叉编译后的 tcl(安装目录下) ieee(安装目录下) 的库文件(安装目录下的lib下的所有文件) 以及 expect的动态库(libexpect5.45.so) 和 expect的执行文件都拷贝到目标机器上。
本文参考:http://blog.csdn.net/aa120515692/article/details/47122773