一、虚拟机上编译hello.c:
$gcc hello.c –o hello(本机编译)
$arm-linux-gcc hello.c –o hello1(使用交叉工具链arm-linux-gcc4.3.2)
$arm-linux-gcc hello.c –o hello2(使用交叉工具链arm-linux-gcc3.4.1)
PS:最开始使用的是开发板(优龙ST2410)自带的交叉编译工具链cross-3.3.2。
二、主机(PC)串口终端显示信息(运行结果):
(这里通过nfs服务,将虚拟机上的/home目录挂载到开发板的/tmp目录下,这样操作/tmp目录就相当于访问了虚拟机上的/home目录,通过这种方式将应用程序装载到内存中运行,不用下载到flash上,便于监控和调试,而调试成功后可以根据需要烧写到flash里)。
1、 hello是本机(装有linux系统的主机)编译后的可执行文件,只能够在x86平台下运行;
2、 hello1是使用交叉编译工具链arm-linux-gcc 4.3.2编译后的可执行程序,能在arm version 1(
SYSV)上运行,显示结果说不存在连接器(解释器),不知是不是版本问题;
3、 hello2是使用交叉编译工具链arm-linux-gcc 3.4.1编译后的可执行程序,能在arm version 1(
ARM)上运行,显示结果正确。
经过几番周折之后,终于成功地在开发板上运行”helloworld!”程序!
这样虚拟机上就安装了三个交叉编译工具链:3.3.2、4.3.2和3.4.1。这三个交叉编译工具链的编译对象不一样,如针对内核、QT、应用程序等,实际操作时可以根据情况更改交叉编译工具链(由于都已经安装上了,所以只需在环境变量里更改相应的路径即可,命令是vi /etc/bashrc)。
三、回到最初碰到的问题:
上图是将工具链改为3.3.2后交叉编译后的结果(在虚拟机上都编译不通过,就不用在目标机上运行了吧!),显示不存在stdio.h这个文件或目录,网上查找了原因,众说风云,最后还是没有找出解决问题的方法。
发现问题、解决问题的过程:
发现上面那个问题后,我又在网上下载了4.3.2版本的工具链,并成功地安装在虚拟机上,此时在虚拟机上编译成功了,但是在目标机上却出现下面这个问题:
bash:./hello1:/lib/ld-linux.so.3:badELF interpreter: No such file or directory.
面对这个结果,我无语了,同时不解链接器怎么出问题了。好吧,看样子应该还是版本的问题,于是乎,我又从网上下载了3.4.1版本的工具链,并成功安装,更改环境变量,添加路径。然后开始在虚拟机上执行以下命令:arm-linux-gcc hello.c –o hello2,编译成功。通过file hello2查看hello2文件的信息,发现可以在arm上运行,从显示信息上看armversion 1后面括号的内容变为ARM了,同时内核版本也变了,估计问题就出现在这里。之后在开发板上运行hello2,此时终于成功地显示出“hello
world!”,真是皇天不负有心人!
总结:敢于尝试,不怕失败,遇到错误后思考问题可能出在哪里,通过网上查找、询问、请教,千万不能轻易放弃,坚持到最后就一定会成功!
2014年1月9日星期四