Arm linux交叉编译
Linux下libcurl的编译和交叉编译

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

建立交叉编译步骤周立功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库

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-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交叉编译简介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 驱动器的机器上,在测试环境和开发环境之间来回重新启动。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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:。