Linux嵌入式交叉编译工具链问题 浅谈

本人 最近在 构建这样一个工具链,现在对网上的各个 工具链存在疑问。
1、yocto是个什么东西,有什么用
2、crosstool是做什么的
3、buildroot呢,与yocto是并行的工具链吗
4、还有个qt是什么,据说qmake能自动生成 makefile,以前的工具能cover主这个功能吗
5、安装完以后还需要安装arm-linux-gcc工具链吗?

希望大神解答,可以追加分数

简介

交叉编译工具链是一个由编译器、连接器和解释器组成的综合开发环境,交叉编译工具链主要由binutils、gcc和glibc 3个部分组成。有时出于减小 libc åº“大小的考虑,也可以用别的 c åº“来代替 glibc,例如 uClibc、dietlibc å’Œ newlib。交叉编译工具链主要包括针对目标系统的编译器 gcc、目标系统的二进制工具binutils、目标系统的标准c库glibc和目标系统的 Linux内核头文件。第一个步骤就是确定目标平台。每个目标平台都有一个明确的格式,这些信息用于在构建过程中识别要使用的不同工具的正确版本。因此,当在一个特定目标机下运行GCC时,GCC便在目录路径中查找包含该目标规范的应用程序路径。GNU的目标规范格式为CPU-PLATFORM-OS。例如,建立基于ARM平台的交叉工具链,目标平台名为arm-linux-gnu。

交叉编译工具链的制作方法

    分步编译和安装交叉编译工具链所需要的库和源代码,最终生成交叉编译工具链。

    通过Crosstool脚本工具来实现一次编译生成交叉编译工具链。

    直接通过网上(ftp.arm.kernel.org.uk)下载已经制作好的交叉编译工具链。

方法1相对比较困难,适合想深入学习构建交叉工具链的读者。如果只是想使用交叉工具链,建议使用方法2或方法3构建交叉工具链。方法3的优点不用多说,当然是简单省事,但与此同时该方法有一定的弊端就是局限性太大,因为毕竟是别人构建好的,也就是固定的没有灵活性,所以构建所用的库以及编译器的版本也许并不适合你要编译的程序,同时也许会在使用时出现许多莫名的错误,建议你慎用此方法。


方法1:分步构建交叉编译工具链


    下载所需的源代码包

    建立工作目录

    建立环境变量

    编译、安装Binutils

    获取内核头文件 

    编译gcc的辅助编译器

    编译生成glibc库

    编译生成完整的gcc

由于在问答中的篇幅,我不能细述具体的步骤,兴趣的同学请自行阅读开源共创协议的《Linux from scratch》,网址是:linuxfromscratch dot org

。

方法2:用Crosstool工具构建交叉工具链(推荐)

Crosstool是一组脚本工具集,可构建和测试不同版本的gcc和glibc,用于那些支持glibc的体系结构。它也是一个开源项目,下载地址是kegel dot com/crosstool。用Crosstool构建交叉工具链要比上述的分步编译容易得多,并且也方便许多,对于仅仅为了工作需要构建交叉编译工具链的你,建议使用此方法。

运行which makeinfo,如果不能找见该命令,在解压texinfo-4.11.tar.bz2,进入texinfo-4.11目录,执行./configure&&make&&make install完成makeinfo工具的安装

    准备文件:

下载所需资源文件 linux-2.4.20.tar.gz、binutils-2.19.tar.bz2、gcc-3.3.6.tar.gz、glibc- 2.3.2.tar.gz、glibc-linuxthreads-2.3.2.tar.gz和gdb-6.5.tar.bz2 ã€‚然后将这些工具包文件放在新建的$HOME/downloads目录下,最后在$HOME/目录下解压crosstool-0.43.tar.gz,命

令如下:
# cd $HOME/
# tar â€“xvzf crosstool-0.43.tar.gz

    建立脚本文件

接着需要建立自己的编译脚本,起名为arm.sh,为了简化编写arm.sh,寻找一个最接近的脚本文件demo-arm.sh作为模板,然后将该脚本的内容复制到arm.sh,修改arm.sh脚本,具体操作如下:

# cd crosstool-0.43

# cp demo-arm.sh arm.sh

# vi arm.sh

修改后的arm.sh脚本内容如下:

#!/bin/sh
set -ex
TARBALLS_DIR=$HOME/downloads # å®šä¹‰å·¥å…·é“¾æºç æ‰€å­˜æ”¾ä½ç½®ã€‚
RESULT_TOP=$HOME/arm-bin          # å®šä¹‰å·¥å…·é“¾çš„安装目录
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES="c,c++"                # å®šä¹‰æ”¯æŒC, C++语言
export GCC_LANGUAGES
# åˆ›å»º/opt/crosstool目录
mkdir -p $RESULT_TOP
# ç¼–译工具链,该过程需要数小时完成。
eval 'cat arm.dat gcc-3.3.6-glibc-2.3.2.dat' sh all.sh --notest
echo Done.

    建立配置文件

在arm.sh脚本文件中需要注意arm-xscale.dat和gcc-3.3.6-glibc-2.3.2.dat两个文件,这两个文件是作为Crosstool的编译的配置文件。其中 arm.dat文件内容如下,主要用于定义配置文件、定义生成编译工具链的名称以及定义编译选项等。

KERNELCONFIG='pwd'/arm.config # å†…核的配置
TARGET=arm-linux # ç¼–译生成的工具链名称
TARGET_CFLAGS="-O"                # ç¼–译选项


gcc-3.3.6-glibc-2.3.2.dat文件内容如下,该文件主要定义编译过程中所需要的库以及它定义的版本,如果在编译过程中发现有些库不存在时,Crosstool会自动在相关网站上下载,该工具在这点上相对比较智能,也非常有用。

BINUTILS_DIR=binutils-2.19
GCC_DIR=gcc-3.3.6
GLIBC_DIR=glibc-2.3.2
LINUX_DIR=linux-2.6.10-8(根据实际情况填写)
GDB_DIR=gdb-6.5

    执行脚本

将Crosstool的脚本文件和配置文件准备好之后,开始执行arm.sh脚本来编译交叉编译工具。具体执行命令如下:

# cd crosstool-0.43
# ./arm.sh

经过数小时的漫长编译之后,会在/opt/crosstool目录下生成新的交叉编译工具,其中包括以下内容:

arm-linux-addr2line arm-linux-g++        arm-linux-ld         arm-linux-size
arm-linux-ar       arm-linux-gcc      arm-linux-nm         arm-linux-strings
arm-linux-as       arm-linux-gcc-3.3.6 arm-linux-objcopy arm-linux-strip
arm-linux-c++      arm-linux-gccbug arm-linux-objdump fix-embedded-paths
arm-linux-c++filt arm-linux-gcov     arm-linux-ranlib
arm-linux-cpp      arm-linux-gprof    arm-linux-readelf

    添加环境变量

然后将生成的编译工具链路径添加到环境变量PATH上去,添加的方法是在系统/etc/ bashrc文件的最后添加下面一行,在bashrc文件中添加环境变量

export PATH=/home/jiabing/gcc-3.3.6-glibc-2.3.2/arm-linux-bin/bin:$PATH

至此,arm-linux下的交叉编译工具链已经完成,现在就可以使用arm-linux-gcc来生成试验箱上的程序了!












温馨提示:内容为网友见解,仅供参考
无其他回答

Linux嵌入式交叉编译工具链问题 浅谈
建立配置文件在arm.sh脚本文件中需要注意arm-xscale.dat和gcc-3.3.6-glibc-2.3.2.dat两个文件,这两个文件是作为Crosstool的编译的配置文件。其中 arm.dat文件内容如下,主要用于定义配置文件、定义生成编译工具链的名称以及定义编译选项等。KERNELCONFIG='pwd'\/arm.config # 内核的配置TARGET=arm-l...

关于交叉编译工具链的问题
至于你编译的这些东西版本都比较老,我建议还是尝试降级整个系统来编译、运行你现在的这些东西。或者升级你这个交叉编译工具链到当前主流的版本来用。至于交叉工具连当中的 GCC 和你当前本机的 GCC,完全是两个互相独立的 GCC 。只是他们编译输出的二进制程序针对的指令集不同而已。相对的 binutils 和 gli...

(交叉)编译工具链组成部分分析
交叉编译工具链的核心组成部分包括Binutils、GCC和C库,还需配合Linux kernel headers支持Linux系统。它们各自独立,需分别编译。Binutils负责二进制文件处理,包括ld链接器、as汇编器等,需针对不同CPU架构配置。GCC是编译器集合,负责C、C++等语言的编译,实则是调用其他程序的wrapper。它还包含编译器本身和...

Buildroot 学习笔记 2:配置、交叉编译工具链、使用 Buildroot 构建外部...
在配置和使用 Buildroot 构建嵌入式系统过程中,理解和掌握交叉编译工具链(host 编译工具链和目标系统交叉编译工具链)的配置是关键。Buildroot 提供了两种方案来管理交叉编译工具链:内部工具链后端和外部工具链后端。内部工具链后端是 Buildroot 自己用来编译交叉编译工具链的解决方案。它支持多种C库如uClibc...

Linux 交叉编译简介
如加拿大交叉编译)。在现代桌面系统中,通过模拟器进行本地编译也是一种策略,尽管效率较低,且可能因模拟器与实际硬件的差异导致问题。此外,为了避免主机和本地编译器冲突,交叉编译工具链通常会为实用程序添加特定前缀。了解更多关于Linux交叉编译的详细信息,可以参考链接:landley.net\/writing\/doc...

LINUX交叉编译工具链和GCC是什么关系啊
GCC就是编译器,他的输出每次安装只能有针对一个架构的指令输出。如果要多个架构输出,那就要装多个GCC,所以编译工具链里面会有一个GCC。交叉编译就是跨架构编译,编译出来的程序不能在本机执行(当然有例外情况)。所以这个时候就需要交叉编译工具链。工具链光有GCC是不行的,还需要一个binutils的二进制...

ARM & Linux 基础学习 \/ 配置交叉编译工具链 \/ 编译 Linux 应用和驱动...
编译内核时,需根据特定开发板的配置文件,如arch\/arm\/configs\/目录下的内容进行。首先在Linux源码目录执行配置命令,生成内核文件和设备树文件。对于内核模块的编译,同样在Linux源码目录进行,完成后将模块导入目标板的lib\/modules目录。对于Buildroot构建系统,它简化了嵌入式Linux定制过程,自动化构建bootloader...

交叉编译词义
进行交叉编译时,关键在于在主机上安装合适的交叉编译工具链,如在Windows PC上使用ADS和armcc编译ARM代码,或在Linux PC上使用arm-linux-gcc编译Linux ARM平台代码。在Windows环境下,可能还需要如cygwin这样的工具配合arm-elf-gcc进行编译。这种跨平台的编译方式,解决了嵌入式系统硬件资源受限时的开发问题...

嵌入式linux出现system\/bin\/sh:xxx : No such file or directory的错误...
嵌入式linux的android中,在执行交叉编译的C可执行文件时,出现\/system\/bin\/sh:xxx : No such file or directory或sh:xxx : No such file or directory的错误时,这一般是系统的动态链接器与xxx这个程序中的动态链接器的名字或路径不对(安卓和普通linux的根文件目录不一样)使用静态链接库 即在最后...

嵌入式ARM linux操作系统中如何构建交叉开发环境?
将交叉编译工具“gcc-4.4.4-glibc-2.11.1-multilib-1.0_EasyARM-iMX283.tar.bz2”文件通过U盘的方式拷贝到Linux主机的“\/tmp”目录下,然后执行如下命令进行解压安装交叉编译工具链:vmuser@Linux-host ~$ cd \/tmp vmuser@Linux-host ~$ sudo tar -jxvfgcc-4.4.4-glibc-2.11.1-multilib-...

相似回答