资源描述
实验二 交叉编译和Makefile
一、 实验目的
1. 了解和掌握交叉编译模式和方法;
2. 了解和掌握makefile文件的编写
3. 学会使用交叉编译工具和make工具
二、 实验环境
预装redhat9.0(内核版本2.4.x)的PC机一台,XScale嵌入式实验箱一台(已构建嵌入式linux系统),以太网线一根,交叉编译工具链。
三、 实验步骤
1. 安装交叉编译器arm-linux-gcc,并配置环境。
解压hybus-arm-linux-R1.1.tar.gz文件。
[root @localhost ~]# cp XSBASE/xsbase/Toolchain/hybus-arm-linux-R1.1.tar.gz /usr/local
[root @localhost ~]# tar zvxf /usr/local/hybus-arm-linux-R1.1.tar.gz
此时是hybus-arm-linux-R1.1.tar.gz解压完成时候的截图。
设置路径。
[root @localhost local]# vi ~/.bash_profile
此时将会进入编辑路径的编辑框,在编辑框内添加一条路径即可。
添加的路径为:PATH=$PATH:/usr/local/hybus-arm-linux-R1.1/bin
当编辑完上面的时候,按下ESC,然后输入":wq"退出编辑框。
使路径生效。
[root @localhost local]# source ~/.bash_profile
④测试arm-linux-gcc是否配置成功。
当出现arm-linux-gcc:No input files的时候,说明已经配置成功,没有输入文件是说明此时没有对任何一个文件进行交叉编译。
2. Linux简单程序设计。
使用vi等编辑器编写一个简单程序,我现在是实现输出50以内的奇数和偶数。
[root @localhost ~]# mkdir 2008550533
[root @localhost ~]# cd 2008550533
[root @localhost 2008550533]# mkdir hehui
[root @localhost ~]# cd hehui
[root @localhost hehui]# vi ji_oushu.c
/*输出50以内的奇数和偶数*/
#include <stdio.h>
void main()
{
int n=50;
int i=0,j=0;
printf("%d以内的奇数为:",n);
for(i=0;i<n;i++)
{
if(i%2==1)
printf("%d ",i);
}
printf("\n");
printf("%d以内的偶数为:",n);
for(j=0;j<n;j++)
{
if(j%2==0)
printf("%d ",j);
}
printf("\n");
}
用gcc编译器编译并运行程序;使用file命令查看编译后的可执行文件信息。
[root @localhost hehui]# gcc ji_oushu.c -o hmily
[root @localhost hehui]# file hmily
hmily: ELF 32-bit LSB executable, Intel PXA255/210 PCHCIA, version 1 (SYSV), for GNU/Linux 2.4, dynamically linked (uses shared libs), for GNU/Linux 2.4, not stripped
运行gcc编译出来的可执行文件。
[root @localhost hehui]# ./hmily
④使用交叉编译器编译并运行。
A. [root @localhost hehui]# arm-linux-gcc -o hmily ji_oushu.c
B. 打开另外一个终端,输入minicom进入板子里去。
C. 操作一下命令。
XSBase255B>boot
XSBASE login:root
[root@XSBASE /root]$ftp 192.168.0.77
ftp>get ~/hehui/hmily
然后按下Ctrl + D
[root@XSBASE /root]$chmod +x hmily
[root@XSBASE /root]$./hmily
3. Makefile文件的编写。
编写一个文件prime.h,包含一个判断int类型的数是否为素数。
[root @localhost ~]# mkdir 2008550533/prime
[root @localhost ~]# cd 2008550533/prime
[root @localhost prime]# vi prime.h
进入prime.h编辑预定义程序。
#ifndef __PRIME_H__
#define __PRIME_H__
extern void prime(int );
#endif
当编辑完上面的prime.h程序时候,按下ESC,然后输入":wq"退出编辑框。
编写一个prime.c,实现prime.h头文件。
[root @localhost prime]# vi prime.c
进入prime.c编辑实现判定一个是否为素数的程序。
#include <stdio.h>
void prime(int n)
{
int i,j,m=0;
printf("素数为:\n");
for(i=2;i<=n;i++)
{
for(j=2;j<i;j++)
{
if(i%j==0)
break;
}
if(i==j)
{
printf("%d ",i);
m++;
if(m%5==0)
printf("\n");
}
}
}
当编辑完上面的prime.c程序时候,按下ESC,然后输入":wq"退出编辑框。
编写一个main.c主函数,实现用户输入整数,程序告诉用户这个数是否为素数。
[root @localhost prime]# vi prime.c
进入main.c编辑主函数。
#include <stdio.h>
#include "prime.h"
void main()
{
int n=100;
prime(n);
}
当编辑完上面的main.c程序时候,按下ESC,然后输入":wq"退出编辑框。
④使用gcc编译,查看运行结果。
[root @localhost prime]# gcc prime.c -o prime_hehui
[root @localhost prime]# ./prime_hehui
⑤编写Makefile文件实现第④步功能,并使用make工具生成这个可执行文件。
[root @localhost prime]# rm -r prime_hehui
[root @localhost prime]# vi Makefile
进入Makefile编辑:
prime:prime.o main.o
gcc prime.o main.o -o prime
prime.o:prime.c
gcc -c prime.c
main.o:main.c prime.h
gcc -c main.c
clean: 37
rm -fr prime_hehui *.o
当编辑完上面的Makefile的时候,按下ESC,然后输入":wq"退出编辑框。
[root @localhost prime]# make
[root @localhost prime]# ./prime_hehui
⑥使用依赖文件的预定义变量改写Makefile,实现第④步功能并使用make工具生成这个可执行文件,并运行。
[root @localhost prime]# make clean
[root @localhost prime]# mv Makefile Makefile1
[root @localhost prime]# vi Makefile
进入Makefile编辑:
CC=gcc
CFLAGS=
OBJS=prime.o main.o
all:prime
prime:prime.o main.o
$(CC) $(CFLAGS) $^ -o $@
prime.o:prime.c
$(CC) $(CFLAGS) -c $< -o $@
main.o:main.c prime.h
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -fr prime_hehui *.o
当编辑完上面的Makefile的时候,按下ESC,然后输入":wq"退出编辑框。
[root @localhost prime]# make
[root @localhost prime]# ./prime_hehui
四、 思考题
1. 为什么要使用交叉编译模式?
答:交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放ARM CPU平台上才能运行,虽然两个平台用的都是Linux系统。这种方法在异平台移植和嵌入式开发时非常有用。
2. gcc和交叉编译工具生成的可执行文件有什么不同?
答:可执行文件的目标平台不一样。你说的gcc应该是指在pc上,即x86体系结构。而交叉编译生成的应该是其他体系平台的,如ARM等只能在对应的平台上运行。
3. Makefile文件的作用?
答:Makefile文件保存了编译器和连接器的参数选项,还表述了所有源文件之间的关系(源代码文件需要的特定的包含文件,可执行文件要求包含的目标文件模块及库等).创建程序(make程序)首先读取Makefile文件,然后再激活编译器,汇编器,资源编译器和连接器以便产生最后的输出,最后输出并生成的通常是可执行文件.创建程序利用内置的推理规则来激活编译器,以便通过对特定cpp文件的编译来产生特定的obj文件.
展开阅读全文