采用交叉编译的主要原因在于,多数嵌入式目标系统不能提供足够的资源供编译过程使用,因而只好将编译工程转移到高性能的主机中进行。
linux下的交叉编译环境重要包括以下几个部分:
1.对目标系统的编译器gcc
2.对目标系统的二进制工具binutils
3.目标系统的标准c库glibc
4.目标系统的linux内核头文件
交叉编译环境的建立步骤
一、下载源代码 下载包括binutils、gcc、glibc及linux内核的源代码(需要注意的是,glibc和内核源代码的版本必须与目标机上实际使用的版本保持一致),并设定shell变量PREFIX指定可执行程序的安装路径。
二、编译binutils 首先运行configure文件,并使用--prefix=$PREFIX参数指定安装路径,使用--target=arm-linux参数指定目标机类型,然后执行make install。
三、配置linux内核头文件
首先执行make mrproper进行清理工作,然后执行make config ARCH=arm(或make menuconfig/xconfig ARCH=arm)进行配置(注意,一定要在命令行中使用ARCH=arm指定cpu架构,因为缺省架构为主机的cpu架构),这一步需要根据目标机的实际情况进行详细的配置,笔者进行的实验中目标机为HP的ipaq-hp3630 PDA,因而设置system type为SA11X0,SA11X0 Implementations中选择Compaq iPAQ H3600/H3700。
配置完成之后,需要将内核头文件拷贝到安装目录: cp -dR include/asm-arm $PREFIX/arm-linux/include/asm cp -dR include/linux $PREFIX/arm-linux/include/linux
四、第一次编译gcc
首先运行configure文件,使用--prefix=$PREFIX参数指定安装路径,使用--target=arm-linux参数指定目标机类型,并使用--disable-threads、--disable-shared、--enable-languages=c参数,然后执行make install。这一步将生成一个最简的gcc。由于编译整个gcc是需要目标机的glibc库的,它现在还不存在,因此需要首先生成一个最简的gcc,它只需要具备编译目标机glibc库的能力即可。
五、交叉编译glibc
这一步骤生成的代码是针对目标机cpu的,因此它属于一个交叉编译过程。该过程要用到linux内核头文件,默认路径为$PREFIX/arm-linux/sys-linux,因而需要在$PREFIX/arm-linux中建立一个名为sys-linux的软连接,使其内核头文件所在的include目录;或者,也可以在接下来要执行的configure命令中使用--with-headers参数指定linux内核头文件的实际路径。
configure的运行参数设置如下(因为是交叉编译,所以要将编译器变量CC设为arm-linux-gcc): CC=arm-linux-gcc ./configure --prefix=$PREFIX/arm-linux --host=arm-linux --enable-add-ons 最后,按以上配置执行configure和make install,glibc的交叉编译过程就算完成了,这里需要指出的是,glibc的安装路径设置为$PREFIXARCH=arm/arm-linux,如果此处设置不当,第二次编译gcc时可能找不到glibc的头文件和库。
六、第二次编译gcc
运行configure,参数设置为--prefix=$PREFIX --target=arm-linux --enable-languages=c,c++。
运行make install。
到此为止整个交叉编译环境就完全生成了。
几点注意事项
第一点、在第一次编译gcc的时候可能会出现找不到stdio.h的错误,解决办法是修改gcc/config/arm/t-linux文件,在TARGET_LIBGCC2_CFLAGS变量的设定中增加-Dinhibit_libc和-D__gthr_posix_h。
B. arm-linux 交叉编译环境的建立,希望有清楚的人解答,复制的闪人
是这样子的,计算机linux中原有的gcc是针对通用的X86等处理器而言的,编译出来的可执行文件是只能在通用计算机上运行的,arm也是一种处理器,只不过其指令等和X86等CPU不同,所以需要有针对arm的编译器来编译源程序,才能在arm中运行。
我在arm9下做过linux,qt编程,需要先在PC上安装linux,然后安装arm-linux-gcc,同时为了可以使用arm-linux-gcc来编译程序,需要指定环境变量,这个可以在.profile等文件中进行更改,具体办法你查一下就知道了。或者使用export命令在终端中设置环境变量。两种方法的结果有区别哦!
你想用2440的开发板的话就是arm9了,我还没找到arm9的仿真工具,但是网上已经有arm7的仿真工具。
对于arm-linux-gcc,只要你安装好并设置好了路径(环境变量)后,在一个终端中输入#arm-linux-gcc -v
那么你一般可以看到你安装的arm-linux-gcc 版本信息,到此你就可以使用它编译你的源程序,然后将生成的可执行文件下载到arm开发板中就可以运行了。
还有什么问题再说吧,我也是一个人摸索出来的,估计摸索了一个月才成功的在arm上运行了第一个自己的qt图形界面程序,祝你好运!
我的建议:
一、熟悉linux 的各种操作命令(如export)
二、学会怎么下载可执行文件到arm中
三、学会用pc控制arm上的linux
我只用过arm-linux-gcc,在你的安装文件夹下可以找到
C. (未完)开发环境:ubuntu18.04 x86_64 qt5.12.12, aarch64 交叉编译
在构建针对aarch64架构的开发环境时,Ubuntu 18.04 x86_64和Ubuntu 20.04 x86_64平台需要结合VMware进行交叉编译。首先,确保cmake版本在3.16以上,通过手动下载GitHub上的最新版本并解压到指定目录,使用nano编辑器将cmake路径添加到环境变量中,完成环境配置。验证cmake版本和gcc/g++版本,然后安装gcc_aarch64交叉编译器,解压并执行相关命令使环境变量生效。
在验证交叉编译器安装成功后,编写cpp文件并使用交叉编译器进行编译,生成的执行文件可以拷贝到如Jetson Nano这样的aarch64嵌入式设备上运行。实现这一过程的关键步骤包括:在Jetson Nano上使用交叉编译器执行编译命令,确保目标架构的正确配置。
对于Qt5.12.12的安装,参考特定的博客指南,下载并完成qt_x64安装程序,通过GUI界面完成基本安装。下载源码并解压,修改qmake.conf文件以适应aarch64架构的交叉编译环境。在修改qmake.conf文件后,创建build文件夹并编写脚本以指定交叉编译器、sysroot路径、配置选项以及依赖包的安装顺序。确保脚本执行前安装必要的库,如Libxcb、OpenGL、Qt WebKit、Qt WebEngine、Qt Multimedia等。QDoc Documentation Generator Tool也是构建过程中需要考虑的组件。
在执行脚本后,可能遇到未解决的OpenGL编译问题,可以暂时跳过OpenGL模块的编译。对于指定sysroot路径和从Jetson Nano设备复制sysroot文件到VMware虚拟机中的操作,确保网络连接稳定,使用rsync工具完成文件传输。在实际操作中,根据Jetson Nano设备的实际IP地址调整命令参数。
整个过程涉及多个步骤和依赖,关键在于正确配置环境变量、交叉编译器和qmake.conf文件,以及确保所有依赖包的安装。通过这些步骤,能够在Ubuntu 18.04和Ubuntu 20.04平台上成功构建针对aarch64架构的开发环境,支持嵌入式系统开发需求。
D. arm-linux-gcc-3.4.3交叉编译器环境变量怎么设置
为了设置arm-linux-gcc-3.4.3交叉编译器的环境变量,首先将软件包复制到opt目录下并解压。接着,进入终端并切换至/etc目录,然后使用gedit编辑profile文件。在文件末尾添加一行:export PATH=$PATH:/opt/解压后的文件名字/bin。完成编辑后保存并关闭文件。
接着,需要在终端中执行source profile命令,使修改生效。之后,可以使用which arm-linux-gcc命令检查配置是否成功。
如果配置成功,which arm-linux-gcc命令将返回交叉编译器的路径。如果路径正确显示,说明环境变量设置成功。
需要注意的是,每次打开新的终端窗口时,都需要重新执行source profile命令,以确保环境变量始终生效。
此外,如果在配置过程中遇到问题,可以检查是否正确地将交叉编译器的路径添加到了PATH环境变量中。确保路径中没有多余的空格或特殊字符,以避免配置失败。
另外,如果想要永久地将环境变量添加到系统中,可以考虑将上述配置添加到bashrc或profile文件的系统配置中。
通过以上步骤,可以顺利地设置arm-linux-gcc-3.4.3交叉编译器的环境变量,为后续的开发工作做好准备。