交叉编译器使用
‘壹’ 如何交叉编译开源库
所谓的搭建交叉编译环境,即安装、配置交叉编译工具链。在该环境下编译出嵌入式linux系统所需的操作系统、应用程序等,然后再上传到目标机上。
交叉编译工具链是为了编译、链接、处理和调试跨平台体系结构的程序代码。对于交叉开发的工具链来说,在文件名称上加了一个前缀,用来区别本地的工具链。例如,arm-linux-表示是对arm的交叉编译工具链;arm-linux-gcc表示是使用gcc的编译器。除了体系结构相关的编译选项以外,其使用方法与Linux主机上的gcc相同,所以Linux编程技术对于嵌入式同样适用。不过,并不是任何一个版本拿来都能用,各种软件包往往存在版本匹配问题。例如,编译内核时需要使用arm-linux-gcc-4.3.3版本的交叉编译工具链,而使用arm-linux-gcc-3.4.1的交叉编译工具链,则会导致编译失败。
那么gcc和arm-linux-gcc的区别是什么呢?区别就是gcc是linux下的C语言编译器,编译出来的程序在本地执行,而arm-linux-gcc用来在linux下跨平台的C语言编译器,编译出来的程序在目标机(如ARM平台)上执行,嵌入式开发应使用嵌入式交叉编译工具链。
工具/原料
电脑系统:win7系统。虚拟机系统:workstation6.5 。虚拟机安装的linux版本:fedora9.0。内核:linux2.6.25 。
方法/步骤
1
我使用的交叉编译工具链是arm-linux-gcc-4.4.3,把它放在linux系统的路径是图一
2
在linux系统的路径/home/song/share下放了交叉编译工具链arm-linux-gcc-4.4.3的压缩包,另一个版本的不用。有的人可能会问到怎么把这个压缩包弄到虚拟机的linux的系统的,我是通过samba服务从主机复制到虚拟机的,这里的share文件夹就是我samba服务器的工作目录,多了不说,这不是重点。
然后通过命令mkdir embedded 建立一个arm-linux-gcc的安装目录,如图二所示。当然安装路径和目录名称“embedded”可以依自己的喜好而定。
步骤阅读
然后通过命令将share文件夹下的arm-linux-gcc-4.4.3.tar.gz复制到这里的embedded文件夹下, 当然这里你也可以不进行这一步我这是为了方便以后管理,将arm-linux-gcc安装到embedded文件夹下,方便以后寻找。
然后使用tar命令:tar zxvf arm-gcc-4.4.3.tar.gz将embedded文件夹下的arm-linux-gcc-4.4.3.tar.gz解压缩安装到当前目录下
执行完解压缩命令,就已经将交叉编译工具链arm-linux-gcc-4.4.3安装到linux系统上了,这里默认安装到了图六所示的路径上。
接下来配置系统环境变量,把交叉编译工具链的路径添加到环境变量PATH中去,这样就可以在任何目录下使用这些工具。 vi /etc/profile 编辑profile文件,添加环境变量。
在profile中的位置处,添加图八所示的红线标注的一行,路径就是图六中的红线标注的路径后面加上/4.4.3/bin。
图八中的路径一定是你自己的安装路径,可以使用pwd命令查找一下那个bin目录的路径。添加完路径后,保存退出。接下来使用命令:source /etc/profile,是修改后的profile文件生效,如图九所示。
然后,使用命令:arm-linux-gcc -v查看当前交叉编译链工具的版本信息,如图九中的红线标注第③行所示。很明显 可以看到,如果不执行第②步,则查看版本信息不成功。
然后验证交叉编译工具链是否安装成功并且可以使用,如图九所示,随便找一个目录编辑一个hello源代码。
编辑好hello.c文件后,保存退出。然后使用交叉编译器对hello.c进行编译,并生成可执行文件hello
这里生成的hello文件并不能像gcc编译出来的文件那样直接使用“./hello”命令执行并显示内容 因为它是一个二进制文件,只能下载到开发板上执行!
至此,搭建交叉编译环境步骤结束。
‘贰’ 交叉编译环境包括哪些工具,它的作用是什么
首先你要知道一个软件可能需要在多个CPU架构的平台上运行,如ARM架构,X86架构等等。
假设你要开发一个软件目标平台是ARM,那么你可以选择在PC上,即X86平台上进行开发,然后使用交叉编译工具把软件编译成ARM架构版本,然后才能在ARM上运行,如果只是用一般的编译工具链,那么只能编译在当前平台上运行。
至于编译工具链有哪些,具体要看你的开发平台和目标平台,会对应不同的编译工具。
‘叁’ 用arm-linux交叉编译器使用动态库时搜索标准路径是什么
/usr/lib , /橘源usr/libxx xx为数字,一般32或64,x32
标准头好伍毕文友芹件搜索路径:/usr/include/
‘肆’ 交叉编译器的工作方法
首先编译器进行语法分析,也就是要把那些字符串分离出来。
然后进行语义分析,就是把各个由语法分析分析出的语法单元的意义搞清楚。
最后生成的是目标文件,也称为obj文件。
再经过链接器的链接就可以生成最后的可执行代码了。
有些时候需要把多个文件产生的目标文件进行链接,产生最后的代码。这一过程称为交叉链接。
‘伍’ 如何安装交叉编译器 详细�0�3
1.将源码拷至目录文件: a) 使用命令:cp 3.4.1.tar.bz2 /lishangfeng 拷贝交叉工具的文件至目录文件; 2.将源文件进行解压: a) 使用命令:tar xvf 3.4.1.tar.bz2 解压源文件,得到目录文件(3.4.1); 3.查看目录下的文件: a) 使用命令:ls b) arm-linux bin include info lib libexec man tmp 4.修改环境变量: a) 打开终端,查看当前环境变量: b) 输入命令:echo $PATH c) 添加新的环境变量: 使用命令:PATH = $PATH:/lishangfeng/3.4.1/bin (这样添加只针对本终端有用) d) 若想将环境变量永久添加,可以使用以下方法: 1)打开更改脚本文件: 2)使用命令:gedit /root/.bashrc 3)在文件的最后一行加上如下代码: export PATH=$PATH:/lishangfeng/3.4.1/bin 4)保存退出,重新启动linux 系统即可。 5.至此交叉编译器就安装成功了。 制作人:尚贤博学 于2013 年3 月3 号西安石油大学制作完成(希望能帮助到广大热爱嵌入式的朋友们)
‘陆’ 如何使用arm-linux-gcc交叉编译器生成map文件
方法/步骤
从网上下载arm-linux-gcc 4.4.3的源码
进入Linux的终端,将当前目录设为arm-linux-gcc的下载目录,输入tar -xzf arm-linux-gcc-4.4.3.tar.gz,将文件解压,解压后会有一个opt的文件夹。
在/usr/local/下建立一个名为arm的文件夹,在终端中输入命令:cd /usr/local/,回车,然后再输入命令:mkdir arm,建立arm目录,并修改该文件夹的属性为rwx,输入命令:chmod 777 arm
将之前解压得到的opt文件压下的源码,复制到上一步中创建的arm文件夹下,在终端中输入命令:sudo cp -r /opt/FriendlyARM/toolschain/4.4.3 /usr/local/arm
到这里已经基本安装好了,到为了避免每次使用arm-linux-gcc时都要输入它所在的完整路径,所以这里我们要修改一下环境变量$PATH。在终端中输入:sudo gedit /etc/profile,打开profile文件,在最后一行加上“export PATH=$PATH:/usr/local/arm/4.4.3/bin”然后保存文件。
立即使新的环境变量生效,输入:source /etc/profile。再输入:echo $PATH查看环境变量,如图。如果不成功,则直接重新启动系统,再查看。因为之前我已经安装过了,为了演示,所以图中会有两个/usr/local/arm/4.4.3/bin。
最后检查是否安装完成,输入:arm-linux-gcc -v查看版本信息,如果出现以下信息,则说明安装成功。
‘柒’ 如何使用CMake进行交叉编译
cmake交叉编译配置
很多时候,我们在开发的时候是面对嵌入式平台,因此由于资源的限制需要用到相关的交叉编译。即在你host宿主机上要生成target目标机的程序。里面牵扯到相关头文件的切换和编译器的选择以及环境变量的改变等,我今天仅仅简单介绍下相关CMake在面对交叉编译的时候,需要做的一些准备工作。
CMake给交叉编译预留了一个很好的变量CMAKE_TOOLCHAIN_FILE,它定义了一个文件的路径,这个文件即toolChain,里面set了一系列你需要改变的变量和属性,包括C_COMPILER,CXX_COMPILER,如果用Qt的话需要更改QT_QMAKE_EXECUTABLE以及如果用BOOST的话需要更改的BOOST_ROOT(具体查看相关Findxxx.cmake里面指定的路径)。CMake为了不让用户每次交叉编译都要重新输入这些命令,因此它带来toolChain机制,简而言之就是一个cmake脚本,内嵌了你需要改变以及需要set的所有交叉环境的设置。
toolChain脚本中设置的几个重要变量
1.CMAKE_SYSTEM_NAME:
即你目标机target所在的操作系统名称,比如ARM或者Linux你就需要写"Linux",如果Windows平台你就写"Windows",如果你的嵌入式平台没有相关OS你即需要写成"Generic",只有当CMAKE_SYSTEM_NAME这个变量被设置了,CMake才认为此时正在交叉编译,它会额外设置一个变量CMAKE_CROSSCOMPILING为TRUE.
2. CMAKE_C_COMPILER:
顾名思义,即C语言编译器,这里可以将变量设置成完整路径或者文件名,设置成完整路径有一个好处就是CMake会去这个路径下去寻找编译相关的其他工具比如linker,binutils等,如果你写的文件名带有arm-elf等等前缀,CMake会识别到并且去寻找相关的交叉编译器。
3. CMAKE_CXX_COMPILER:
同上,此时代表的是C++编译器。
4. CMAKE_FIND_ROOT_PATH:
指定了一个或者多个优先于其他搜索路径的搜索路径。比如你设置了/opt/arm/,所有的Find_xxx.cmake都会优先根据这个路径下的/usr/lib,/lib等进行查找,然后才会去你自己的/usr/lib和/lib进行查找,如果你有一些库是不被包含在/opt/arm里面的,你也可以显示指定多个值给CMAKE_FIND_ROOT_PATH,比如
set(CMAKE_FIND_ROOT_PATH /opt/arm /opt/inst)
该变量能够有效地重新定位在给定位置下进行搜索的根路径。该变量默认为空。当使用交叉编译时,该变量十分有用:用该变量指向目标环境的根目录,然后CMake将会在那里查找。
5. CMAKE_FIND_ROOT_PATH_MODE_PROGRAM:
对FIND_PROGRAM()起作用,有三种取值,NEVER,ONLY,BOTH,第一个表示不在你CMAKE_FIND_ROOT_PATH下进行查找,第二个表示只在这个路径下查找,第三个表示先查找这个路径,再查找全局路径,对于这个变量来说,一般都是调用宿主机的程序,所以一般都设置成NEVER
6. CMAKE_FIND_ROOT_PATH_MODE_LIBRARY:
对FIND_LIBRARY()起作用,表示在链接的时候的库的相关选项,因此这里需要设置成ONLY来保证我们的库是在交叉环境中找的.
7. CMAKE_FIND_ROOT_PATH_MODE_INCLUDE:
对FIND_PATH()和FIND_FILE()起作用,一般来说也是ONLY,如果你想改变,一般也是在相关的FIND命令中增加option来改变局部设置,有NO_CMAKE_FIND_ROOT_PATH,ONLY_CMAKE_FIND_ROOT_PATH,BOTH_CMAKE_FIND_ROOT_PATH
8. BOOST_ROOT:
对于需要boost库的用户来说,相关的boost库路径配置也需要设置,因此这里的路径即ARM下的boost路径,里面有include和lib。
9. QT_QMAKE_EXECUTABLE:
对于Qt用户来说,需要更改相关的qmake命令切换成嵌入式版本,因此这里需要指定成相应的qmake路径(指定到qmake本身)
toolChain demo
# this is required
SET(CMAKE_SYSTEM_NAME Linux)
# specify the cross compiler
SET(CMAKE_C_COMPILER /opt/arm/usr/bin/ppc_74xx-gcc)
SET(CMAKE_CXX_COMPILER /opt/arm/usr/bin/ppc_74xx-g++)
# where is the target environment
SET(CMAKE_FIND_ROOT_PATH /opt/arm/ppc_74xx /home/rickk/arm_inst)
# search for programs in the build host directories (not necessary)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
# configure Boost and Qt
SET(QT_QMAKE_EXECUTABLE /opt/qt-embedded/qmake)
SET(BOOST_ROOT /opt/boost_arm)
这样就完成了相关toolChain的编写,之后,你可以灵活的选择到底采用宿主机版本还是开发机版本,之间的区别仅仅是一条-DCMAKE_TOOLCHAIN_FILE=./toolChain.cmake,更爽的是,如果你有很多程序需要做转移,但目标平台是同一个,你仅仅需要写一份toolChain放在一个地方,就可以给所有工程使用。
‘捌’ 怎样使用交叉编译器编译单个C文件
$CC filename.c -o filename