第一部分:CentOS-6.8_x64(或x32)下安装c++/c的交叉编译环境
1. 交叉编译环境的安装包:gcc-4.4.4-glibc-2.11.1-multilib-1.0_EasyARM-iMX283.tar,版本号:4.4.4
2. 将安装包直接解压到root根目录下:
tar xvf gcc-4.4.4-glibc-2.11.1-multilib-1.0_EasyARM-iMX283.tar -C /
3. 设置PATH环境
编辑/etc/profile文件,在该文件的最后加上:export PATH=$PATH:/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin
让/etc/profile修改立即生效:source /etc/profile
4. 测试是否安装成功
arm-linux-g++ -v [arm-linux-gcc -v]
报错:
错误1:-bash: /gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-linux-gcc: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
解决1:yum install -y glibc.i686
或
错误2:error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory
解决2:yum -y install zlib.i686
或
错误3:/libexec/gcc/arm-none-linux-gnueabi/4.4.3/cc1: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
解决3: yum -y install libstdc*
其实这几个错误只有在x64系统下才会出现(在x64系统下执行x32程序),x32应该是ok的
我们再次测试是否安装成功:arm-linux-g++ -v [arm-linux-gcc -v],输出如下:
Using built-in specs.
Target: arm-fsl-linux-gnueabi
Configured with: /work/arm-toolchains/tmp/src/gcc-4.4.4/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc-linux-gnu --target=arm-fsl-linux-gnueabi --prefix=/work/arm_fsl_gcc_4.4.4_multilib --with-sysroot=/work/arm_fsl_gcc_4.4.4_multilib/arm-fsl-linux-gnueabi/multi-libs --enable-languages=c,c++ --with-pkgversion=4.4.4_09.06.2010 --enable-__cxa_atexit --disable-libmudflap --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --with-gmp=/work/arm-toolchains/tmp/arm-fsl-linux-gnueabi/build/static --with-mpfr=/work/arm-toolchains/tmp/arm-fsl-linux-gnueabi/build/static --with-ppl=/work/arm-toolchains/tmp/arm-fsl-linux-gnueabi/build/static --with-cloog=/work/arm-toolchains/tmp/arm-fsl-linux-gnueabi/build/static --enable-threads=posix --enable-target-optspace --with-local-prefix=/work/arm_fsl_gcc_4.4.4_multilib/arm-fsl-linux-gnueabi/multi-libs --disable-nls --enable-symvers=gnu --enable-c99 --enable-long-long --enable-multilib --with-system-zlib --enable-lto
Thread model: posix
gcc version 4.4.4 (4.4.4_09.06.2010)
至此,安装结束
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第二部分:交叉编译c++代码,生成静态链接库,并在32位arm机器(如:pos机)上测试静态链接库调用是否正确
1. 待编译c++代码
bigInteger.cpp HMAC_SHA1.cpp MPosRecord.cpp MyOTP.cpp MyRSA.cpp PosScan.sln SHA1.h
bigInteger.h HMAC_SHA1.h MPosRecord.h MyOTP.h MyRSA.h SHA1.cpp
2. 执行编译,将.cpp文件编译为.o文件
arm-linux-g++ -c *.cpp
编译之后结果:
bigInteger.cpp bigInteger.o HMAC_SHA1.h MPosRecord.cpp MPosRecord.o MyOTP.h MyRSA.cpp MyRSA.o SHA1.cpp SHA1.o
bigInteger.h HMAC_SHA1.cpp HMAC_SHA1.o MPosRecord.h MyOTP.cpp MyOTP.o MyRSA.h PosScan.sln SHA1.h
3. 将所有的.o文件编译成.a文件,也就是静态链接库文件
arm-linux-ar -crv libiwaybook.a *.o
4. 让main.cpp去调用我们的静态链接库iwaybook.a,生成arm上的可执行文件
arm-linux-g++ -static ../main/main.cpp -L. /liwaybook -o iwaybook_static_linked
我们发现目录下多了一个可执行文件:iwaybook_static_linked
bigInteger.cpp HMAC_SHA1.cpp iwaybook_static_linked MPosRecord.h MyOTP.h MyRSA.h SHA1.cpp
bigInteger.h HMAC_SHA1.h libiwaybook.a MPosRecord.o MyOTP.o MyRSA.o SHA1.h
bigInteger.o HMAC_SHA1.o MPosRecord.cpp MyOTP.cpp MyRSA.cpp PosScan.sln SHA1.o
5. 将可执行文件iwaybook_static_linked上传到pos机,并执行
上传:scp iwaybook_static_linked root@192.168.1.136:/opt/arm-linux-gcc
执行:
[root@A287 arm-linux-gcc]# ./iwaybook_static_linked
decrypt e=17
decrypt n=87735338211064345724159139660828321853371216940134650208768326644176841454143
decrypt m=23245021127351875659792536546265235000099624620324683327615383856095272908337
decrypted success, uuid=3d79bc62845240a3bac442700a2af861
至此编译代码并测试成功!