交叉编译 expect 需要先编译如下依赖包:tcl
tcl源码下载:
wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz
我的目标主机是一台运行着openwrt系统的x86机器。工具链为 i486-openwrt-linux-
./configure --prefix=$PWD/tmp --host=i486-openwrt-linux --build=i686-linux
make
生成 Makeflie 文件后,需要修改Makeflie 里面的 CC。默认是 gcc
。改为 i486-openwrt-linux-gcc
make
发现报错。找不到 ieee 这个库。于是只好到网上去找:
找到一个 ieee1284 的库。解压:
CC=i486-openwrt-linux-gcc ./configure --prefix=$PWD/tmp --host=i486-openwrt-linux --build=i686-linux
make
make install
//拷贝所有 库 到工具链的 lib 目录
cp * -rfd /opt/OpenWrt-Toolchain-x86-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-i686/toolchain-i386_i486_gcc-4.8-linaro_uClibc-0.9.33.2/lib/
//拷贝头文件到工具链的 include 目录
cp * /opt/OpenWrt-Toolchain-x86-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-i686/toolchain-i386_i486_gcc-4.8-linaro_uClibc-0.9.33.2/include/
编译发现还是没有找到 ieee。原来我下载的源码库是 ieee1284.于是把makefile文件里面所有 ieee 都改成 ieee1284
在编译。成功
make install 安装到当前目录下的tmp目录。
安装完毕以后,进入tcl源代码的根目录,把子目录unix下面的tclUnixPort.h copy到子目录generic中。
暂时不要删除tcl源代码,因为expect的安装过程还需要用。
交叉编译 expect
./configure --prefix=$PWD/tmp --host=i686-linux --build=i686-linux --with-tcl=/work/src/openwrt_x86/expect/tcl8.4.20/unix/tmp/lib --with-tclinclude=/work/src/openwrt_x86/expect/tcl8.4.20/generic
修改 makeflie 把 gcc 改成 i486-openwrt-linux-gcc 把所有ieee改成ieee1284
修改
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
在 连接库行加上 -lieee1284 -lutil 否则编译会报错
再次 make 发现没问题
记得要在目标机器上面运行这个程序的话,需要把前面的交叉编译的 tcl ieee 库文件都拷贝到目标机器上。同时再 expect 目录下会生成一个
libexpect5.45.so
这个也要拷贝到目标机器上