1. 程式人生 > >ubuntu16.04使用freescale的IMX6平臺交叉編譯 expect

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上可以使用