Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。
最近换了一个电脑专门装ubuntu后,和往常一样仍是装好arm-linux-gnueabi-gcc,arm-linux-gnueabi-g++和eclips e后,写好程序,交叉编译之后,在板上却显示:
-sh: ./a.out: No such file or directory
然后查看文件属性:
file a.out
显示如下:
a.out: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.2.0, BuildID[sha1]=cfd57ddadc94410b1922a606b6c0e4fc7d6addee, not stripped
和之前同样的交叉编译过,但能在开发板上运行的文件比较了一下:
file sinfo
显示如下:
sinfo: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=4769e11eda509ac1e6b52100af3f364229e7b534, not stripped
再看了自己的GNU/Linux版本:
uname -a
Linux colibri-imx6 4.1.41-rt50-dirty #3 SMP PREEMPT RT Sun Aug 27 17:20:09 CST 2017 armv7l GNU/Linux
这两个GNU/Linux和我的都不同,由于GNU/Linux版本的区别,这样很可能是因为动态编译的不同,导致开发板上缺少某个库,就无法运行该文件,故而显示No such file or directory。
解决方法:
在编译的时候,选择- static来进行静态连接,这样,所有需要的库全会编译进文件里,虽然文件会变得很大,但是可以不依赖板上的库运行。
只用在eclipse里,在编译的时候在gcc-link里面选择- static即可:
ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=8478b453a14004a4bc0338f990461b3416c05f63, not stripped
这样最后编译出来即可运行。