Arm linux交叉编译
- 格式:docx
- 大小:16.30 KB
- 文档页数:1
Linux下libcurl的编译和交叉编译⼀、下载curl源码⼆、创建⽬标输出⽬录 我创建了两个,⼀个放版本、⼀个放arm版本。
# mkdir build_linux build_arm三. 解压⽂件 # tar -xvf curl-7.63.0.tar.xz四. 配置并编译Linux版本: (--prefix指定编译输出安装路径 --enable-static 指定编译静态库)# ./configure --prefix=/home/gec/csdn/curl/build_linux --enable-static# make# make installARM版本:(--prefix指定编译输出安装路径 --enable-static 指定编译静态库 CC指定交叉编译⼯具链)# ./configure --host=arm-linux CC=arm-linux-gcc --prefix=/home/gec/csdn/curl/build_arm --enable-static# make# make install1.此处的 --enable-static 加上没效果,最后还是动态链接。
⾄少这个版本是这样的2.--prefix后⾯⼀定要是绝对路径,不能是相对路径五.移植到arm平台上,因为上⾯的 --enable-static 选项没起作⽤,需要将⽤到的库复制到对应路径,这⾥变态的不是从默认的/lib⽬录下读取库⽂件1.先到libcurl/bin下 readelf -d curl 查看curl的所需的库⽂件及库⽬录我这⾥显⽰库的路径是:“Library rpath: [/home/arm/share/4.开源库/curl-7.63.0/xxx/lib]”2. 在开发板上要创建同样的路径名字,并将库⽂件全部复制 mkdir /home/arm/share/4.开源库/curl-7.63.0/xxx/lib -p cp /nfs/4.开源库/curl-7.63.0/xxx/lib/ /home/arm/share/4.开源库/curl-7.63.0/xxx/lib/ 如果不做上述操作,执⾏curl命令时,不管后⾯是什么,⼀律返回:curl: (48) Error,也不提⽰是不是缺少库所造成的! 六. 复制bin下⾯的curl到开发板上,路径随意参考 不需要openssl需要openssl。
建立交叉编译步骤周立功smart2200**建立交叉开发环境**由于目标板平台处理器是ARM,因而需要安装GCC针对ARM的编译器。
适用于μCLinux的编译器为arm-elf-gcc。
安装arm-elf-gcc步骤:(1)将光盘附带的文件arm-elf-tools-20040427.sh拷贝到目录如/usr/src 下,为arm-elf-tools-20040427.sh增加可执行权限(如果已经具有可执行权限,这步可省略)。
注意:增加权限必须具有root权限,若没有root权限,请先为用户增加root权限(命令su)。
#chmod 755 arm-elf-20040427.sh(2)安装arm-elf-gcc。
执行arm-elf-tools-20040427.sh。
./arm-elf-tools-20040427.sh安装完毕后,查看/usr/local/bin目录下是否存在arm-elf-gcc等文件,如果存在,基本可以确定交叉编译器安装成功。
(3)添加交叉编译器的路径。
一般情况下安装过程会自动执行,并在下次启动还有效。
export PATH=$PATH:/usr/local/arm-elf/bin**安装μCLinux**1:将光盘附带的μCLinux源码包uClinux-dist-20040408.tar.gz拷贝到目录如/usr/src下,并解压。
tar xzvf uClinux-dist-20040408.tar.gz解压后,在当前目录下会多出文件夹uClinux-dist,即μCLinux源代码目录。
2:为SmartARM2200开发板和LPC2200芯片打补丁。
将光盘附带的补丁文件uClinux-dist-20040408-lpc-chy-cmj.patch拷贝到当前目录下,并执行:cat uClinux-dist-20040408-lpc-chy-cmj.patch|patch– p1–duClinux-dist为LPC2200打补丁后,在μCLinux平台内核配置的时候将会有LPC2200的选项。
什么是交叉编译?较短回答交叉编译(cross-compilation)是指,在某个主机平台上(比如PC上)用交叉编译器编译出可在其他平台上(比如ARM上)运行的代码的过程。
完整回答交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。
我们常用的计算机软件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比如 C代码)编译(compile)成计算机可以识别和执行的二进制代码。
比如,我们在 Windows 平台上,可使用 Visual C++ 开发环境,编写程序并编译成可执行程序。
这种方式下,我们使用 PC 平台上的 Windows 工具开发针对 Windows 本身的可执行程序,这种编译过程称为 native compilation,中文可理解为本机编译。
然而,在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的 ARM 平台,其一般的静态存储空间大概是 16 到 32 MB,而 CPU 的主频大概在 100MHz 到 500MHz 之间。
这种情况下,在 ARM 平台上进行本机编译就不太可能了,这是因为一般的编译工具链(compilation tool chain)需要很大的存储空间,并需要很强的 CPU 运算能力。
为了解决这个问题,交叉编译工具就应运而生了。
通过交叉编译工具,我们就可以在 CPU 能力很强、存储控件足够的主机平台上(比如 PC 上)编译出针对其他平台的可执行程序。
要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。
常见的交叉编译例子如下:∙在 Windows PC 上,利用 ADS(ARM 开发环境),使用 armcc 编译器,则可编译出针对 ARM CPU 的可执行代码。
∙在 Linux PC 上,利用 arm-linux-gcc 编译器,可编译出针对 Linux ARM 平台的可执行代码。
Windows平台交叉编译ArmLinux平台的QT5.7库1、准备交叉编译环境环境说明:Windows 7 64位此过程需要:(1)Qt库开源代码,我使⽤的是5.7.0版本;(2)Perl语⾔环境5.12版本以上;(3)Python语⾔环境 2.7 版本以上;(4)Windows平台上的MinGW开发⼯具集(内含本地编译器gcc、g++ 4.9以上版本,⽀持c++11);(5)Windows平台上的交叉编译器arm-linux-gnueabihf(gcc、g++4.9以上版本,⽀持c++11)。
1.1、下载Qt库源代码到Qt官⽹官⽹https://www.qt.io/download-open-source/#section-2下载qt-everywhere-opensource-src-5.7.0.zip或者qt-everywhere-opensource-src-5.7.0.tar.gz。
1.2、安装Perl到Perl官⽹https:///get.html下载ActivePerl 5.12以上版本,如ActivePerl-5.24.0.2400-MSWin32-x86-64int-300560.exe。
安装完成后将安装⽬录⾥的bin⽬录路径添加到windows环境变量的PATH中。
1.3、安装Python到Python官⽹ https:///downloads/下载Python2.7以上版本,如python-3.5.2.exe。
安装完成后将安装⽬录⾥的bin⽬录路径添加到windows环境变量的PATH中。
1.4、MinGW开发⼯具集MinGW⼯具集内含编译器⼯具gcc、g++等,需要此⼯具集来编译Qt的qmake等开发⼯具,因为qmake这些开发⼯具是在本地windows上运⾏的。
要求4.9以上版本的gcc、g++,4.8以上就已经⽀持c++11。
32位系统可以到https:///projects/mingw/下载mingw-get-setup.exe后进⾏在线安装;64位系统到https:///projects/mingw-w64/下载mingw-w64-install.exe后进⾏在线安装。
交叉工具链的生成/uid-9185047-id-3158569.html软件平台:ubuntu 10.10主机编译器:gcc 4.5.1硬件平台:s3c24101、准备环境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,要先安装gperf2、下载crosstool-ng软件包crosstool-ng-1.17.0.tar.bz23、相应目录的建立sudo mkdir -p /usr/local/armsudo chmod 777 /usr/local/arm // 将arm目录权限设置为777cd /usr/local/armmkdir 4.7.2sudo mkdir -p /home/crosstoolcd /home/s3c2410/crosstoolsudo mkdir crosstool-build crosstool-install src-4.7.2(编译目录、安装目录、目标源码目录)4、安装crosstool-ngcp 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/下的p cp到/etc/bash_completion.d配置安装目录为/home/s3c2410/crosstool/crosstool-install注:有的没安装gperf,无法生成makefile,要先安装gperfsudo ./configure --prefix=/home/crosstool/crosstool-installsudo make --编译sudo make install --安装5、配置编译的交叉编译工具链cd /home/s3c2410/crosstool/crosstool-build --进入编译目录cp/home/s3c2410/crosstool/crosstool-ng-1.17.0/samples/arm-unknown-linu x-gnueabi/* ./sudo cp crosstool.config .config --把crosstool-config --当作默认的配置文件sudo /home/crosstool/crosstool-install/bin/ct-ng menuconfig --图形界面进行配置,若该句无法执行可能是终端窗口太小弹出以下菜单,此菜单主要用于交叉编译工具链的环境配置。
arm-linux-gcc常用参数讲解gcc编译器使用方法我们需要编译出运行在ARM平台上的代码,所使用的交叉编译器为arm-linux-gcc。
下面将arm-linux-gcc编译工具的一些常用命令参数介绍给大家。
在此之前首先介绍下编译器的工作过程,在使用GCC编译程序时,编译过程分为四个阶段:1. 预处理(Pre-Processing)2. 编译(Compiling)3. 汇编(Assembling)4. 链接(Linking)Linux程序员可以根据自己的需要让GCC在编译的任何阶段结束,以便检查或使用编译器在该阶段的输出信息,或者对最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码来为今后的调试做好准备。
和其它常用的编译器一样,GCC也提供了灵活而强大的代码优化功能,利用它可以生成执行效率更高的代码。
以文件example.c为例说明它的用法0. arm-linux-gcc -o example example.c不加-c、-S、-E参数,编译器将执行预处理、编译、汇编、连接操作直接生成可执行代码。
-o参数用于指定输出的文件,输出文件名为example,如果不指定输出文件,则默认输出a.out1. arm-linux-gcc -c -o example.oexample.c-c参数将对源程序example.c进行预处理、编译、汇编操作,生成example.0文件去掉指定输出选项"-o example.o"自动输出为example.o,所以说在这里-o加不加都可以2.arm-linux-gcc -S -o example.sexample.c-S参数将对源程序example.c进行预处理、编译,生成example.s文件-o选项同上3.arm-linux-gcc -E -o example.iexample.c-E参数将对源程序example.c进行预处理,生成example.i文件(不同版本不一样,有的将预处理后的内容打印到屏幕上)就是将#include,#define等进行文件插入及宏扩展等操作。
交叉编译⼯具链的制作交叉编译⼯具链的制作前⾔及准备本笔记制作的交叉编译⼯具已通过简单验证,对初次有需求需要搭建交叉⼯具链有⼀定的指导意义,制作⼯具链⽐较耗时,需做好花费⼀整天时间的准备。
资料学习链接linux⼯具、软件安装的基本步骤:下载,配置,编译,安装crosstool-ng下载或使⽤指令新建 arm-linux-tool ⽂件夹⽤于制作⼯具链mkdir arm-linux-toolcd arm-linux-toolwget /download/crosstool-ng/crosstool-ng-1.23.0.tar.bz2tar -xvjf crosstool-ng-1.23.0.tar.bz2新建mkdir crosstool-build crosstool-install src⼀、安装crosstool-ng1.编译依赖sudo apt-get install gperf flex bison texinfo gawk libtool automake libncurses5-dev g++ help2mangperf是完美哈希函数⽣成器;bison和flex是⽤来⽣成语法和词法分析器;texinfo和man类似,⽤来读取帮助⽂档;automake是帮助⽣成Makefile的⼯具;libtool帮助在编译过程中处理库的依赖关系,⾃动搜索路径;gawk是linux下⽤于⽂本处理和模式匹配的⼯具;2.配置、安装cd crosstool-ng-1.23.0./configure --prefix /home/wangh/workspace/wh_tools/arm-linux-tool/crosstool-install/配置过程中出现的缺少安装项通过安装解决配置正常⽣成 makefile 后,进⾏编译安装makemake install验证安装是否成功在 crosstool-install/bin ⽬录下执⾏ ./ct-ng -v为了后⾯使⽤⽅便,配置临时环境变量export PATH=$PATH:/home/wangh/workspace/wh_tools/arm-linux-tool/crosstool-install/bin/⼆、配置交叉编译⼯具链对于常见的架构,⽐如arm,mips,powerpc等等,都有了很多的,已经帮我验证过,可以正常编译的⽰例配置了,所以我们接下来,主要就是:搞懂⾃⼰借⽤哪个配置,然后调⽤默认配置,然后再确认⼀下配置,根据⾃⼰的情况去改⼀改,就差不多,就配置好了。
Linux交叉编译简介Linux 交叉编译简介主机,⽬标,交叉编译器主机与⽬标编译器是将源代码转换为可执⾏代码的程序。
像所有程序⼀样,编译器运⾏在特定类型的计算机上,输出的新程序也运⾏在特定类型的计算机上。
运⾏编译器的计算机称为主机,运⾏新程序的计算机称为⽬标。
当主机和⽬标是同⼀类型的机器时,编译器是本机编译器。
当宿主和⽬标不同时,编译器是交叉编译器。
为什么要交叉编译?某些设备构建程序的PC,⽤户可以获得适当的⽬标硬件(或模拟器),启动 Linux Release版,在该环境中进⾏本地编译。
这是⼀种有效的⽅法(在处理 Mac Mini时甚⾄可能是⼀个好主意),但对于 linksys 路由器,或 iPod,有⼀些突出的缺点:速度- ⽬标平台通常⽐主机慢⼀个数量级或更多。
⼤多数专⽤嵌⼊式硬件是为低成本和低功耗⽽设计的,⽽不是⾼性能。
由于在⾼性能桌⾯硬件上运⾏,现代模拟器(如 qemu)实际上⽐模拟的许多现实世界的硬件要快。
性能- 编译⾮常耗费资源。
⽬标平台通常没有台式机GB 内存和数百 GB 磁盘空间;甚⾄可能没有资源来构建“hello world”,更不⽤说⼤⽽复杂的包了。
可⽤性-未运⾏过的硬件平台上运⾏ Linux,需要交叉编译器。
即使在 Arm 或 Mips 等历史悠久的平台上,给定⽬标找到最新的全功能预构建本机环境很困难。
如果平台通常不⽤作开发⼯作站,可能没有现成的最新预构建Release版,如果有,则可能已经过时。
如果必须先为⽬标构建Release版,才能在⽬标上进⾏构建,⽆论如何都将返回交叉编译。
灵活性- 功能齐全的 Linux Release版,由数百个软件包组成,但交叉编译环境可以从⼤多数⽅⾯依赖于主机的现有Release版。
交叉编译的重点是构建要部署的⽬标包,不是花时间获取在⽬标系统上运⾏的仅构建先决条件。
⽅便-⽤户界⾯不友好,debug构建中断不⽅便。
从 CD 安装到没有 CD-ROM 驱动器的机器上,在测试环境和开发环境之间来回重新启动。
arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf的区别命名规则交叉编译⼯具链的命名规则为:arch [-vendor] [-os] [-(gnu)eabi] [-gcc]arch – 体系架构,如ARM,MIPSvendor – ⼯具链提供商os – ⽬标操作系统eabi – 嵌⼊式应⽤⼆进制接⼝(Embedded Application Binary Interface)注意1. 没有vendor时,⽤none代替;2. 没有os⽀持时,也⽤none代替3. 同进没有vendor和os⽀持时,只⽤⼀个none代替,⽐如arm-none-eabi中的none表⽰既没有vendor也没有os⽀持。
根据对操作系统的⽀持与否,ARM GCC可分为⽀持和不⽀持操作系统,如arm-none-eabi:这个是没有操作系统的,⾃然不可能⽀持那些跟操作系统关系密切的函数,⽐如fork(2)。
他使⽤的是newlib这个专⽤于嵌⼊式系统的C库。
arm-none-linux-eabi:没有vendor的、⽤于Linux的,使⽤Glibc实例1、arm-none-eabi-gcc(ARM architecture,no vendor,not target an operating system,complies with the ARM EABI)⽤于编译 ARM 架构的裸机系统(包括 ARM Linux 的 boot、kernel,不适⽤编译 Linux 应⽤ Application),⼀般适合ARM7、Cortex-M和Cortex-R内核的芯⽚使⽤,所以不⽀持那些跟操作系统关系密切的函数,⽐如fork(2),它使⽤的是newlib 这个专⽤于嵌⼊式系统的C库。
2、arm-none-linux-gnueabi-gcc(ARM architecture, no vendor, creates binaries that run on the Linux operating system, and uses the GNU EABI)主要⽤于基于ARM架构的Linux系统,可⽤于编译 ARM 架构的 u-boot、Linux内核、linux应⽤等。
Ubuntu 10.04下运用crosstool-ng-1.9.0建立arm-linux交叉工具链构建一个交叉工具链供嵌入式系统开发使用是一个令人恐惧的景象,需要钢铁般的意志,需要几天(如果不是几个星期)的功夫,需要具备许多的 Unix 和GNU 知识……”正式基于这一点,我们选择开源工具crosstool-ng,来制作自己的交叉编译工具链。
Crosstool现在也有好几个版本,在这里我选择crosstool-ng-1.9.0这个工具包。
我所选的主机系统是Ubuntu10.04。
在制作交叉编译工具之前要安装各种各样的编译工具,因为Ubuntu系统的方便性,我们可以通过具体的命令在线安装所需的软件。
下面将是具体的制作交叉编译的过程;一、安装所需的工具包$ sudo apt-get install g++ libncurses5-dev bison flex texinfo automake libtool patch gcj cvs cvsd gawk二、下载交叉编译工具所用的文件,在制作交叉编译的过程中,需要在线下载这个编译工具包,考虑到网速的问题和编译的时间问题,提前将这些包下载下来,放在指定的目录下,可以大大节省很多的编译时间,考虑到各种包的下载问题,这个百度文库又不能上传软件包,我就将所有的下载路径附在文章后面,同仁们可以去具体的地方下载!三、安装crosstool-ng-1.9.0.tar.bz2的工具。
安装所需的crosstool-ng-1.9.0,也可在这个地址下/old_news下载crosstool-ng的工具包。
下面是详细的安装步骤:#cd //回到家目录#mkdir crosstool //建立crosstool目录#cp ~/下载/tar/crosstool-ng-1.9.0.tar.bz2 ./crosstool //拷贝crosstool源码包到crosstool目录下#cd crosstool //进入crosstool目录#tar jxvf crosstool-ng-1.9.0.tar.bz2 //解压源码包考虑到后续要用的各种目录,我这里先建立好所需的目录#mkdir crosstool-build crosstool-install src //解压完后建立安装目录编译目录和源码包目录,这几个目录和crosstool-ng-1.9.0目录并列,如下图所示:#cd crosstool-ng-1.9.0 //进入crosstool目录#./configure --prefix=~/crosstool/crosstool-install# make //编译# sudo make install //安装#cd crosstool-build/ //进入crosstool-build目录#cp ../crosstool-ng-1.9.0/samples/arm-unknown-linux-gnueabi/* ./ //拷贝交叉工具链到crosstool-build目录下#mv crosstool.config .config //修改文件名#../crosstool-install/bin/ct-ng menuconfig此刻会出现一个图形配置界面,在此配置界面下,可以按照自己开发板的实际情况来进行配置:1、设定源码包路径和交叉编译器的安装路径。
我帮他安装完之后写了一个hello world程序测一下安装成功了没有。
用gcc编译成功了,但用arm-linux-gcc来编译的时候却报stdio.h no such file or directory 这个错误。
我以前也装过几次,没发现此类的问题,然后又按照书上的方法试了几次,也都是这样的错误,在别人的电脑上试了还是一样出现这个错误。
在google里面也搜了一下这个问题,发现这个问题别人也遇到过,没什么解决方案。
最后在网上下了一个4.3.2的版本,配置了一下,运行hello world程序,居然没有错误了。
注:我使用的操作系统为:ubuntu11.10,开始使用的arm-linux-gcc 版本为3.3.2.如果有人也出现找不到头文件的情况,希望换个版本的arm-linux-gcc来用一下。
下面介绍一下交叉编译环境的安装全过程。
1.首先下载arm-linux-gcc-4.3.2.tgz,可以到arm Friendly官网上下/download.asp。
2.下载完后解压。
解压可以把文件拷到/usr/local/arm/然后解压tar zxvfarm-linux-gcc-4.3.2.tgz,这是比较笨的做法。
linux提供了简单的方法为什么不用呢。
在任意目录下tar zxvf arm-linux-gcc-4.3.2.tgz -C /注意是大写的“C”,并且大写的“C”和“/”之间有一个空格。
解压完后就是配置环境变量了。
3.在root目录下gedit .bashrc当然你也可以用vim .bashrc个人喜欢用gedit。
在弹出的页面的最后一行加上export PATH=$PATH:/usr/local/arm/4.3.2/bin保存退出4.注销5.检查一下是不是安装好了,打开终端。
输入arm-linux-gcc -v看有没有相应的版本信息输出,输出信息如下所示:[root@localhost ~]# arm-linux-gcc -vUsing built-in specs.Target: arm-none-linux-gnueabiConfigured with: /scratch/julian/lite-respin/linux/src/gcc-4.3/configure--build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi--enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch--with-gnu-as --with-gnu-ld --enable-languages=c,c++ --enable-shared--enable-symvers=gnu --enable-__cxa_atexit --with-pkgversion='Sourcery G++ Lite 2008q3-72' --with-bugurl=https:///GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-sysroot=/opt/codesourcery/arm-none-linux-gnueabi/libc --with-build-sysroot=/scratch/julian/lite-respin/linux/install/arm-none-linux-gnueabi/libc--with-gmp=/scratch/julian/lite-respin/linux/obj/host-libs-2008q3-72-arm-none-linux-gnuea bi-i686-pc-linux-gnu/usr--with-mpfr=/scratch/julian/lite-respin/linux/obj/host-libs-2008q3-72-arm-none-linux-gnuea bi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories--with-build-time-tools=/scratch/julian/lite-respin/linux/install/arm-none-linux-gnueabi/bin --with-build-time-tools=/scratch/julian/lite-respin/linux/install/arm-none-linux-gnueabi/bin Thread model: posixgcc version 4.3.2 (Sourcery G++ Lite 2008q3-72)。
交叉编译问题记录-嵌⼊式环境下GDB的使⽤⽅法本⽂为作者原创,转载请注明出处:本⽂以嵌⼊式 Linux 环境下的 gdb 使⽤为例,记录交叉编译过程中⼀个⽐较关键的问题:configure 过程中 --build, --host, --target 参数的区别。
1. 交叉编译交叉编译是指在⼀种平台上编译出运⾏于另⼀种平台的程序。
这⾥的平台,涉及硬件和软件两个部分,硬件平台指 CPU 架构,软件平台指操作系统。
交叉编译主要针对嵌⼊式领域,因为嵌⼊式系统资源受限,没有办法在嵌⼊式平台上运⾏⼀套编译环境,因此需要在其他性能更强劲的平台上借助交叉编译⼯具链来制作可在嵌⼊式平台上运⾏的程序。
交叉编译与普通编译基本步骤⼀样:[1] configure在编译前进⾏配置。
如果 --host 参数与 --build 参数不同,则是交叉编译。
否则就是普通编译。
[2] make编译。
根据上⼀步 configure 配置⽣成的参数,调⽤相应的编译⼯具链编译⽣成⽬标程序。
[3] make install安装。
将 make ⽣成的⽬标程序安装到指定⽬录。
如果不运⾏ make install,⼿动拷贝到指定⽬录也可。
1.1 --build --host --target看⼀下 configure 步骤中 --build、--host 和 --target 三个参数的定义,下⾯在 gdb 源码⽬录运⾏ './configure --help'./configure --helpSystem types:--build=BUILD configure for building on BUILD [guessed]--host=HOST cross-compile to build programs to run on HOST [BUILD]--target=TARGET configure for building compilers for TARGET [HOST]源码经过编译⽣成可执⾏程序。
arm交叉编译器gnueabi、none-eabi、arm-eabi等的区别命名规则交叉编译工具链的命名规则为:arch [-vendor] [-os] [-(gnu)eabi]arch –体系架构,如ARM,MIPSvendor –工具链提供商os –目标操作系统eabi –嵌入式应用二进制接口(Embedded Application Binary Interface)根据对操作系统的支持与否,ARM GCC可分为支持和不支持操作系统,如arm-none-eabi:这个是没有操作系统的,自然不可能支持那些跟操作系统关系密切的函数,比如fork(2)。
他使用的是newlib这个专用于嵌入式系统的C库。
arm-none-linux-eabi:用于Linux的,使用Glibc实例1、arm-none-eabi-gcc(ARM architecture,no vendor,not target an operaTIng system,complies with the ARM EABI)用于编译ARM 架构的裸机系统(包括ARM Linux 的boot、kernel,不适用编译Linux 应用 ApplicaTIon),一般适合ARM7、Cortex-M 和 Cortex-R 内核的芯片使用,所以不支持那些跟操作系统关系密切的函数,比如fork(2),他使用的是newlib 这个专用于嵌入式系统的C库。
2、arm-none-linux-gnueabi-gcc(ARM architecture, no vendor, creates binaries that run on the Linux operaTIng system, and uses the GNU EABI)主要用于基于ARM架构的Linux系统,可用于编译ARM 架构的u-boot、Linux内核、linux应用等。
arm-none-linux-gnueabi基于GCC,使用Glibc库,经过Codesourcery 公司优化过推出的编译器。
arm-linux-gcc交叉编译工具链安装
1.解压交叉编辑工具链到根目录
// -C 参数指的是解压到根目录下面
// 安装在/usr/local/arm/4.3.2/bin/ 的“bin”目录下面
2.修改环境变量,把交叉编译器的路径加入到PATH
// arm-linux-gcc 使用方法1:跟上“全路径”
// arm-linux-gcc 使用方法2:添加路径到环境变量中去,在系统的时候就可以“任何地方”使用arm-linux-gcc
[root@localhost ~]#
# Path manipulation
if [ "$EUID" = "0" ]; then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
pathmunge /usr/local/arm/4.3.2/bin //环境变量添加的位置
fi
3.立即使新的环境变量生效,不用重启电脑
#source etc/profile
4.检查是否将路径加入到PATH
显示的内容中有/usr/local/arm/4.3.2/bin,说明已经将交叉编译器的路径加入PATH 5.测试是否安装成功。
arm top命令交叉编译ARM Top命令是一款用于查看系统资源占用情况的工具,可以帮助用户快速了解系统的运行状态。
在Linux系统中,Top命令是一种非常常用的系统监控工具,可以实时显示系统中各个进程的资源占用情况,以及系统整体的负载情况。
而在ARM架构的设备上,也可以通过交叉编译的方式使用Top命令来监控系统运行情况。
交叉编译是指在一种体系结构的设备上编译适用于另一种体系结构的程序的过程。
在ARM架构的设备上编译Top命令,可以帮助用户实时监控系统资源的使用情况,及时发现并解决系统性能问题。
下面将介绍如何在ARM架构的设备上进行Top命令的交叉编译。
我们需要准备交叉编译工具链。
可以通过在ARM架构的设备上安装交叉编译工具链来实现。
有许多开源的交叉编译工具链可供选择,比如gcc、clang等。
选择合适的交叉编译工具链后,我们就可以开始编译Top命令了。
我们需要下载Top命令的源代码。
可以从官方网站或者开源社区上下载Top命令的源代码,也可以直接从GitHub等代码托管平台上获取。
下载源代码后,我们需要解压并配置编译环境。
接着,我们需要进行交叉编译的配置。
在进行交叉编译之前,我们需要配置编译选项,指定交叉编译工具链的路径等信息。
在配置完成后,我们就可以开始进行编译了。
编译过程中可能会遇到一些依赖库的缺失或者版本不兼容的问题,这时我们需要及时解决这些问题,以确保编译顺利进行。
在编译完成后,我们就可以在ARM架构的设备上使用Top命令了。
使用Top命令可以帮助用户实时监控系统资源的占用情况,包括CPU、内存、磁盘等方面的使用情况。
通过Top命令,用户可以方便地查看系统中各个进程的资源占用情况,及时发现并解决系统性能问题。
同时,Top命令还可以显示系统整体的负载情况,帮助用户全面了解系统的运行状态。
总的来说,通过交叉编译Top命令,可以在ARM架构的设备上实现系统资源监控,帮助用户及时发现并解决系统性能问题。
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:。