linux下x264库ARM交叉编译
什么是交叉编译
什么是交叉编译?较短回答交叉编译(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 平台的可执行代码。
Armlinux交叉编译
Armlinux交叉编译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 静态链接错误,链接是需要添加–ldlundefined reference to `dlopen'undefined reference to `dlerror'undefined reference to `dlsym'对dlopen, dlerror, dlsym 未定义的引用,缺少链接库,链接时加上选项-ldl3、对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库引起的,编译链接时加上-lz4、如何在configure时,将编译参数传入,改变默认的编译器gcc成arm-linux编译器按照INSTALL中的介绍,也是常用的方法,在configure的时候,加上–host=arm-linux,结果没有实现我们要的效果,没有将编译器从默认的gcc改成arm-linux-gcc,编译器还是用的默认的gcc。
ARM-Linux交叉编译步骤
samba事先安装sudo apt-get install nfs-kernel-server交叉编译步骤1、创建目录s3c2440_recover2、设置网络文件系统的根目录配置文件/etc/exports在最后一行添加s3c2440_recover的绝对路径*(rw,sync,no_root_squash)重启nfssudo /etc/init.d/nfs-kernel-server restart3、arm开发板启动Bootloader 引导加载程序Kernel uImageFilesystemBootloader -》把内核的uImge加载到内存uImage 加载filesystem =》shell 用户空间4、编译器arm-linux-gcc-4.3.2.tar.gzsudo tar zxvf xxx.tar.gz -C /编译自动会解压到/usr/local/arm设置编译器脚本(自己创建),每次打开终端,若要使用arm编译器,则先source一下arm-compile.sh ()#!/bin/bashexport PA TH=$PATH:/usr/local/arm/4.3.2/bin############### 告诉系统编译器的路径(通过在PATH环境变量中添加)修改脚本可执行权限chmod u+x arm-compile.shsource arm-compile.sh4、Uboot 编译分别解压源码uboot-1.2-utu2440.tar.bz2按照uboot编译.txt5、内核编译准备工具修改过的内核源码Linux2.6.24_utu2440.tar.gz拷贝到crosscompile目录下解压tar zxvf linux inux2.6.24_utu2440.tar.gz制作镜像文件工具mkimage拷贝到/usr/sbin 或者/usr/bin 目录下参考脚本hw-kernel编译.txt内核编译时,会根据.config 的配置文件进行文件编译(即选择哪些模块,卸载哪些模块)Make menuconfig 就是一个图形裁剪的配置工具,操作结果会自动保存到.config操作步骤参hw-kernel编译.txt6 . Busybox 创建yaffs文件系统准备工具busybox-1.19.2.tar.bz2mkyaffsimage除开uboot、kernel之外的脚本文件第一个脚本mkroot.sh是用来创建根目录下的子目录的6.1 在某个目录下执行./mkroot.sh这时,会在当前路径下生成rootfs 目录及其子目录进入rootfs/dev 下创建console null操作如下:$cd rootfs/dev/$ su口令:# mknod -m 600 console c 5 1;mknod -m 666 null c 1 3;exit退出rootfs目录cd ../../6.2 解压busybox.1.19.2.tar.bz2$ cd busybox.1.19.2修改Makefile文件Gedit Makefile在164行CROSS_COMPILE ?=改为CROSS_COMPILE ?= arm-linux-make menuconfig设置交叉编译器的路径设置编译输出路径,即make install会把编译生成的东西放到指定路径配置menuconfigBusybox Settings --->//设置静态编译方式或者动态链接Busybox Settings ---> Build Options ---> [] Build BusyBox as a static binary (no shared libs)(/usr/local/arm/4.3.2/bin) cross compiler prefix[*] Build with Large File Support (for accessing files > 2 GB)Busybox Settings ---> Install Options ---> 中输入建立根文件系统的文件所在的路径busybox install prefix即rootfs的绝对路径makemake install备注:6.3 6.4让学生做总有问题,因为这两步其实是配置etc和lib故为了方便,已经都做好了,放在build/busybox目录下,直接拷贝到rootfs下即可6.3 配置rootfs下的文件信息修改和创建必要的文件cp -a busybox.1.19.2/examples/bootfloppy/etc/* rootfs/etccd rootfs/etc增加为SHELL导入全局变量的文件/etc/profilegedit etc/profile增加初始化文件gedit etc/inittabgedit etc/fstab增加初始化脚本gedit etc/init.d/rcS在etc下创建文件mdev.conftouch medev.conf6.4 动态链接库当前路径rootfs/libcp -a /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/lib/* ./当前路径rootfs/usr/libcp -a /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/lib/libstdc++* ./当前路径:rootfs的上一级目录sudo mv mkyaffsimage /usr/bin/mkyaffsimage rootfs filesystem.yaffs6.5 sudo cp filesystem.yaffs /srv/tftp在CRT中run install-filesystem注意:要用arm-linux-gcc-4.3.2 编译出来的u-boot.bin uImage filesysetm.yaffs7 在arm上执行应用程序写个简单的hello world程序arm-linux-gcc hello.c -o armhello把armhello复制到s3c2440_recover 下启动开发板登陆到shell界面后(在CRT中进行操作)将虚拟机里的目录s3c2440_recover目录,通过NFS挂载到开发板的/mnt下mount -t nfs -o nolock 192.168.1.200:/home/guoji/share/crosscompile/s3c2440_recover /mnt 此时,在开发板下的/mnte下即可看到armhello将armhello拷贝到/home目录下,并执行./armhello。
交叉编译器arm-linux-gcc
交叉编译器arm-linux-gcc(⼀)交叉编译器简介在⼀种计算机环境中运⾏的编译程序,能编译出在另外⼀种环境下运⾏的代码,这个编译过程就叫交叉编译.简单地说,就是在⼀个平台上⽣成另⼀个平台上的可执⾏代码.(⼆)体系结构与操作系统(1)常见的体系结构有ARM结构、x86结构等.(2)常见的操作系统有linux,windows等.(3)同⼀个体系结构可以运⾏不同操作系统,如x86上可以运⾏Linux、Windows等,在ARM上可以运⾏Linux、WinCE.(4)同⼀个操作系统可以在不同的体系结构上运⾏,⽐如Linux可以运⾏在x86上,也可以运⾏在ARM上.(5)同样的程序不可能运⾏在多个平台上,⽐如Windows下应⽤程序不能在Linux下运⾏.如果⼀个应⽤程序想在另⼀个平台上运⾏,必须使⽤针对该平台的编译器,来重新编译该应⽤程序的⼆进制代码.⽐如在Linux系统下运⾏Windows平台的QQ软件,必须按照以下⼏个步骤:1.QQ程序源代码2.使⽤Linux下的编译器来编译QQ软件的源代码这样编译出来的可执⾏程序就可以在Linux下运⾏了.所以,如何使ARM来运⾏⽤户的应⽤程序呢,就需要⽤到针对ARM的编译器来编译程序.(三)使⽤交叉编译器的原因ARM上可以运⾏操作系统,所以⽤户完全可以将ARM当做计算机来使⽤,理论上也可以在ARM上使⽤本地的编译器来编译程序.但是,编译器在编译程序时,会产⽣⼤量的中间⽂件,这会占⽤很⼤的内存和磁盘空间,且对CPU处理速度要求较⾼,⽐如S3C2440A内存、磁盘空间只有⼏⼗到100多兆,CPU只有400-500MHz,完全达不到编译程序的要求.所以,在进⾏ARM-linux嵌⼊式开发时必须在PC机(x86结构)上编译出能够运⾏在ARM上的程序,然后再将程序下载到ARM中来运⾏.这就⽤到了交叉编译器.要进⾏交叉编译,⽤户需要在主机平台上安装对应的交叉编译⼯具链(cross compilation tool chain),然后⽤这个交叉编译⼯具链编译⽤户的源代码,最终⽣成可在⽬标平台上运⾏的代码.交叉编译⼯具链可以从⽹上下载,也可以⾃⼰制作.但编译器不是万能的,受版本限制,编译某些程序时会报错.常见的交叉编译⼯具链有:(1)Cross -2.95.3 tar: 该版本较早,除了编译vivi外⼀般不使⽤.(2)arm920t-eabi.tgz: 4.1.2版本的编译器,⽀持eabi,可以编译TX2440A开发板上的所有程序.(3)arm-linux-gcc: 4.3.2版本的编译器,⽀持eabi,是最常见的交叉⼯具链.Attention什么是EABIEABI,Embeded application binary interface,即嵌⼊式应⽤⼆进制接⼝,是描述可连接⽬标代码、库⽬标代码、可执⾏⽂件影像、如何连接、执⾏和调试以及⽬标代码⽣成过程,和c, c++语⾔接⼝的规范,是编译连接⼯具的基础规范,也是研究它们⼯作原理的基础.简⽽⾔之,EABI就是⼀种编译规范,交叉编译器在编译时,对于浮点运算会使⽤硬浮点运算,⽽对于没有硬浮点运算的处理器,⽐如S3C2440,会使⽤软浮点,但这样会在速度上受到很⼤的限制,⽽EABI则对浮点运算进⾏了优化,提⾼了浮点运算的性能,节省了编译时间.(四)安装交叉⼯具链arm-linux-gcc 4.3.2安装交叉编译器arm-linux-gcc就是在主机平台(pc机的Linux操作系统)上安装对应的交叉编译⼯具链,换句话说,是将交叉编译器arm-linux-gcc 4.3.2在Linux操作系统下安装.安装步骤:(1)启动Samba服务器,打开共享⽬录/home/lishuai,将压缩⽂件arm-linux-gcc-4.3.2.tgz复制到/home/lishuai下.(2)解压软件包arm-linux-gcc-4.3.2.tgz.[root@localhost lishuai]#tar xzvf arm-linux-gcc4.3.2.tgz1.⽬录4.3.2就是该交叉编译器的⽬录.从arm-linux-gcc-4.3.2.tgz解压信息来看,该软件包需要解压在usr/local/arm下,⽽实际却解压到了共享⽬录/home/lishuai下2.进⼊⽬录usr/local/内,并没有找到arm⽂件夹,所以需要新建⼀arm⽂件夹,再将⽬录4.3.2移动到新建⽬录usr/local/arm下.其中,4.3.2/bin就是arm-linux-gcc的可执⾏⽂件.[root@localhost local]#mv /home/lishuai/usr/local/arm/4.3.2 ./3.进⼊⽬录/usr/local/arm/4.3.2/bin,可以看到不同类型的编译器.但在ARM下经常⽤到是arm-linux-gcc.其实它也是⼀个gcc编译器,与gcc 使⽤⽅法⼀致,不过该编译器是针对arm体系结构、Linux操作系统的编译器.利⽤该编译器就可以编译出运⾏在ARM上的Linux操作系统下的应⽤程序.4.进⼊⽬录/usr/local/arm/4.3.2/arm-none-linux-gnueabi.其中,lib⽬录下存放的是库⽂件,⽤户编写的应⽤程序在运⾏时就依赖于这些库⽂件.5.此时还不能编译源码,系统⼀般会提⽰找不到命令arm-linux-gcc.这是环境变量在作祟.所以必须修改环境变量PATH.[root@localhost lishuai]#vi /etc/profile在"export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC"这⼀⾏的下⾯添加环境变量,输⼊:export PATH=/usr/local/arm/4.3.2/bin:$PATH指定变量PATH为交叉编译器的路径,⽬的是告诉操作系统可以到⽬录/usr/local/arm/4.3.2/bin下查找可执⾏⽂件6.[root@localhost lishuai#:source /etc/profile//使已修改的配置⽂件/etc/profile⽣效7.查看arm-linux-gcc编译器的版本[root@localhost lishuai]#arm-linux-gcc -v(五)arm-linu-gcc应⽤实例实例:如何使⽤交叉编译器编译源码包boa-0.94.13.tar.tar1. 启动SMB服务器,将源码包放在共享⽂件夹/home/lishuai下2. 输⼊命令: tar xzvf boa-0.94.13.tar.tar//解压该源码包//⼀般的源码包内有Makefile⽂件,执⾏make就可以编译,但该源码包内没有,此时执⾏make是⽆效的//仍然没有Makefile,但找到了configure⽂件,通过执⾏configure⽂件可以⽣成Makefile[root@localhost lishuai]# ./configure//运⾏configure⽂件,⽣成了Makefile⽂件//由于要编译出在ARM平台上的程序,就需要使⽤交叉编译器.在Makefile⽂件内的绿⾊⼤写字母都是Makefile变量,可以看到变量CFLAGS = -g -o2 -pipe -Wall -l,该变量是设置编译选项;变量CC = gcc,该变量是设置需要使⽤的编译器.由于要使⽤交叉编译器arm-linux-gcc,所以该变量应设置为CC = arm-linux-gcc,CPP = arm-linux-gcc -E,保存并退出.[root@localhost lishuai]#make//执⾏make进⾏编译//⽣成名为boa的可执⾏程序,该程序可下载到ARM内来执⾏其实,这个过程也叫做移植.移植就是将⼀个源码包经过修改、配置、交叉编译,然后下载到⼀个平台上运⾏.⽐如经常移植的有Bootloader、内核、QT等.。
Linux交叉编译简介
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 驱动器的机器上,在测试环境和开发环境之间来回重新启动。
linux arm交叉编译程序步骤
linux arm交叉编译程序步骤下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by the editor. I hope that after you download them, they can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you!In addition, our shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!在嵌入式系统开发中,使用ARM架构是非常常见的选择。
嵌入式linux交叉编译工具链
一、交叉工编译工具链的简介 ——为什么要使用交叉编译
在裁减和定制Linux内核用于嵌入式系统之前,由于一般嵌
入式开发系统存储大小有限,通常都要在性能优越的PC上 建立一个用于目标机的交叉编译工具链,用该交叉编译工具 链在PC上编译目标机上要运行的程序。交叉编译工具链是 一个由编译器、连接器和解释器组成的综合开发环境,交叉 编译工具链主要由binutils、gcc和glibc 3个部分组成。有时 出于减小 libc 库大小的考虑,也可以用别的 c 库来代替 glibc,例如 uClibc、dietlibc 和 newlib。建立交叉编译工具 链是一个相当复杂的过程,如果不想自己经历复杂繁琐的编 译过程,网上有一些编译好的可用的交叉编译工具链可以下 载,但就以学习为目的来说读者有必要学习自己制作一个交 叉编译工具链。
二、交叉编译工具链的制作方法 Leabharlann 步构建交叉编译工具链 3、建立环境变量
该步骤的目的是为了方便重复输入路径,因为重复操作每件相同 的事情总会让人觉得很麻烦。声明以下环境变量的目的是在之后 编译工具库的时候会用到,很方便输入,尤其是可以降低输错路 径的风险。 # export PRJROOT=/home/jiabing/armlinux # export TARGET=arm-linux # export PREFIX=$PRJROOT/tools # export TARGET_PREFIX=$PREFIX/$TARGET # export PATH=$PREFIX/bin:$PATH 注意,用export声明的变量是临时的变量,也就是当注销或更换 了控制台,这些环境变量就消失了,如果还需要使用这些环境变 量就必须重复export操作,所以有时会很麻烦。值得庆幸的是, 环境变量也可以定义在bashrc文件中,这样当注销或更换控制台 时,这些变量就一直有效,就不用老是export这些变量了。
linux学习之交叉编译环境
linux学习之交叉编译环境⼀在Linux上配置交叉编译环境:1. 根据芯⽚型号确定芯⽚指令集架构,并根据该架构选择合适的交叉编译⼯具2. 将交叉编译⼯具解压,添加到环境变量。
3. 编译⽬标⽂件,并想法设法将⽬标⽂件整到开发板上,有以下⽅法:将⽬标⽂件先整到windows PC下,拷贝到U盘/SD卡然后再插⼊开发板;⽤⽀持SSH的⼯具如putty登陆板⼦linux服务器;⽤NFS实现。
⼆ Uboot:⽤来启动内核(CPU不能直接从块设备中执⾏代码): 执⾏uboot代码,在uboot中把块设备中的内核代码复制到某内存地址处,然后再执⾏这个地址,即可启动内核。
uboot代码(uboot 根⽬录的spl⽂件夹u-boot-spl.bin和uboot根⽬录下u-boot.bin)需要⽤make(makefile配置+“.config”(make menuconfig图形化配置⼯具的输出⽂件))出来。
然后分别烧录进板⼦。
三编译kernel,并将其烧写进板⼦,启动板⼦后linux的shell环境应该跑起来了。
注意烧录内核的位置和内核运⾏环境: ramdisk根⽂件系统,这个⽂件系统是存在RAM⾥的,所以你在⾥⾯写⼊东西,⼀断电就没有了。
NAND Yaffs2⽂件系统:断电后还是存在的,使⽤busybox⽤来⽣成linux⽂件系统的⼏个基本⽂件夹,然后通过打包⼯具mkyaffs2,它⽤来⽣成能直接烧录到板⼦⾥的镜像⽂件,以下都是要烧写的⽂件。
Image Name Image Type Image start offsetu-boot-spl.bin uboot0x200u-boot.bin data 0x100000env.txt env0x80000970uImage data0x200000rootfs_yaffs2.img data 0x2000000四:将⾃⼰编写的程序的可执⾏⽂件拷贝到/opt⽬录下,并拷贝所需的库⽂件到/lib下,即可通过命令⾏来运⾏⽂件了。
交叉编译ffmpeg + x264 编码H264 (arm Linux
由于我电脑上的交叉编译器是从以下目录去查找头文件和库的,所以把x264.h和libx264.a拷贝到相应目录:(我是通过在/usr/local/4.3.3下查找pthread.h和libpthread.a来获取这个目录的)
cp x264.h /usr/local/4.3.3/arm-none-linux-gnueabi/libc/usr/include/
cp libx264.a /usr/local/4.3.3/arm-none-linux-gnueabi/libc/armv4t/usr/lib/ Leabharlann 2、 编译ffmpeg
ffmpeg + x264 编码H264 (arm Linux) (2010-12-07 21:08:02)转载
标签: ffmpeg x264
arm linux 平台
1、 交叉编译x264
我用的是目前最新版:x264-snapshot-20101130-2245.tar.bz2
./configure --enable-pthread --enable-static --disable-shared --host=arm-linux --disable-asm
我用的是目前最新版:ffmpeg-0.6.1.tar.gz
./configure --enable-cross-compile --arch=arm --target-os=linux --enable-static --disable-shared --cc=arm-linux-gcc --enable-libx264 --enable-gpl --disable-network --disable-mpegaudio-hp --enable-pthreads --enable-small --disable-parsers --disable-debug
linux交叉编译
移植1一、原理交叉编译就是在一个平台上生成另外一个平台上的可执行代码,这里的平台有两方面的含义:处理器体系结构和所运行的操作系统通常,程序是在一台计算机上编译,然后再分布到将要使用的其它计算机上,当主机系统和目标机系统不兼容时,该该过程叫交叉编译交叉编译有两种模式:Java模式和GNU GCC模式,这里指的是GNU GCC模式。
在宿主机上交叉编译得到可执行文件,通过调试器下载到目标系统中调试运行宿主机(Host):——编辑和编译程序的平台目标机(Target):——用户开发的系统二、目的1.建立交叉开发环境——安装交叉编译器三、准备1. 仔细阅读TQ2440开发板使用手册2.5四、内容安装交叉编译器。
五、设备硬件:PC机一台软件:linux(2.6.x)操作系统。
交叉编译器压缩包六、流程1. 使用命令cd / 进入目录2. 使用命令tar –jxvf EABI_4.3.3_EmbedSKy_20090807.tar.bz2 【-C /】3. 使用命令export PATH= /opt/EmbedSky/4.3.3/bin:$PATH修改环境变量4. 使用命令echo $PATH移植2Boodloader(u-boot)实训流程1. 使用命令cd /进入目录2 使用命令tar –jxvf u-boot-1.1.6_20090824.tar.bz2。
最终解压在/opt/EmbedSky/u-boot-1.1.6中3. 进入该目录/使用命令make EmbedSky_config4. 在使用命令make最终得到一个u-boot.bin文件LINUX内核模块编译步骤:个人用的Linux版本为:Debian GNU/Linux,内核版本为:2.6.18-1-686. 第一步:获取Linux系统源码第二步:解压系统源码用tar -jxvf命令解压第三步:在系统中添加对ARM的支持第四步:修改平台输入时钟修改平台的时钟频率,以满足TQ2440或SKY2440的工作频率。
交叉编译原理
二、交叉编译原理下面介绍一下交叉编译原理,那什么是交叉编译呢,就是在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,这个编译过程就叫交叉编译,简单地说,就是在一个平台上生成另一个平台上的可执行代码,需要注意的是,这里所谓的平台,实际上包括两个概念,一个是体系结构,体系结构就是我们熟悉的ARM或者AMD,还有Intel的x86就是我们现在使用的PC机等等,一个是操作系统,操作系统就是指Windows、uCOSII、Linux 和Unix等等,同一个体系结构可以运行不同的操作系统,比如我们在PC机上可以运行Windows和Linux等操作系统,在ARM上也可以运行Linux和WinCE等,同一个操作系统也可以在不同的体系结构上运行,比如Linux系统可以运行在PC机上也可以运行在ARM 上,也可以运行在其它嵌入式平台上,但是由于体系结构的不同,操作系统的差异,那么同样的程序不可能运行在多个平台上,比如Windows平台的应用程序拿到Linux下就不能运行了,如果一个应用程序想要在另一个平台上运行,那么必须使用针对这个平台的编译器,来重新编译这个应用程序的代码,这样才能在这个平台上运行,比如我想在Linux系统下运行Windows平台的腾讯QQ程序,那首先我需要有这个QQ程序的源代码,然后使用Linux 系统下的编译器来编译这个QQ的源代码,这样编译出的可执行程序就可以在Linux系统下运行了,那理论上来说就是这样的,那么我们如何让程序在ARM开发板上运行呢,这就需要使用针对ARM平台的编译器来编译程序,那问题就来了,为什么我们非要使用交叉编译器呢,就以我们使用的ARM开发板来说,前面我说过你完全可以把开发板当做电脑来用,它上面可以跑操作系统,也可做好多好多事情,理论上来说在它上面也可以使用编译器来编译程序,但大家知道在编译程序时会产生大量的中间文件,这样会暂用很大的内存和磁盘空间,而且对CPU的处理速度也有一定的要求,那么我们使用的S3C2440A处理器CPU的频率也就能达到400~500MHz那样,内存和磁盘空间也只有几十到一百多兆,这样完全达不到编译程序的水平,那么我们只有在PC机上编译出运行在ARM上的程序,然后再将程序下载到ARM上运行要进行交叉编译,我们需要在主机平台也就是PC机Linux系统上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码,那PC机就是这里说的主机平台,ARM就是目标平台,他们之间可以用JTAG电缆、串口电缆、Ethernet网络交叉电缆或USB线进行链接下载程序,对于交叉编译工具链,你可以从网上下载,也可以自己制作,从网上下载很方便,你可以直接使用,但交叉编译器不是万能的,一个版本的编译器可能只限于编译某些程序,那编译其它程序可能就会出错,那么你不得不再寻找其它版本的交叉编译器,比如我以前编译bootloader 版本vivi的时候,只能用2.9.3版本的编译器,使用更高版本的编译器就会出错,我编译QT 程序的时候,只能使用4.1.2版本的编译器进行编译,那么这时候你希望自己制作出一个交叉编译工具来满足自己的需求,那这也是非常复杂的工作,有时候会遇到很多的困难,那如果大家有兴趣的话可以自己动手做一个交叉编译工具链,那可以上网找一些好的参考文档,然后跟着它一步一步的制作那我们使用的交叉编译工具都是在网上下载的,我们直接安装就可以使用了,那这些解码包在光盘资料中Linux平台工具目录下,cross-2.95.3.tar.bz2这个就是一个比较老的版本的,我们一般不使用它,但编译vivi的时候可能会用到它,arm920t-eabi-4.1.2.tar.gz的编译器,它支持eabi,它可以用来编译我们TX-2440A开发板上的所有程序,那为什么选择这个编译器呢,因为我以前使用的其它版本的编译器,像3.4.1、3.4.2版本的,用这些编译器编译QT 程序的时候,在运行时会出现段错误,那后来找到的原因是交叉编译器版本的问题,所以在QT的一个官方网站上提供了这个4.1.2版本的编译器,那目前QT程序只能用这个编译器来编译,arm-linux-gcc-4.3.2.tgz也支持eabi,也可以用来编译大部分程序,那什么是EABI?其实它就是一种编译的规范,那交叉编译器在编译的时候对于浮点数运算会使用硬浮点运算,那对于没有硬浮点运算的处理器,比如S3C2440它会使用软浮点,那这样会在速度上受到很大的限制,而使用eabi就对浮点运算进行了优化,提高了浮点运算的性能,也节省了编译时间。
linux交叉编译工具的安装
2. 拷贝工具链到根目录下
3. 解压工具链
4. 自动生成/usr/local/arm/3.4.1 目录
5. 在etc/bashrc 中添加环境变量
6. 重起Linux 后查看PATH环境变量并运行交叉
编译工具
交叉编译工具的安装
1. 交叉编译能运行在体系 结构不同的另一种平台上的程序,比如在PC平台 上编译出能运行在X86 CPU 平台上的程序在以 ARM为内核的CPU平台上是不能运行的。相对于 交叉编译,平常做的编译叫本地编译,编译得到 的程序也是在本地执行。用来编译跨平台程序的 编译器就叫交叉编译器。要生成目标机上运行的 程序,必须要用交叉编译工具链来完成。
【VIP专享】Linux交叉编译环境及工具介绍
1、建立内核头文件
Linux Headers
Gcc source
Host gcc
Binutils Source
2
3
Target Binutil tools
Target Bootstrap gcc
Glibc source
Gcc source
Target glibc
Target Full gcc
建立交叉编译环境:
1、建立内核头文件 主要是生成include/linux/version.h 和 include/linux/autoconf.h 文件,这是编 译 glibc 是要用到的,version.h 和 autoconf.h 文件的存在,也说明了你生成了 正确的头文件。
2、针对目标系统的二进制工具binutils; The GNU Binutils are a collection of binary tools. binutils提供了一系列用来创建、管理和维护二进制目标文件的工具程序, 如汇编(as)、链接(ld)、静态库归档(ar)、反汇编(objdump)、 elf结构分析工具(readelf)、无效调试信息和符号的工具(strip)等。 通常,binutils与gcc是紧密相集成的,没有binutils的话,gcc是不能正常 工作的。
4、创建一个交叉编译版本的glibc。 这里最容易出现问题。glibc是一个提供系统调用和基本函数的C语言库,比如 open,malloc和printf等,所有动态链接的程序都要用到它。创建glibc需要的时间 很长。 5、重新创建gcc(称为full gcc)。 因为前面创建gcc的过程没有编译C++编译器,现在glibc已经准备好了,所以这 个步骤将产生一个更完整的full gcc编译器。
Linux交叉编译环境
开发编译环境1.交叉编译器的安装,与使用以ubuntu-14.04.4-desktop-amd64 为例将附录1的arm_toolchain.tar.gz 选择一个目录COPY过去,(此处以/opt为例)tar zxvf arm_toolchain.tar.gz修改~/.bashrc在最后一行添加将/opt/X3改成你解压的所在目录即可source ~/.bashrc在终端查看是否正确,输入arm后按TAB键若出现安交叉编译器安装正确若不添加该环境变量,则在使用该编译器时,请使用绝对路径如:部分LINUX操作系统,可能存在所需的库并未安装,在编译时若提示未能找到相关库,请自行搜索该库的相应安装若出现arm-Linux-gcc /usr/local/arm/4.3.2/bin/arm-linux-gcc: 行3: /usr/local/arm/4.3.2/bin/arm-none-linux-gnueabi-gcc: 没有那个文件或目录(No such file or directory)且进入external-toolchain/bin/ 直接运行./ arm-none-linux-gnueabi-gcc出现同样提示,则可能原因是64位系统需要安装32位相应库解决方法:方法一:sudo apt-get install lib32z1方法二:sudo apt-get install g++-multilib方法三:$ sudo dpkg --add-architecture i386$ sudo apt-get update$ sudo apt-get install ia32-libs(工具:附录1-arm_toolchain.tar.gz)2.NFS服务安装首先安装nfs-kernel-serverapt-get install nfs-kernel-serverNFS主要有3类选项:访问权限选项设置输出目录只读:ro设置输出目录读写:rw用户映射选项all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);no_all_squash:与all_squash取反(默认设置);root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置);no_root_squash:与rootsquash取反;anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx);其它选项secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);insecure:允许客户端从大于1024的tcp/ip端口连接服务器;sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;async:将数据先保存在内存缓冲区中,必要时才写入磁盘;wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);no_wdelay:若有写操作则立即执行,应与sync配合使用;subtree:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);no_subtree:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;在/etc/exports文件中添加配置:此处添加了二个输出目录作为网络共享目录,可用于挂载在/etc/hosts.allow中添加配置:portmap:192.168.0.0/255.255.0.0 (表示可访问的IP地址)在/etc/hosts.deny中添加配置:portmap:ALL重新启动两个服务:service portmap restartservice nfs-kernel-server restart(其它系统请自行搜索相关方法安装NFS以及启动服务)3.打包与调试终端3.1打包debug版终端机解压附录2pack下面有三个文件夹output, pack_src, pctools,一个脚本文件packpack_src,该文件夹下存放不同项目的文件夹,文件夹名以机器型号命名。
arm交叉编译扩展指令
arm交叉编译扩展指令(原创实用版)目录1.ARM 交叉编译扩展指令概述2.ARM 交叉编译扩展指令的作用3.ARM 交叉编译扩展指令的实现4.ARM 交叉编译扩展指令的优缺点5.ARM 交叉编译扩展指令的应用案例正文【提纲】详解 ARM 交叉编译扩展指令1.ARM 交叉编译扩展指令概述ARM 交叉编译扩展指令是指在 ARM 架构处理器上运行的程序,使用其他架构处理器的指令集进行编译。
这种编译方式可以让 ARM 架构处理器运行其他架构的程序,从而实现不同架构处理器之间的代码共享和迁移。
2.ARM 交叉编译扩展指令的作用ARM 交叉编译扩展指令的作用主要体现在以下几个方面:(1)提高代码复用性:通过使用 ARM 交叉编译扩展指令,可以让 ARM 架构处理器运行其他架构处理器编写的程序,从而提高代码的复用性。
(2)降低开发成本:使用 ARM 交叉编译扩展指令,可以让开发者编写一次代码,然后在多个不同架构的处理器上运行,降低开发成本。
(3)推动生态发展:ARM 交叉编译扩展指令可以让更多的处理器架构加入到 ARM 生态系统中,推动 ARM 生态的发展。
3.ARM 交叉编译扩展指令的实现ARM 交叉编译扩展指令的实现主要包括以下几个方面:(1)指令集转换:ARM 交叉编译扩展指令需要将源架构的指令集转换成目标架构的指令集,以便 ARM 架构处理器能够正确地执行。
(2)寄存器映射:为了实现不同架构处理器之间的数据交互,ARM 交叉编译扩展指令需要实现寄存器映射,将源架构的寄存器映射到目标架构的寄存器上。
(3)异常处理:ARM 交叉编译扩展指令需要实现异常处理,以便在目标架构处理器上正确地处理源架构的异常情况。
4.ARM 交叉编译扩展指令的优缺点ARM 交叉编译扩展指令的优点包括:(1)提高代码复用性:可以让 ARM 架构处理器运行其他架构处理器编写的程序,提高代码的复用性。
(2)降低开发成本:可以让开发者编写一次代码,然后在多个不同架构的处理器上运行,降低开发成本。
arm交叉编译扩展指令
arm交叉编译扩展指令介绍在嵌入式系统和移动设备中,使用ARM架构的处理器非常常见。
为了优化ARM指令集的使用,可以使用交叉编译扩展指令来提高程序的执行效率。
本文将详细介绍arm交叉编译扩展指令的概念、使用方法和优势。
什么是交叉编译交叉编译是指在一台主机上使用某种工具链来生成在另一种不同架构的目标平台上运行的可执行程序。
在ARM架构中,交叉编译可以在x86架构的主机上进行,生成可以在ARM处理器上运行的程序。
ARM架构简介ARM是一种低功耗、高性能的处理器架构,广泛应用于移动设备、嵌入式系统和物联网设备中。
ARM架构具有精简指令集,以节省功耗和提高性能为目标。
由于ARM 处理器的普及,交叉编译成为开发ARM平台软件的常见需求。
交叉编译的优势使用交叉编译可以在更强大的主机上进行开发和编译,然后将生成的可执行文件移植到目标平台上运行。
这样做的好处包括: 1. 提高编译速度:交叉编译可以利用主机的更高性能来加快编译过程,节省开发时间。
2. 方便调试:在主机上进行编译和调试可以更方便地定位和修复错误。
3. 可移植性:生成的可执行文件可以在多个目标平台上运行,提高了软件的可移植性和复用性。
ARM交叉编译工具链ARM交叉编译工具链是一组用于在x86主机上生成ARM可执行文件的工具集合。
常见的ARM交叉编译工具链包括: 1. GNU工具链:包括GNU编译器套件(GCC)、GNU调试器(GDB)等。
GNU工具链是开源的,广泛应用于ARM平台的开发中。
2. Clang/LLVM:Clang是一个开源的C/C++编译器,基于LLVM技术。
Clang/LLVM工具链具有较好的性能和可扩展性。
使用交叉编译扩展指令优化ARM程序交叉编译扩展指令是一种优化技术,可以通过使用特定的指令来提高ARM程序的性能。
下面介绍几种常见的交叉编译扩展指令。
NEON指令集NEON是ARM架构中的一种SIMD(单指令多数据)扩展指令集。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
linux下x264库ARM交叉编译
一、准备工作
1、x264库源码下载地址:http://videolan/developers/x264l
作者目前的版本是x264-snapshot-20160511-2245
2、编译器arm-none-Linux-gnueabi-gcc
二、编译步骤
1、解压安装包
tar -xzvf last_x264.tar.bz2
cd x264-snapshot-20160511-2245
2、修改配置文件
./configure --disbale-asm 注意:这里加了--disable-asm选项是因为arm-none-linux-gnuabi工具链是没有汇编器,所以禁止此选项
由于未指定--prefix,所以程序会默认安装/usr/local/bin目录下
3、修改config.mak
主要是将相关选项修改为arm-none-linux-gnuabi相关的配置,修改内容如下:
SYS_ARCH=ARM
CC=arm-none-linux-gnueabi-gcc
CFLAGS=-Wno-maybe-uninitialized -Wshadow -O3 -ffast-math -Wall -I. -I$(SRCPATH) -std=gnu99 -D_GNU_SOURCE -fomit-frame-pointer -fno-tree-vectorize
LD=arm-none-linux-gnueabi-gcc -o
4、make
5、make install
我的本意是想生成lib264.a静态库的,很奇怪,在x264-snapshot-20160511-2245目录下可以找到lib264.a和lib264.so及相关的头文件,但是没有在/usr/lib/local目录下找到libx264.a,但是有x264。
有点不太理解,而且很多过程基本上按照的网上提供的方式参考操作的,很纳闷哪里出。