ubuntu16.04使用freescale的IMX6平臺交叉編譯 expect
參考http://blog.chinaunix.net/uid-23089249-id-4762021.html
下載expect原始碼,tcl原始碼
先交叉編譯tcl
cd /home/mit/update/tcl8.6.8/unix
CC=arm-poky-linux-gnueabi-gcc AR=arm-poky-linux-gnueabi-ar LD=arm-poky-linux-gnueabi-ld AS=arm-poky-linux-gnueabi-as ./configure -cache-file=cache0 --host=arm-poky-linux --prefix=/home/mit/update/tcl8.6.8/unix
結果報 C compiler cannot create executables
網上說要 apt-get install g++和apt-get install gcc libc6-dev 但其實不行,因為我是交叉編譯
後來把CC=arm-poky-linux-gnueabi-gcc去掉
AR=arm-poky-linux-gnueabi-ar LD=arm-poky-linux-gnueabi-ld AS=arm-poky-linux-gnueabi-as ./configure -cache-file=cache0 --host=arm-poky-linux --prefix=/home/mit/update/tcl8.6.8/unix
得到Makefile檔案,手動修改CC編譯器為arm-poky-linux-gnueabi-gcc
make結果發現
/home/mit/update/tcl8.6.8/unix/tclUnixCompat.c:1005:5: error: impossible constraint in 'asm'
__asm__ __volatile__("mov %%ebx, %%esi \n\t" /* save %ebx */ ^
後來看了下原始檔,把裡面的程式碼註釋了,直接返回TCL_OK
#if defined(HAVE_CPUID)
//#if defined(__x86_64__) || defined(_M_AMD64) || defined (_M_X64)
// __asm__ __volatile__("movq %%rbx, %%rsi \n\t" /* save %rbx */
// "cpuid \n\t"
// "xchgq %%rsi, %%rbx \n\t" /* restore the old %rbx */
// : "=a"(regsPtr[0]), "=S"(regsPtr[1]), "=c"(regsPtr[2]), "=d"(regsPtr[3])
// : "a"(index));
//#else
// __asm__ __volatile__("mov %%ebx, %%esi \n\t" /* save %ebx */
// "cpuid \n\t"
// "xchg %%esi, %%ebx \n\t" /* restore the old %ebx */
// : "=a"(regsPtr[0]), "=S"(regsPtr[1]), "=c"(regsPtr[2]), "=d"(regsPtr[3])
// : "a"(index));
//#endif
status = TCL_OK;
#endif
return status;
}
接著編譯,發現編譯成功後又呼叫了一個CONFIGURE檔案,又在配置一個什麼東西,但用的是gcc,不行還得在配置configure檔案時就要是正確的,重新執行開始的
C=arm-poky-linux-gnueabi-gcc AR=arm-poky-linux-gnueabi-ar LD=arm-poky-linux-gnueabi-ld AS=arm-poky-linux-gnueabi-as ./configure -cache-file=cache0 --host=arm-poky-linux --prefix=/home/mit/update/tcl8.6.8/unix
後來去看了config.log,發現
/opt/fsl-imx-fb/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/5.3.0/real-ld: cannot find crt1.o: No such file or directory
/opt/fsl-imx-fb/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/5.3.0/real-ld: cannot find crti.o: No such file or directory
/opt/fsl-imx-fb/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/5.3.0/real-ld: cannot find crtbegin.o: No such file or directory
/opt/fsl-imx-fb/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/5.3.0/real-ld: cannot find -lstdc++
/opt/fsl-imx-fb/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/5.3.0/real-ld: cannot find -lm
/opt/fsl-imx-fb/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/5.3.0/real-ld: cannot find -lgcc_s
/opt/fsl-imx-fb/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/5.3.0/real-ld: cannot find -lgcc
/opt/fsl-imx-fb/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/5.3.0/real-ld: cannot find -lc
/opt/fsl-imx-fb/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/5.3.0/real-ld: cannot find -lgcc_s
/opt/fsl-imx-fb/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/5.3.0/real-ld: cannot find -lgcc
/opt/fsl-imx-fb/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/5.3.0/real-ld: cannot find crtend.o: No such file or directory
/opt/fsl-imx-fb/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/5.3.0/real-ld: cannot find crtn.o: No such file or directory
collect2: error: ld returned 1 exit status
後來猜是編譯引數沒有傳對,自己手動交叉編譯了下helloword程式
arm-poky-linux-gnueabi-g++ -o hello hello.o也是報的這個錯,後來用別人提供的qt編譯環境編譯了下helloword程式
發現多了一些編譯引數
arm-poky-linux-gnueabi-g++ -march=armv7-a -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a9 --sysroot=/opt/fsl-imx-fb/4.1.15-2.1.0/sysroots/cortexa9hf-neon-poky-linux-gnueabi -c -pipe -g -std=gnu++0x -Wall -W -fPIC -I. -I../rootfs/usr/lib/glib-2.0/include -o hello.o hello.cpp
arm-poky-linux-gnueabi-g++ -march=armv7-a -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a9 --sysroot=/opt/fsl-imx-fb/4.1.15-2.1.0/sysroots/cortexa9hf-neon-poky-linux-gnueabi -o hello hello.o
紅色的是編譯引數,把這些引數傳configure檔案呼叫
AR=arm-poky-linux-gnueabi-ar LD=arm-poky-linux-gnueabi-ld AS=arm-poky-linux-gnueabi-as ./configure CC=arm-poky-linux-gnueabi-gcc -cache-file=cache0 --host=arm-poky-linux --prefix=/home/mit/update/tcl8.6.8/unix CFLAGS="-march=armv7-a -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a9 --sysroot=/opt/fsl-imx-fb/4.1.15-2.1.0/sysroots/cortexa9hf-neon-poky-linux-gnueabi"
一切都好了
開始編譯expect
CC=arm-poky-linux-gnueabi-gcc AR=arm-poky-linux-gnueabi-ar ./configure -cache-file=cache0 --host=arm-poky-linux --prefix=/home/mit/update/expect-5.45 CFLAGS="-march=armv7-a -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a9 --sysroot=/opt/fsl-imx-fb/4.1.15-2.1.0/sysroots/cortexa9hf-neon-poky-linux-gnueabi"
結果報錯,看config.log 說expect不支援交叉編譯,後來又看到別人的做是先不設定交叉編譯引數,生成Makefile後再修改
./configure -cache-file=cache0 --prefix=/home/mit/update/expect-5.45 CFLAGS="--sysroot=/opt/fsl-imx-fb/4.1.15-2.1.0/sysroots/cortexa9hf-neon-poky-linux-gnueabi -D__ARM_PCS_VFP" --with-tclinclude=/home/mit/update/tcl8.6.8/unix/include
修改CC = arm-poky-linux-gnueabi-gcc AR=arm-poky-linux-gnueabi-ar 再把編譯引數-march=armv7-a -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a9加到CFLAGS上
編譯結果 連結時報錯,找不到-lieee,上網上搜索了下不知道是什麼庫,直接在Makefile中刪除了ieee的連結引數,再編譯,沒有報成功,但expect卻編譯出來了,放到arm上可以使用