Ubuntu8.04下的ARM交叉编译工具链(arm-linux-)详细介绍

Ubuntu8.04下的ARM交叉编译工具链(arm-linux-)详细介绍
Ubuntu8.04下的ARM交叉编译工具链(arm-linux-)详细介绍

原文链接与:https://www.360docs.net/doc/8113240245.html,/u1/58901/showart_1335004.html

实验室的机器配置太低,速度太慢实在是受不了。说是已经升级了,内存从128M升级到了256M。My god!这年头还能到什么地方找那么多128的内存条去阿?哇嘎嘎。真是服了。。。哈哈

打开一个pdf文件要等老半天。基本上没有办法工作。于是想在自己的笔记本上做一个交叉编译环境。我的机器配置也不高,但是相对于实验室的机器来说已经相当不错了。我的机器是单操作系统:只有Ubuntu8.0.4。感觉和windows XP差不多。XP下有的东西,ubuntu下基本上也有。

ps:昨天是我的生日。昨天上午有课,一下午还有今天上午就是在交叉编译的过程中度过的。感觉整个过程挺考验耐心的。下面进入正题。

待续。。。最近两天内补充完整。

*************************************************************************************

在进行嵌入式在进行嵌入式开发之前,首先要建立一个交叉编译环境,这是一套编译器、连接器和libc库等组成的开发环境。本文结合自己做嵌入式交叉编译开发工作的经验,同时结合自己的体会,做了一个介绍

随着消费类电子产品的大量开发和应用和Linux操作系统的不断健壮和强大,嵌入式系统越来越多的进入人们的生活之中,应用范围越来越广。

在裁减和定制Linux,运用于你的嵌入式系统之前,由于一般嵌入式开发系统存储大小有限,通常你都要在你的强大的pc机上建立一个用于目标机的交叉编译环境。这是一个由编译器、连接器和解释器组成的综合开发环境。交叉编译工具主要由binutils、gcc 和glibc 几个部分组成。有时出于减小libc 库大小的考虑,你也可以用别的c 库来代替glibc,例如uClibc、

dietlibc 和newlib。建立一个交叉编译工具链是一个相当复杂的过程,如果你不想自己经历复杂的编译过程,网上有一些编译好的可用的交叉编译工具链可以下载。

交叉编译介绍

?交叉编译就是在一个平台上生成另一个平台上的可执行代码。

?这里说的平台分别指的是主机平台Host和目标平台Target。

?就我们在ARM平台上移植Linux来说,Host是一台一般的PC机,它通过串口或网络接口与Target通信;Target是arm-linux平台(这里说的arm指的是平台所使用的CPU是ARM9处理器,linux指的是运行的操作系统是Linux)。

?我们在Host上开发程序,并在这个平台上运行交叉编译器Cross Complier,编译我们的程序,而由Cross Complier生成的程序将在Target上运行。

?目前常用的交叉开发环境主要有开放和商业两种类型。

–开放的交叉开发环境的典型代表是GNU工具链,目前已能够

支持x86、ARM、PowerPC等多种处理器。

–商业的交叉开发环境主要有Metrowerks CodeWarrior、ARM

Software Development Toolkit等。

常用在ARM平台的GNU Toolchain:

? arm-linux-gcc:交叉编译linux内核

? arm-elf-gcc:主要交叉编译uclinux内核

? arm-uclinux-gcc:交叉编译uclinux内核

主要下载网址(网址)?

下载下来之后的几种安装方式:

? sh脚本方式安装(.sh)

– sh arm-elf-tools-20030314.sh

? tar解压方式安装(.tar.gz)

– tar zxvf arm-linux-gcc-2.95.3.tar.gz

? rpm安装包方式安装(.rpm)

– rpm –ivh arm-linux-gcc-2.95.3-3.i386.rpm

– rpm –ivh arm-linux-binutils-2.12.1-1.i386.rpm

– rpm –ivh arm-linux-glibc-2.2.5-1.i386.rpm

?安装目录:/usr/local/bin/arm-elf-xxx

/usr/local/arm-linux/bin/arm-linux-xxx

/usr/local/arm-uclinux-tool/bin/arm-uclinux-xxx

为了在命令行中能够寻找到交叉编译器,我们需要把他所在的路径加入到PATH环境变量中(例:/usr/local/arm/bin:$PATH )。

交叉编译环境的组成:

? binutils工具包:包括连接器、汇编器以及其他用于目标文件和档案的工具,如as汇编器,ld连接器等。

? gcc工具包:工具链的主角,包括c编译器gcc、c++编译器g++等。

? glibc库:提供系统调用的基本函数的C库,比如,printf、open等。

? gdb调试工具:运行在target上的调试程序,通过串口和TCP/IP和主机连接,进行远距离调试。

需要交叉编译的原因:

?首先,在项目的起始阶段,目标平台尚未建立,因此需要做交叉编译,以生成我们所需要的Bootloader以及kernel(因为Bootloader和kernel的源码需要经过交叉编译后才可以在目标平台上运行);

?其次,当目标平台能启动之后,由于目标平台上资源的限制,当我们编译大型程序时,依然可能需要用到交叉编译。

因此,建立交叉编译环境是进行嵌入式软件开发的第一步。

下面我们将以建立针对arm的交叉编译开发环境为例来说明整个交叉编译器DIY的过程,其他的体系结构与这个相类似,只要作一些对应的改动。我的开发环境是,宿主机i386-ubuntu-8.04,目标机arm。

因为Linux内核版本多,不同的版本存在不同的bug,加之众多版本的工具链也存在不同的bug,这些bug针对不同的硬件(比如CPU类型等),需要多方测试,寻找合适的补丁程序。

我是从网上看到大家都按如下的这个过程进行(我也是这么做的):

1. 下载源文件、补丁和建立编译的目录

2. 建立内核头文件

3. 建立二进制工具(binutils)

4. 建立初始编译器(bootstrap gcc)

5. 建立c库(glibc)

6. 建立全套编译器(full gcc)

(一)下载源文件、补丁和建立编译的目录

1. 选定软件版本号

选择软件版本号时,先看看glibc源代码中的INSTALL文件。那里列举了该版本的glibc编译时所需的binutils 和gcc的版本号。例如在glibc-2.2.3/INSTALL 文件中推荐gcc 用2.95以上,binutils 用2.10.1 以上版本。

网上有推荐的如下比较稳定的而且出错比较少的几个版本组合如下,

以下是已选定的构建交叉编译环境的工具链版本:

– BINUTILS_VERSION=2.16

– GCC_VERSION=3.4.3

– GCCCORE_VERSION=3.4.3

– LINUX_VERSION=2.4.21

– GLIBC_VERSION=2.3.5

– GLIBCTHREADS_VERSION=2.3.5

我选的各个软件的版本也大致如此,其具体如下:

binutils-2.10.1(ftp://https://www.360docs.net/doc/8113240245.html,/gnu/binutils/)

gcc-2.95.3(ftp://https://www.360docs.net/doc/8113240245.html,/gnu/gcc/gcc-2.95.3)

glibc-2.2.3(ftp://https://www.360docs.net/doc/8113240245.html,/gnu/glibc)

glibc-linuxthreads-2.2.3(ftp://https://www.360docs.net/doc/8113240245.html,/gnu/glibc)

linux-2.4.21-rmk2(https://www.360docs.net/doc/8113240245.html,/pub/linux/arm/kernel/v2.4/)

linux-2.4.21.tar.gz(https://www.360docs.net/doc/8113240245.html,/pub/linux/kernel/v2.4/)

gcc patch下载:https://www.360docs.net/doc/8113240245.html,/

gcc-2.95.3.-2.patch

gcc-2.95.3.-no-fixinc.patch

gcc-2.95.3-returntype-fix.patc

如果你选的glibc的版本号低于2.2,你还要下载一个叫glibc-crypt的文件,例如glibc-crypt-2.1.tar.gz。Linux 内核你可以从https://www.360docs.net/doc/8113240245.html, 或它的镜像下载。

Binutils、gcc和glibc你可以从FSF的FTP站点ftp://https://www.360docs.net/doc/8113240245.html,/gnu/ 或它的镜像去下载。在编译glibc时,要用到Linux 内核中的include 目录的内核头文件。如果你发现有变量没有定义而导致编译失败,你就改变你的内核版本号。例如我开始用linux-2.4.25+vrs2,编译glibc-2.2.3 时报BUS_ISA 没定义,后来发现在2.4.23 开始它的名字被改为

CTL_BUS_ISA。如果你没有完全的把握保证你改的内核改完全了,就不要动内核,而是把你的Linux 内核的版本号降低或升高,来适应glibc。

Gcc 的版本号,推荐用gcc-2.95 以上的。太老的版本编译可能会出问题。Gcc-2.95.3 是一

个比较稳定的版本,也是内核开发人员推荐用的一个gcc 版本。

如果你发现无法编译过去,有可能是你选用的软件中有的加入了一些新的特性而其他所选软件不支持的原因,就相应降低该软件的版本号。例如我开始用gcc-3.3.2,发现编译不过,报as、ld 等版本太老,我就把gcc 降为2.95.3。太新的版本大多没经过大量的测试,建议不要选用。

(二)建立工作目录

首先,我们建立几个用来工作的目录:

在你的用户目录,我用的是用户tang,因此用户目录为/home/tang,先建立一个项目目录cross。

tang@tang-laptop:~$ pwd

/home/tang

tang@tang-laptop:~$ mkdir cross

再在这个项目目录cross 下建立三个目录build-tools、kernel 和tools。

build-tools-用来存放你下载的binutils、gcc 和glibc 的源代码和用来编译这些源代码的目录。

kernel-用来存放你的内核源代码和内核补丁。

tools-用来存放编译好的交叉编译工具和库文件。

tang@tang-laptop:~$ cd cross

tang@tang-laptop:~/cross$ mkdir build-tools kernel tools

执行完后目录结构如下:

tang@tang-laptop:~/cross$ ls ./

build-tools kernel tools

3. 输出和环境变量

我们输出如下的环境变量方便我们编译。

tang@tang-laptop:~/cross$ export PRJROOT=home/tang/cross

tang@tang-laptop:~/cross$ export TARGET=arm-linux

tang@tang-laptop:~/cross$ export PREFIX=$PRJROOT/tools

tang@tang-laptop:~/cross$ export TARGET_PREFIX=$PREFIX/$TARGET

tang@tang-laptop:~/cross$ export PATH=$PREFIX/bin:$PATH

如果你不惯用环境变量的,你可以直接用绝对或相对路径。我如果不用环境变量,一般都用绝对路径,相对路径有时会失败。环境变量也可以定义在.bashrc文件中,这样当你logout或换了控制台时,就不用老是export这些变量了。

体系结构和你的TAEGET变量的对应如下表

你可以在通过glibc下的config.sub脚本来知道,你的TARGET变量是否被支持,例如:

tang@tang-laptop:../glibc-2.2.3/scripts$ ./config.sub arm-linux

arm-unknown-linux-gnu

在我的环境中,config.sub 在glibc-2.2.3/scripts 目录下。

网上还有一些HOWTO 可以参考,ARM 体系结构的《The GNU Toolchain for ARM Target HOWTO》,PowerPC 体系结构的《Linux for PowerPC Embedded Systems HOWTO》等。对TARGET的选取可能有帮助。

4. 建立编译目录

为了把源码和编译时生成的文件分开,一般的编译工作不在的源码目录中,要另建一个目录来专门用于编译。用以下的命令来建立编译你下载的binutils、gcc和glibc的源代码的目录。

root@tang-laptop:/home/tang/cross/build-tools# cd $PRJROOT/build-tools

root@tang-laptop:/home/tang/cross/build-tools# mkdir build-binutils build-boot-gcc build-gcc build-glibc gcc-patch

build-binutils-编译binutils的目录

build-boot-gcc-编译gcc 启动部分的目录

build-glibc-编译glibc的目录

build-gcc-编译gcc 全部的目录

gcc-patch-放gcc的补丁的目录

gcc-2.95.3 的补丁有gcc-2.95.3-2.patch、gcc-2.95.3-no-fixinc.patch 和gcc-2.95.3-returntype-fix.patch,可以从https://www.360docs.net/doc/8113240245.html,/下载到这些补丁。

再将你下载的binutils-2.10.1、gcc-2.95.3、glibc-2.2.3 和glibc-linuxthreads-2.2.3 的源代码放入build-tools 目录中

看一下你的build-tools 目录,有以下内容:

root@tang-laptop:/home/tang/cross/build-tools# ls

binutils-2.10.1.tar.gz build-gcc gcc-patch

build-binutils build-glibc glibc-2.2.3.tar.gz

build-boot-gcc gcc-2.95.3.tar.gz glibc-linuxthreads-2.2.3.tar.gz

建立内核头文件

把你从https://www.360docs.net/doc/8113240245.html,下载的内核源代码放入$PRJROOT /kernel 目录

进入你的kernel 目录:

root@tang-laptop:/home/tang/cross/build-tools# cd $PRJROOT/kernel

解开内核源代码

tar -zxvf linux-2.4.21.tar.gz

或者

root@tang-laptop:/home/tang/cross/kernel# tar -jxvf linux-2.4.21.tar.bz2

小于2.4.19 的内核版本解开会生成一个linux 目录,没带版本号,就将其改名。root@tang-laptop:/home/tang/cross/kernel# dir

linux-2.4.21 linux-2.4.21.tar.bz2

给Linux 内核打上你的补丁

root@tang-laptop:/home/tang/cross/kernel# cd linux-2.4.21

root@tang-laptop:/home/tang/cross/kernel/linux-2.4.21# patch -p1 < ../patch-2.4.21-rmk2

编译内核生成头文件

root@tang-laptop:/home/tang/cross/kernel/linux-2.4.21# make ARCH-arm

CROSS_COMPILE=arm-linux- menconfig

这时候出现了一个问题:感觉很头疼,于是上新立得软件管理器搜所谓的Ncurses,搜到了之后,准备安装的时候又出现了一个问题。大概意思是说,ncurses依赖的文件版本是5.5但是要安装的是5.6故不能安装。

错误描述:

make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig

No architecture defined. You may want to use a pre-packaged config. make a5k_config, ebsa110_config, footbridge_config, etc.

No architecture defined. You may want to use a pre-packaged config. make a5k_config, ebsa110_config, footbridge_config, etc.

rm -f include/asm

( cd include ; ln -sf asm-arm asm)

make -C scripts/lxdialog all

make[1]: Entering directory `/home/tang/cross_cmp/kernel/linux-2.4.21/scripts/lxdialog'

/usr/bin/ld: cannot find -lncurses

collect2: ld returned 1 exit status

-e

>> Unable to find the Ncurses libraries.

>>

>> You must have Ncurses installed in order

>> to use 'make menuconfig'

make[1]: *** [ncurses] Error 1

make[1]: Leaving directory `/home/tang/cross_cmp/kernel/linux-2.4.21/scripts/lxdialog' make: *** [menuconfig] Error 2

Ncurses的作用:提供字符终端处理库,包括面板和菜单。进行如下的几步进行安装。

解决办法:

(1)于是直接上网搜5.5的tar包直接安装。

下载地址:(https://www.360docs.net/doc/8113240245.html,/source/etch/ncurses)

(2)、安装ncurses

ncurses是字符终端下屏幕控制的基本库。可能很多新开发的程序都不使用了,不过如果要编译一些老程序,还经常遇得到。

安装:

https://www.360docs.net/doc/8113240245.html,/pub/gnu/ncurses/

./configure --without-debug #以及其它自己需要的参数

make

make install

(3),继续你的make menuconfig。

图形界面出来

解决完事之后你就可以用下一步了。

这里用的是menuconfig,其实你也可以用config 和xconfig 来代替menuconfig,但这样用可能会没有设置某些配置文件选项和没有生成下面编译所需的头文件。推荐大家用make menuconfig,这也是内核开发人员用的最多的配置方法。配置完退出并保存,检查一下的内核目录中的include/linux/version.h 和include/linux/autoconf.h 文件是不是生成了,这是编译glibc 是要用到的,version.h 和autoconf.h 文件的存在,也说明了你生成了正确的头文件。

还要建立几个正确的链接:

root@tang-laptop:/home/tang/cross/kernel/linux-2.4.21# cd include/root@tang-

laptop:/home/tang/cross/kernel/linux-2.4.21/include# ln -s asm-arm asmroot@tang-laptop:/home/tang/cross/kernel/linux-2.4.21/include# cd asmroot@tang-

laptop:/home/tang/cross/kernel/linux-2.4.21/include/asm# ln -s arch-epxa archroot@tang-laptop:/home/tang/cross/kernel/linux-2.4.21/include/asm# ln -s proc-armv proc

接下来为你的交叉编译环境建立你的内核头文件的链接:

root@tang-laptop:/home/tang/cross/kernel/linux-2.4.21/include/asm# mkdir -p $TARGET_PREFIX/include

root@tang-laptop:/home/tang/cross/kernel/linux-2.4.21/include/asm# ln -s

$PRJROOT/kernel/linux-2.4.21/include/linux $TARGET_PREFIX/include/linux

root@tang-laptop:/home/tang/cross/kernel/linux-2.4.21/include/asm# ln -s

$PRJROOT/kernel/linux-2.4.21/include/asm-arm $TARGET_PREFIX/include/asm

也可以把Linux 内核头文件拷贝过来用(推荐使用这种方法,前面的ln文件路径写不正确的话,则有可能会出问题。)

root@tang-laptop:/home/tang/cross/kernel/linux-2.4.21/include/asm# mkdir -p $TARGET_PREFIX/include

root@tang-laptop:/home/tang/cross/kernel/linux-2.4.21/include/asm# cp -r

/home/tang/cross/kernel/linux-2.4.21/include/asm $TARGET_PREFIX/include

root@tang-laptop:/home/tang/cross/kernel/linux-2.4.21/include/asm#cp -r

$PRJROOT/kernel/linux-2.4.21/include/linux $TARGET_PREFIX/include

(三)建立二进制工具(binutils)

binutils是一些二进制工具的集合,其中包含了我们常用到的as和ld。

首先,我们解压我们下载的binutils源文件。

$cd $PRJROOT/build-tools$tar -xvjf binutils-2.10.1.tar.bz2

然后进入build-binutils目录配置和编译binutils。

$cd build-binutils$../binutils-2.10.1/configure --target=$TARGET --prefix=$PREFIX

--target 选项是指出我们生成的是arm-linux 的工具,--prefix 是指出我们可执行文件安装的位置。

会出现很多check,最后产生Makefile 文件。

配置要完成的时候,最后会显示如下两句话。

creating ./config.status

creating Makefile

有了Makefile 后,我们来编译并安装binutils,命令很简单。

$make$make install

看一下我们$PREFIX/bin 下的生成的文件

root@tang-laptop:/home/tang/cross/build-tools/build-binutils# ls $PREFIX/bin arm-linux-addr2line arm-linux-gasp arm-linux-objdump arm-linux-strings

arm-linux-ar arm-linux-ld arm-linux-ranlib arm-linux-strip

arm-linux-as arm-linux-nm arm-linux-readelf

arm-linux-c++filt arm-linux-objcopy arm-linux-size

我们来解释一下上面生成的可执行文件都是用来干什么的

add2line - 将你要找的地址转成文件和行号,它要使用debug 信息。

Ar-产生、修改和解开一个存档文件

As-gnu 的汇编器

C++filt-C++ 和java 中有一种重载函数,所用的重载函数最后会被编译转化成汇编的标号,c++filt 就是实现这种反向的转化,根据标号得到函数名。

Gasp-gnu 汇编器预编译器。

Ld-gnu 的连接器

Nm-列出目标文件的符号和对应的地址

Objcopy-将某种格式的目标文件转化成另外格式的目标文件

Objdump-显示目标文件的信息

Ranlib-为一个存档文件产生一个索引,并将这个索引存入存档文件中

Readelf-显示elf 格式的目标文件的信息

Size-显示目标文件各个节的大小和目标文件的大小

Strings-打印出目标文件中可以打印的字符串,有个默认的长度,为4

Strip-剥掉目标文件的所有的符号信息

(四)建立初始编译器(bootstrap gcc)

首先进入build-tools 目录,将下载gcc 源代码解压

root@tang-laptop:/home/tang/cross/build-tools/build-binutils# cd $PRJROOT/build-tools root@tang-laptop:/home/tang/cross/build-tools# tar -zxvf gcc-2.95.3.tar.gz

然后进入gcc-2.95.3 目录给gcc 打上补丁

$cd gcc-2.95.3$patch -p1< ../gcc-patch/gcc-2.95.3.-2.patch$patch -p1< ../gcc-patch/gcc-2.95.3.-no-fixinc.patch$patch -p1< ../gcc-patch/gcc-2.95.3-returntype-fix.patchecho timestamp > gcc/cstamp-h.in

在我们编译并安装gcc 前,我们先要改一个文件$PRJROOT/gcc/config/arm/t-linux,把TARGET_LIBGCC2-CFLAGS = -fomit-frame-pointer -fPIC这一行改为TARGET_LIBGCC2-CFLAGS = -fomit-frame-pointer -fPIC -Dinhibit_libc -D__gthr_posix_h

你如果没定义-Dinhibit,编译时将会报如下的错误

../../gcc-2.95.3/gcc/libgcc2.c:41: stdlib.h: No such file or directory../../gcc-

2.95.3/gcc/libgcc2.c:42: unistd.h: No such file or directorymake[3]: *** [libgcc2.a] Error

1make[2]: *** [stmp-multilib-sub] Error 2make[1]: *** [stmp-multilib] Error 1make: *** [all-gcc]

Ubuntu8.04下的ARM交叉编译工具链(arm-linux-)详细介绍.

原文链接与:https://www.360docs.net/doc/8113240245.html,/u1/58901/showart_1335004.html 实验室的机器配置太低,速度太慢实在是受不了。说是已经升级了,内存从128M升级到了256M。My god!这年头还能到什么地方找那么多128的内存条去阿?哇嘎嘎。真是服了。。。哈哈 打开一个pdf文件要等老半天。基本上没有办法工作。于是想在自己的笔记本上做一个交叉编译环境。我的机器配置也不高,但是相对于实验室的机器来说已经相当不错了。我的机器是单操作系统:只有Ubuntu8.0.4。感觉和windows XP差不多。XP下有的东西,ubuntu下基本上也有。 ps:昨天是我的生日。昨天上午有课,一下午还有今天上午就是在交叉编译的过程中度过的。感觉整个过程挺考验耐心的。下面进入正题。 待续。。。最近两天内补充完整。 ************************************************************************************* 在进行嵌入式在进行嵌入式开发之前,首先要建立一个交叉编译环境,这是一套编译器、连接器和libc库等组成的开发环境。本文结合自己做嵌入式交叉编译开发工作的经验,同时结合自己的体会,做了一个介绍 随着消费类电子产品的大量开发和应用和Linux操作系统的不断健壮和强大,嵌入式系统越来越多的进入人们的生活之中,应用范围越来越广。 在裁减和定制Linux,运用于你的嵌入式系统之前,由于一般嵌入式开发系统存储大小有限,通常你都要在你的强大的pc机上建立一个用于目标机的交叉编译环境。这是一个由编译器、连接器和解释器组成的综合开发环境。交叉编译工具主要由binutils、gcc 和glibc 几个部分组成。有时出于减小libc 库大小的考虑,你也可以用别的c 库来代替glibc,例如uClibc、

Arm linux交叉编译

1、编译C++程序,链接是需要添加 -lstdc++ g++和gcc本质一样的,本质上还是gcc,我们实验室所有的c++程序都是用gcc编译的,一般的程序用gcc足够了。对于C++ 程序,编译的时候用gcc 或者g++ 都可以。但是在进行连接的时候最好用g++,因为用g++ 会自动进行C++ 标准库的连接;用gcc 连接C++ 程序也可以,但是需要人为指定连接C++ 标准库,否则就会出现 undefined reference to `__gxx_personality_v/0' 之类的错误。可见-lstdc++ 所对应的是标准C++库。 2、linux OpenCV 静态链接错误,链接是需要添加–ldl undefined reference to `dlopen' undefined reference to `dlerror' undefined reference to `dlsym' 对dlopen, dlerror, dlsym 未定义的引用,缺少链接库,链接时加上选项-ldl 3、对icvPuts, icvGets, gzputs, gzgets, gzopen, gzclose 未定义的引用,编译错误如下 ./obj/local/armeabi-v7a/libopencv_core.a(persistence.cpp.o): In function `icvPuts(CvFileStorage*, char const*)':persistence.cpp:(.text._ZL7icvPutsP13CvFileStoragePKc+0x20): undefined reference to `gzputs'./obj/local/armeabi-v7a/libopencv_core.a(persistence.cpp.o): In function `icvGets(CvFileStorage*, char*, int)':persistence.cpp:(.text._ZL7icvGetsP13CvFileStoragePci+0x26): undefined reference to `gzgets'./obj/local/armeabi-v7a/libopencv_core.a(persistence.cpp.o): In function 缺少zlib库引起的,编译链接时加上-lz 4、如何在configure时,将编译参数传入,改变默认的编译器gcc成arm-linux编译器 按照INSTALL中的介绍,也是常用的方法,在configure的时候,加上–host=arm-linux,结果没有实现我们要的效果,没有将编译器从默认的gcc改成arm-linux-gcc,编译器还是用的默认的gcc。 参数传递必须像CFLAGS=-O2 ./configure一样,将参数设置放在configure的前面: CC=arm-linux-gcc ./configure才能识别的。(如果CC参数放在configure后面:./configure CC=arm-linux-gcc 则不能识别。) –prefix=/usr/crifan/lrzsz,表示具体安装到哪里 完整的配置: CFLAGS=-O2 CC=arm-linux-gcc ./configure–cache-file=cache_file_0 –prefix=/usr/crifan/lrzsz 5、zlib的交叉编译 交叉编译zlib-1.2.3.tar.bz2:

交叉编译几种常见的报错

交叉编译几种常见的报错 由于是第一次交叉编译,不知道会出现什么问题,思路就是先把gcc和ld都改成arm的,然后遇到什么问题在解决什么问题,以下过程都是在这个思路下进行。 1.指定arm的编译器和连接器: 只是把gcc改为arm-none-linux-gnueabi-gcc,ld改为arm-none-linux-gnueabi-ld,其他的都没有 修改。出现以下错误: arm-none-linux-gnueabi-ld: warning: library search path "/usr/local/lib" is unsafe for cross-compilation arm-none-linux-gnueabi-ld: skipping incompatible /usr/local/lib/libfreetype.so when searching for -lfreetype arm-none-linux-gnueabi-ld: skipping incompatible /usr/local/lib/libfreetype.a when searching for -lfreetype arm-none-linux-gnueabi-ld: cannot find -lfreetype 分析原因是:链接的这些库文件都是在PC编译器下编译出来的,现在把它们和用arm-none-linux-gnueabi-gcc编译出来的文件做链接,当然会出错。 解决方法:这些库重新用arm-gcc重新编译生成相应的库。 下面使用是重新编译库文件的过程: 重新编译freetype 根据交叉编译的文档,我创建了一个文件夹/usr/local/arm-linux来存放编译后的库文件。执行: ./configure –host=arm-none-linux-gnueabi –prefix=/usr/local/arm-linux 注意:host的参数应该是交叉编译环境的前缀。 另外,freetype自动生成的include文件夹有点小问题,编译完成后的include目录结构是 /include/ft2build.h和

交叉编译器简介

交叉编译器 在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。 有时是因为目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。 交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。我们常用的计算机软件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比如C代码)编译(compile)成计算机可以识别和执行的二进制代码。比如,我们在Windows平台上,可使用Visual C++开发环境,编写程序并编译成可执行程序。这种方式下,我们使用PC平台上的Windows 工具开发针对Windows本身的可执行程序,这种编译过程称为native compilation,中文可理解为本机编译。然而,在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的ARM 平台,其一般的静态存储空间大概是16到32MB,而CPU的主频大概在100MHz到500MHz之间。这种情况下,在ARM平台上进行本机编译就不太可能了,这是因为一般的编译工具链(compilation tool chain)需要很大的存储空间,并需要很强的CPU运算能力。为了解决这个问题,交叉编译工具就应运而生了。通过交叉编译工具,我们就可以在CPU能力很强、存储控件足够的主机平台上(比如PC上)编译出针对其他平台的可执行程序。 要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。常见的交叉编译例子如下: 1、在Windows PC上,利用ADS(ARM 开发环境),使用armcc编译器,则可编译出针对ARM CPU的可执行代码。 2、在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码。

Vmware安装Ubuntu及交叉编译器

在虚拟机下Linux(Ubuntu)的安装 1.创建新的虚拟机 2.点击自定义 3、选Workstation版本的兼容性,然后点击下一步

4、选择稍后安装操作系统,然后下一步。 也可以选择第二项“安装程序光盘映像文件ISO”,之后会VMware会自动得知你的iso是Linux(Ubuntu),只要求你输入全名,和用户名密码等简单的用户设定,这是一个简单安装,可以跳过下面的步骤。我觉得是因为这个OS的自动安装,不完全,导致一些核心命令无法使用、无反应等一些问题。所以有更高要求,不能选这项,需要完全、自定义的安装。 5、客户机操作系统选择Linux,版本选择Ubuntu 64位,然后下一步。

6、设置虚拟机名称(即每次启动VMware左上方显示的名字),之后选择你想的在WINDOWS操作系统里的安装路径(默认在C 盘,很不方便,不要安装在C盘)。 7、设置虚拟机处理器数量,选择处理器数量为2(看情况而定,我是i7处理器,配置较好无压力的,感觉双核比单核好一些)

8、.内存大小选择,使用自动推荐的1G内存(本机内存8G)。 9、网络类型选择,本次选择默认的“NAT”

注:使用“NAT”的话,需要外面的WIN7使用一根线连接上网,才能在Ubuntu里上网(如同Ubuntu是你的真正OS的感觉,不需要手工配置任何IP信息),不能默认使用无线连接。这点对有些笔记本同学可能会造成麻烦。当然不是说不能通过手动配置IP相关解决,但是为了避免每次都配置的麻烦,请直接使用“bridged”桥接手动配置。 9. 默认即可,直接“下一步”

10、选择“将虚拟磁盘存储为单个文件” 11.虚拟机文件的存放地址,点击“下一步”即可 12、点击“完成”

ARM、linux常用服务器+交叉编译工具链

ARM、linux常用服务器+交叉编译工具链 1. tftp服务器在安装linux时通常可供选择是否安装tftp服务器 启动后可通过在控制终端输入netstat -a|grep tftp查看是否已经安装若已安装则为如下打印信息: [root@localhost /]# netstat -a|grep tftp 若没有安装则可使用 –ivh tftp-server-0.42-3.1.i386.rpm 进行安装然后建立主要工作目录mkdir /tftpboot 接下来配置tftp服务器 /etc/init.d/tftp # default: off # description: The tftp server serves files using the trivial file transfer \par # protocol. The tftp protocol is often used to boot diskless \par # workstations, download configuration files to network-aware printers, \par # and to start the installation process for some operating systems. tftp _type = dgram

= udp = yes = root = /usr/sbin/in.tftpd _args =-s /tftpboot = no _source = 11 = 100 2 = IPv4 注意修改server_args = -s /tftpboot为你tftp工作目录。 接下来便是重启tftp 服务器了/etc/init.d/xinetd restart打印出如下信息[root@localhost /]# /etc/init.d/xinetd restart xinetd: [ OK ] xinetd: [ OK ] 表示重启成功接下来便可查看是否已经安装成功 [root@localhost /]# netstat -a|grep tftp

嵌入式Linux开发交叉编译器的安装

实验三嵌入式Linux开发交叉编译器的安装 班级:B08511 姓名:张媛媛学号:20084051112 成绩: 一、实验目的 安装ARM平台下的嵌入式Linux开发的交叉编译器arm-linux-gcc,编译简单的程序并通过NFS方式运行于开发板上,比较与gcc生成的可执行文件的不同; 二、实验设备 硬件:PC机开发板 三、实验原理 嵌入式系统的交叉开发环境一般包括交叉编译器、交叉调试器和系统仿真器,其中交叉编译器用于在宿主机上生成能在目标机上运行的代码,而交叉调试器和系统仿真器则用于在宿主机与目标机间完成嵌入式软件的调试。在采用宿主机/目标机模式开发嵌入式应用软件时,首先利用宿主机上丰富的资源和良好的开发环境开发和仿真调试目标机上的软件,然后通过串口或者用网络将交叉编译生成的目标代码传输并装载到目标机上,并在监控程序或者操作系统的支持下利用交叉调试器进行分析和调试,最后目标机在特定环境下脱离宿主机单独运行。 本次实验涉及到的是嵌入式Linux开发的交叉编译器arm-linux-gcc,从体系结构角度来讲,借助其编译生成的程序是由ARM平台下机器指令构成的可执行程序。 四、实验内容 (1)arm-linux-gcc-3.4.1.tgz为编译器的文件压缩包(实验室机器中位于windows系统的“c:\嵌入式Linux实验\Tools”),为3.4.1版本的交叉编译工具,用来编译常用的一些代码;可通过虚拟机与Windows系统的共享文件夹将其拷贝到Linux系统中; 安装命令:tar xvfz arm-linux-gcc-3.4.1.tgz –C / (2)设置环境变量 可以在/etc/bash.bashrc文件中加入: export PATH=$PATH:/usr/local/arm/3.4.1/bin 就可以直接使用arm-linux-gcc的一些命令; (3)查看arm-linux-gcc编译器版本 输入arm-linux-gcc –v可查看编译器版本,如图3-1: 图3-1 编译器版本

交叉编译工具链的安装配置

交叉工具链的生成 https://www.360docs.net/doc/8113240245.html,/uid-9185047-id-3158569.html 软件平台:ubuntu 10.10 主机编译器:gcc 4.5.1 硬件平台:s3c2410 1、准备环境 sudo apt-get install bison flex texinfo automake libtool cvs patch libncurses5-dev aria2 curl g++ subversion gawk cvsd expat gperf libexpat-dev 注:有的没安装,第4步无法生成makefile,要先安装gperf 2、下载crosstool-ng软件包 crosstool-ng-1.17.0.tar.bz2 3、相应目录的建立 sudo mkdir -p /usr/local/arm sudo chmod 777 /usr/local/arm // 将arm目录权限设置为777 cd /usr/local/arm mkdir 4.7.2 sudo mkdir -p /home/crosstool cd /home/s3c2410/crosstool sudo mkdir crosstool-build crosstool-install src-4.7.2 (编译目录、安装目录、目标源码目录) 4、安装crosstool-ng cp crosstool-ng-1.17.0.tar.bz2 /home/s3c2410/crosstool/ 解压crosstool-ng-1.17.0.tar.bz2, tar -xvf crosstool-ng-1.17.0.tar.bz2 进入目录,进行配置: cd /home/s3c2410/crosstool/crosstool-ng-1.17.0 将/home/s3c2410/crosstool/crosstool-install/lib/ct-ng.1.17.0/下的https://www.360docs.net/doc/8113240245.html,p cp到/etc/bash_completion.d 配置安装目录为/home/s3c2410/crosstool/crosstool-install 注:有的没安装gperf,无法生成makefile,要先安装gperf sudo ./configure --prefix=/home/crosstool/crosstool-install sudo make --编译 sudo make install --安装

了解Linux安装ARM交叉编译器的步骤

了解Linux安装ARM交叉编译器的步骤 安装交叉编译环境 gcc是linux环境下的asm和c语言编译器,生成的是可以在x86平台上运行的可执行程序;而在开发板上运行的程序则需要arm平台专用的编译器,也称为交叉编译器; 交叉编译器可以由开发人员手工定制,也可用使用别人已经编译好的,比如arm-linux-gcc; (1)安装交叉编译器 ---------------------- $>cd /home/zhang/tools/ $>tar xzvf crosstools-451.tar.gz -C /usr/local/ $>cd /usr/local $>ls 可以看到一个子目录toolschain/,该目录下存放了用于arm平台的交叉编译器和其他工具。arm-linux-gcc等可执行程序位于bin子目录下。 (2)环境变量的设置 ---------------------- 如果希望在控制台中直接运行arm-linux-gcc,则必须把arm-linux-gcc所在的路径记录到控制台的默认环境变量PATH中,这需要修改某些配置文件。 如果使用root用户,则可以修改如下文件: $>vim ~/.bashrc 在文件的最后加入以下内容: export PATH=/usr/local/toolschain/4.5.1/bin:$PATH //写入/etc/profile或/etc/bashrc也可 退出vim后,使新的环境变量生效: $>source ~/.bashrc 可以用如下命令验证是否可直接运行交叉编译器: $>which arm-linux-gcc 如显示/usr/local/toolschain/4.5.1/bin/arm-linux-gcc则说明环境变量配置好;

ARM、linux常用服务器+交叉编译工具链

1.tftp服务器在安装linux时通常可供选择是否安装tftp服务器 启动后可通过在控制终端输入netstat -a|grep tftp查看是否已经安装若已安装则为如下打印信息: [root@localhost /]# netstat -a|grep tftp udp 0 0 *:tftp *:* 若没有安装则可使用 rpm –ivh tftp-server-0.42-3.1.i386.rpm 进行安装然后建立主要工作目录mkdir /tftpboot 接下来配置tftp服务器 vim /etc/init.d/tftp # default: off # description: The tftp server serves files using the trivial file transfer \ # protocol. The tftp protocol is often used to boot diskless \ # workstations, download configuration files to network-aware printers, \ # and to start the installation process for some operating systems. service tftp { socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /tftpboot disable = no per_source = 11 cps = 100 2 flags = IPv4 } 注意修改server_args = -s /tftpboot为你tftp工作目录。 接下来便是重启tftp 服务器了/etc/init.d/xinetd restart打印出如下信息 [root@localhost /]# /etc/init.d/xinetd restart Stopping xinetd: [ OK ] Starting xinetd: [ OK ] 表示重启成功接下来便可查看是否已经安装成功 [root@localhost /]# netstat -a|grep tftp udp 0 0 *:tftp *:* 2.nfs服务器 首先查看nfs服务器是否被安装(这里为red-had5)rpm –q nfs-utils若打印出如下信息则表示已经被安装 [root@localhost ~]# rpm -q nfs-utils nfs-utils-1.0.9-24.el5 若没有安装nfs服务器则先下载相应的nfs服务器包百度一个即可 然后rpm –ivh nfs- utils-1.0.9-24.el5.i386.rpm这里使用的nfs版本为utils-1.0.9-24.el5故不同版本安装不同,然后进入nfs配置

交叉编译mtd-utils工具(linux下flash工具)

一、下载源码包并解压 wget ftp://https://www.360docs.net/doc/8113240245.html,/pub/mtd‐utils/mtd‐utils‐1.5.1.tar.bz2 wget https://www.360docs.net/doc/8113240245.html,/zlib‐1.2.8.tar.gz wget https://www.360docs.net/doc/8113240245.html,/opensource/lzo/download/lzo‐2.03.tar.gz wget https://https://www.360docs.net/doc/8113240245.html,/pub/linux/utils/util‐linux/v2.21/util‐linux‐2.21.1.tar.gz tar zxvf zlib‐1.2.8.tar.gz tar zxvf lzo‐2.03.tar.gz tar jxvf mtd‐utils‐1.5.1.tar.bz2 tar zxvf util‐linux‐2.21.1.tar.gz 二、编译安装zlib 1) cd zlib‐1.2.8 CC=arm‐none‐linux‐gnueabi‐gcc ./configure ‐‐prefix= /usr/local/arm‐2007q1/arm‐none‐linux‐gnueabi ‐‐shared (注意:这里的/usr/local/arm‐2007q1/arm‐none‐linux‐gnueabi是交叉编译工具默认目录。) 2) make make install cd .. 3) 安装完成后会在/usr/local/arm‐2007q1/arm‐none‐linux‐gnueabi /目录下生成三个目录:include、lib、share。 安装完后检查一下目录/usr/local/arm‐2007q1/zlib/ 假如 include 中没有 zlib.h 之类的头文件,lib 中没有 libz.so.1.2.3 ,那就自己手动拷到这些目录下去,记着拷的时候把所有的 *.h 都需要拷过去,在拷库的时候用 cp ‐Ca libz.* /…./lib 就行,要用上 ‐Ca 选项。 三、编译安装lzo 1) cd lzo‐2.03/ CC=arm‐none‐linux‐gnueabi‐gcc ./configure ‐‐host=arm‐none‐linux‐gnueabi ‐‐prefix=/usr/local/arm‐2007q1/arm‐none‐linux‐gnueabi

交叉编译环境搭建

交叉编译环境搭建 一、Emdebian介绍 Emdebian vision In the Emdebian vision someone wishing to build a GNU / Linux based device would: 1. Port the linux kernel to their hardware (including writing any specific device drivers). 2. Select the prebuilt emdebian packages needed to support their application. 3. Package their application as Debian package(s) using Debian and Emdebian tools. 4. Build a root filesystem using Emdebian tools from the steps above. Emdebian is involved in steps 2,3,4 above (there are far too many embedded device hardware variations to make prebuilt kernels practical). Thus EmDebian is a binary distribution for embedded devices (whereas most of the other contenders in this space are source distributions [of course being Debian and open source the source code is still available if required]. What emdebian does In short, what EmDebian does is wrap around the regular debian package building tools to provide a more fine grained control over package selection, size, dependencies and content to enable creation of very small and efficient debian packages for use on naturally resource limited embedded targets. 二、搭建GCC编译开发环境 安装G++/GCC编译环境 sudo apt-get install gcc g++ make gdb

交叉开发环境搭建(交叉编译器安装)

课堂实验5 交叉开发环境搭建 -交叉编译器安装【实验目的】 掌握交叉编译器安装方法。 【实验要求】 完成交叉编译器的安装及使用。 【实验预习】 1 交叉编译器介绍 在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码,而这种工具就是交叉编译器(cross compiler)。 2 搭建交叉编译环境 (1)实验环境 交叉编译工具:arm-linux- 3.4.6 编译平台:Redhat Enterprise 4 (2)安装arm-linux-gcc交叉编译器的方法 a 获得交叉编译器包,例如arm-linux-gcc-3.4.1.tar.bz2(里面有arm-linux-gcc命令)。 b 解压后修改环境变量配置文件/etc/profile,添加上arm-linux-gcc命令的路径。 c执行source /etc/profile使新配置生效。 (3)环境变量配置文件说明 /etc/profile,/etc/bashrc 是系统全局环境变量设定文件。 ~/.bashrc,~/.bashrc用户目录下的私有环境变量设定文件(~是root目录)。 如想将一个路径加入到环境变量$PATH中(以便在任何目录下都可以访问到该路径中的命令),可以像下面这样做: 方法1. 控制台中:使用export命令增加环境变量: 例如:# export PA TH=$PA TH:/usr/local/arm/2.95.3/bin 例如:# PATH="$PA TH:/my_new_path" (关闭shell,会还原PATH) 方法2. 修改profile文件:

制作arm-linux交叉编译工具ForXscaleBig-Endian.

制作arm-linux交叉编译工具 ForXscaleBig-Endian 制作arm-linux交叉编译工具ForXscaleBig-Endian 类别:消费电子 HOWTO build arm-linux toolchain for ARM/XSCALE---------------------------------------------- These instructions document how to build an arm-linux tool chainthat contains big-endian target libraries. 1. Packages used: binutils-2.14.tar.gzgcc- 3.3.2.tar.gzglibc-2.2.5.tar.gzglibc-linuxthreads-2.2.5.tar.gz 2. binutils-2.14 tar xvzf binutils-2.1 4.tar.gzcd binutils-2.14mkdir xscale_linux_becd xscale_linux_be../configure --target=armbe-linux --prefix=/opt/xscale_linux_be --with-lib- path=/opt/xscale_linux_be/armbe-linux/lib --program- prefix=xscale_linux_be- makemake installchmod 777 /opt/xscale_linux_be 3. gcc-3.3.2 -- bootstrap gcc tar xvzf gcc- 3.3.2.tar.gzcd gcc-3.3.2cp $(ATTACHED t-linux file) gcc/config/arm/perl -pi -e 's/GCC_FOR_TARGET = \$\$r\/gcc\/xgcc /GCC_FOR_TARGET = \$\$r\/gcc\/xgcc -mbig-endian /g' Makefile.incd gccperl -pi -e 's/GCC_FOR_TARGET = \.\/xgcc /GCC_FOR_TARGET = \.\/xgcc -mbig-endian /g' Makefile.incd config/armperl -pi -e 's/^# MULTILIB_OPTIONS = mlittle-endian\/mbig-endian/MULTILIB_OPTIONS += mlittle-endian\/mbig-endian/' t-arm-elfperl -pi -e 's/^# MULTILIB_DIRNAMES = le be/MULTILIB_DIRNAMES += le be/' t-arm-elfperl -pi -e 's/^# MULTILIB_MATCHES = mbig-endian=mbe mlittle- endian=ml/MULTILIB_MATCHES += mbig-endian=mbe mlittle-endian=ml/' t-arm-elf export PATH=/opt/xscale_linux_be/bin:/opt/xscale_linux_be/armbe- linux/include:$PATH mkdir xscale_linux_becd xscale_linux_be../configure --program-prefix=xscale_linux_be- --prefix=/opt/xscale_linux_be --target=armbe-linux --disable-shared --disable-threads --with- headers=/home/john_ho/ixp422/src/snapgear/linux-2.4.x/include --with-gnu-as --with-gnu-ld --enable-multilib --enable-languages=cperl -pi -e 's/^program_transform_cross_name = s \^ \$\(target-alias\)- /program_transform_cross_name = s \^ xscale_linux_be- /g' gcc/Makefilemakemake install 4. glibc-2.2.5 (big-endian) tar xvzf glibc-2.2.5.tar.gzcd glibc-2.2.5tar xvzf glibc-linuxthreads- 2.2.5.tar.gz perl -pi -e

arm-linux-gcc交叉工具链的安装和使用

arm-linux-gcc交叉工具链的安装和使用 分类:linux内核工具使用2013-01-18 01:01 2295人阅读评论(0) 收藏举报 1、安装arm-linux-gcc交叉工具链 [root@localhost Denny]# ls arm-linux-gcc-4.3.2.tgz Desktop gcc kernel modules shell实 验 smb.conf tftp安装包 wireshark软件包 at_remind.c file gdb makefiles samba安装 包 smb test wireless [root@localhost Denny]# tar zxvf arm-linux-gcc-4.3.2.tgz-C / // -C 参数指的是解压到根目录下面 [root@localhost /]# cd /usr/local/ [root@localhost local]# ls arm bin etc games include lib libexec sbin share src [root@localhost local]# cd arm/4.3.2/ arm-none-linux-gnueabi/ bin/ lib/ libexec/ share/ [root@localhost local]# cd arm/4.3.2/bin/ // 安装 在 /usr/local/arm/4.3.2/bin/ 的“bin”目录下面 [root@localhost bin]# [root@localhost bin]# /usr/local/arm/4.3.2/bin/arm-linux-gcc // arm-linux-gcc 使用方法1:跟上“全路径” [[root@localhost bin]# echo $PATH /usr/lib/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bi n:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin [root@localhost bin]# export $PATH

实验1 交叉编译工具链建立实验

实验1交叉编译工具链建立实验 1.1实验目的 ?熟悉Linux操作系统; ?掌握交叉编译工具链的建立过程; ?掌握通过gdb调试程序的方法; ?掌握makefile文件的写法。 1.2实验设备 ?硬件:PC机; ?软件:Windows操作系统、VMware虚拟机和Linux操作系统,或直接安装于硬盘的Linux操作系统,arm-linux-gcc安装文件。 1.3实验内容 ?安装Linux操作系统; ?建立交叉编译工具链; ?编写解决八皇后问题的程序。 1.4实验原理 1.4.1交叉编译工具链的简介 交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程式,例如我们试验中在Linux平台上编译出能运行在ARM为内核的CPU平台上的程式,编译得到的可执行文件是不能在Linux环境下运行的,必须放到ARM平台上才能运行。这种方法在异平台移植和嵌入式研发时非常有用的。 交叉编译工具链是由编译器、连接器和解释器组成的综合研发环境,交叉编译工具链主要由binutils、gcc和glibc三个部分组成。有时出于减小libc库大小的考虑,也能用别的C库来代替glibc,例如uClibc、dietlibc和newlib。 1.4.2交叉编译工具链部分组件的介绍 GCC属于GUN工具链中的编译开发工具,它可以把源程序编译为可执行文件。GCC是支持支持Ada语言、C++语言、Java语言、Objective C语言、Pascal语言、COBOL语言,以及支持函数式编程和逻辑编程的Mercury语言,等等的编译器。GCC是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。GCC主要包括: ?cpp:GNU C编译器的预处理器 ?gcc:符合ISO标准的C编译器 ?g++:基本符合ISO标准的C++编译器 ?gcj:GCC的java前端 ?gnat:GCC的GNU ADA95的前端 binutils是一组二进制工具程序集合,是辅助GCC的主要软件,其中主要包括: ?as:GNU汇编器

构建Linux系统下的gcc交叉编译器

构建Linux系统下的gcc交叉编译器 https://www.360docs.net/doc/8113240245.html,/developerWorks 目录 第1节.开始之前 (2) 第2节.交叉编译 (3) 第3节.准备工作 (5) 第4节.配置和构建 (8) 第5节.安装和使用交叉编译器 (9) 第6节.总结及资源 (10) 第1节.开始之前 关于这本指南 很多时候,你所使用的开发平台和你的开发所面向的机器并不一致。比如,你可能想在装有x86/Linux的膝上电脑上构建一个PowerPC/Linux的应用程序。使用GNU 工具包中的gcc,gas和ld工具,可以指定并构建一个交叉编译器,使你能够在本地机器上创建面向其它目标机器的应用程序。稍微用些功夫,你甚至可以搭建出一个环境,从而能够针对各种不同的目标而构建应用程序。在本指南中,我描述了在系统上构建交叉编译器所需的过程。我还讨论了构建一个完全的面向一系列目标的环境,展示了如何与distcc和ccache工具结合使用,并且描述了保持最新版本以及在新开发平台上进行更新,所需的方法。 构建交叉编译器,需要对构建一个典型的UNIX开源项目有基本的了解,具有一些基本的shell技能,还要有相当的耐心。

前提条件 为了构建交叉编译器,你需要一个可以工作的C编译器(通常是gcc)。大多数基于Linux/UNIX的操作系统都自带有C编译器。还需要用来构建交叉编译器的各种工具的源代码。你可以从GNU()网站上下载GNU工具(请尽量使用本地镜像)。除了这些工具以外,你还需要有目标平台的头文件拷贝。对于Linux系统下的目标,可以使用https://www.360docs.net/doc/8113240245.html,()的通用Linux内核头文件。 关于作者 Martin C. Brown曾任职过IT主管,具有交叉平台整合经验。作为一位热心的开发者,曾为巨头客户包括HP和Oracle,开发过动态网站,并且是https://www.360docs.net/doc/8113240245.html,的技术主管。MC(为人熟知的名字)现在是自由作家和顾问,作为SME和微软密切合作,是LinuxWorld杂志的LAMP技术编辑,https://www.360docs.net/doc/8113240245.html,小组的核心成员,并写过许多书,涉及到微软认证,iMacs和开放源码编程等不同的主题。除了这些出色的尝试以外,他还依然在许多平台环境方面保持着一位标准的程序员所惯有的痴迷。 关于本指南中的技术问题和评价,请和作者MC联系,,或者登陆他的网站()。[软件仓库2] 第2节.交叉编译 交叉编译器的必要性 我们不可能总是在同一个平台上进行编写和构建应用程序。比如许多嵌入式环境,由于简化的存储空间通常小于256MB,甚至可能小于64MB,就不太现实。如此小的空间是无法容下一个寻常的C编译器,及相关工具和所需的C库,就更不用说在上面运行了。

相关文档
最新文档