㈠ linux模块编译时,默认的编译器是什么怎么有时候指定了CC=arm-linux- 但是command里面没有用到CC
默认的编译器是gcc。
在linux 里 gcc 便是cc,两者是没区别的,gcc前面的g是代表GNU(至于GNU的意思,你可以查网络之类,关于linux的历史了)的意思。
假如如没有cc,你查下gcc有没有。假如没有,说明你装的是交叉编译工具arm-linux-gcc。
CC=arm-linux- 应该是 CC=arm-linux-gcc。
arm-linux-gcc 应该是用来编译嵌入式的。
㈡ 交叉编译器 arm-linux-gnueabi 和 arm-linux-gnuea
一. 什么是ABI和EABI
1) ABI: 二进制应用程序接口(Application Binary Interface (ABI) for the ARM Architecture)
在计算机中,应用二进制接口描述了应用程序(或者其他类型)和操作系统之间或其他应用程序的低级接口.
ABI涵盖了各种细节,如:
数据类型的大小、布局和对齐;
调用约定(控制着函数的参数如何传送以及如何接受返回值),例如,是所有的参数都通过栈传递,还是部分参数通过寄存器传递;哪个寄存器用于哪个函数参数;通过栈传递的第一个函数参数是最先push到栈上还是最后;
系统调用的编码和一个应用如何向操作系统进行系统调用;
以及在一个完整的操作系统ABI中,目标文件的二进制格式、程序库等等。
一个完整的ABI,像Intel二进制兼容标准 (iBCS) ,允许支持它的操作系统上的程序不经修改在其他支持此ABI的操作体统上运行。
ABI不同于应用程序接口(API),API定义了源代码和库之间的接口,因此同样的代码可以在支持这个API的任何系统中编译,ABI允许编译好的目标代码在使用兼容ABI的系统中无需改动就能运行。
2) EABI: 嵌入式ABI
嵌入式应用二进制接口指定了文件格式、数据类型、寄存器使用、堆积组织优化和在一个嵌入式软件中的参数的标准约定。
开发者使用自己的汇编语言也可以使用EABI作为与兼容的编译器生成的汇编语言的接口。
支持EABI的编译器创建的目标文件可以和使用类似编译器产生的代码兼容,这样允许开发者链接一个由不同编译器产生的库。
EABI与关于通用计算机的ABI的主要区别是应用程序代码中允许使用特权指令,不需要动态链接(有时是禁止的),和更紧凑的堆栈帧组织用来节省内存。广泛使用EABI的有Power PC和ARM.
二. gnueabi相关的两个交叉编译器: gnueabi和gnueabihf
在debian源里这两个交叉编译器的定义如下:
gcc-arm-linux-gnueabi – The GNU C compiler for armel architecture
gcc-arm-linux-gnueabihf – The GNU C compiler for armhf architecture
可见这两个交叉编译器适用于armel和armhf两个不同的架构, armel和armhf这两种架构在对待浮点运算采取了不同的策略(有fpu的arm才能支持这两种浮点运算策略)
其实这两个交叉编译器只不过是gcc的选项-mfloat-abi的默认值不同. gcc的选项-mfloat-abi有三种值soft,softfp,hard(其中后两者都要求arm里有fpu浮点运算单元,soft与后两者是兼容的,但softfp和hard两种模式互不兼容):
soft : 不用fpu进行浮点计算,即使有fpu浮点运算单元也不用,而是使用软件模式。
softfp : armel架构(对应的编译器为gcc-arm-linux-gnueabi)采用的默认值,用fpu计算,但是传参数用普通寄存器传,这样中断的时候,只需要保存普通寄存器,中断负荷小,但是参数需要转换成浮点的再计算。
hard : armhf架构(对应的编译器gcc-arm-linux-gnueabihf)采用的默认值,用fpu计算,传参数也用fpu中的浮点寄存器传,省去了转换, 性能最好,但是中断负荷高。
㈢ 如何安装arm-linux-gcc编译器
具体安装步骤如下,首先下载安装包。
1、解压文件
解压 tar zxvf arm-linux-gcc-4.4.3.tar.gz -C/(
直接解压后就可以,-C/会让解压的文件自动放在根目录下指定路径,不用管)
下载arm-linux-gcc-4.4.3.tgz到任意的目录下,进入这个文件夹
sudo tar xvzf arm-linux-gcc-4.4.3.tgz –C /
2、建立目录
sudo mkdir /usr/local/arm
3、复制文件
sudo cp -r /opt/FriendlyARM/toolschain/4.4.3 /usr/local/arm
5、添加环境变量
修改/etc/profile文件(此文件属于系统级别的环境变量,设置在里面的东西对所有用户适用)
sudo gedit /etc/profile
增加路径设置,在末尾添加如下:
export PATH=$PATH:/usr/local/arm/4.4.3/bin。
至此安装步骤到此完成。
㈣ 如何建立Linux下的ARM交叉编译环境
首先安装交叉编译器,网络“arm-linux-gcc”就可以一个编译器压缩包。
把压缩包放到linux系统中,解压,这样就算安装好了交叉编译器。
设置编译器环境变量,具体方式网络。如打开 /etc/bash.bashrc,添加刚才安装的编译器路径 export PATH=/home/。。。/4.4.3/bin:$PATH。这样是为了方便使用,用arm-linux-gcc即可,不然既要带全路径/home//bin/arm-linux-gcc,这样不方便使用。
编译c文件。和gcc编译相似,把gcc用arm-linu-gcc代替就是了。编译出来的就可以放到arm上运行了。</ol>
㈤ 交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别
gnueabi相关的两个交叉编译器: gnueabi和gnueabihf
在debian源里这两个交叉编译器的定义如下:
gcc-arm-linux-gnueabi – The GNU C compiler for armel architecture
gcc-arm-linux-gnueabihf – The GNU C compiler for armhf architecture
可见这两个交叉编译器适用于armel和armhf两个不同的架构, armel和armhf这两种架构在对待浮点运算采取了不同的策略(有fpu的arm才能支持这两种浮点运算策略)
其实这两个交叉编译器只不过是gcc的选项-mfloat-abi的默认值不同. gcc的选项-mfloat-abi有三种值soft,softfp,hard(其中后两者都要求arm里有fpu浮点运算单元,soft与后两者是兼容的,但softfp和hard两种模式互不兼容):
soft : 不用fpu进行浮点计算,即使有fpu浮点运算单元也不用,而是使用软件模式。
softfp : armel架构(对应的编译器为gcc-arm-linux-gnueabi)采用的默认值,用fpu计算,但是传参数用普通寄存器传,这样中断的时候,只需要保存普通寄存器,中断负荷小,但是参数需要转换成浮点的再计算。
hard : armhf架构(对应的编译器gcc-arm-linux-gnueabihf)采用的默认值,用fpu计算,传参数也用fpu中的浮点寄存器传,省去了转换, 性能最好,但是中断负荷高。
----关于Linux命令的介绍,看看《linux就该这么学》,具体关于这一章地址3w(dot)linuxprobe/chapter-02(dot)html
BBB里面默认是hard,我想转为soft,没有想到办法。
怎样能该啊,gcc -v,变为soft。。
㈥ gcc和arm-linux-gcc是什么关系区别是什么
gcc是linux系统下面用来将代码编译成一个可执行程序的手段。编译出来的是适用于linux系统的可执行二进制文件。可执行程序其实就是一堆的0101二进制机器码。这些机器码代表什么含义只有机器本身能理解。所以你用gcc编译出来的可执行程序只有在linux系统下面可以运行。举个例子你的可执行程序里面有一句01011.这句在linux下面可能是吃饭的意思,但是在windows下面可能01011是撒尿的意思。那你说linux的可执行程序放在window下面能正常运行吗?肯定不能嘛。你要的目的是吃饭,它帮你执行撒尿很显然就不对了。同样的可能01011在ARM下面的意思是睡觉。不同系统的机器码含义是不一样的。所以你在linux系统下面写的代码要怎样才能在ARM系统上面跑呢。这就需要用到交叉编译。arm-linux-gcc是什么意思?就是告诉你的编译器,我编写的环境是linux,但是我希望生成的可执行程序是在arm上面跑的。这就是交叉编译。编写环境和执行环境分离的一种手段。
㈦ 嵌入式linux应用程序通常用什么编译器编译
Linux有一系列功能强大的编译器:vi、emace是屏幕交互式编译器,GNU CC是GNU项目中符合ANSI C标准的编译系统。
vi命令是Linux下全屏幕文本编辑,虽然这个编译器特简陋,对于初学者来说不是很友好,但是在Linux中vi的作用非常大。
主要的三种模式:命令模式、输入模式、末行模式。
掌握这三种模式十分重要:
命令模式:vi启动后默认进入的是命令模式,从这个模式使用命令可以切换到另外两种模式,同时无论在任何模式下只要按一下[Esc]键都可以返回命令模式。在命令模式中输入字幕“i”就可以进入vi的输入模式编辑文件。
输入模式:在这个模式中我们可以编辑、修改、输入等编辑工作,在编辑器最后一行显示一个“--INSERT--”标志着vi进入了输入模式。当我们完成修改输入等操作的时候我们需要保存文件,这时我们需要先返回命令模式,在进入末行模式保存。
末行模式:在命令模式输入“:”即可进入该模式,在末行模式中有好多好用的命令。
vim是vi编辑器的改进版本,在vi编译的基础上扩展了很多实用的功能。
至于vi/vim的命令就不给大家介绍了,我们在日常实际的使用之中随着积累都会掌握。
㈧ 如何制作arm-linux-gcc编译工具
一、下载源文件
源代码文件及其版本:
binutils-2.19.tar.bz2, gcc-core-4.4.4.tar.bz2 gcc-g++-4.4.4.tar.bz2 Glibc-2.7.tar.bz2 Glibc-ports-2.7.tar.bz2 Gmp-4.2.tar.bz2 mpfr-2.4.0.tar.bz2mpc-1.0.1.tar.gz Linux-2.6.25.tar.bz2 (由于我在编译出错的过程中,根据出错的信息修改了相关的C代码,故而没有下载相应的补丁)
一般一个完整的交叉编译器涉及到多个软件,主要包括bilinguals、cc、glibc等。其中,binutils主要生成一些辅助工具;gcc是用来生成交叉编译器,主要生成arm-linux-gcc交叉编译工具,而glibc主要提供用户程序所需要的一些基本函数库。
二、建立工作目录
编译所用主机型号 fc14.i686,虚拟机选的是VM7.0,Linux发行版选的是Fedora9,
第一次编译时用的是root用户(第二次用一般用户yyz), 所有的工作目录都在/home/yyz/cross下面建立完成,首先在/home/yyz目录下建立cross目录,然后进入工作目录,查看当前目录。命令如下:
创建工具链文件夹:
[root@localhost cross]# mkdir embedded-toolchains
下面在此文件夹下建立如下几个目录:
setup-dir:存放下载的压缩包;
src-dir:存放binutils、gcc、glibc解压之后的源文件;
Kernel:存放内核文件,对内核的配置和编译工作也在此完成;
build-dir :编译src-dir下面的源文件,这是GNU推荐的源文件目录与编译目录分离的做法;
tool-chain:交叉编译工具链的安装位;
program:存放编写程序;
doc:说明文档和脚本文件;
下面建立目录,并拷贝源文件。
[root@localhost cross] #cd embedded- toolchains
[root@localhost embedded- toolchains] #mkdir setup-dir src-dir kernel build-dir tool-chain program doc
[root@localhost embedded- toolchains] #ls
build-dir doc kernel program setup-dir src-dir tool-chain
[root@localhost embedded- toolchains] #cd setup-dir
拷贝源文件:
这里我们采用直接拷贝源文件的方法,首先应该修改setup-dir的权限
[root@localhost embedded- toolchains] #chmod 777 setup-dir
然后直接拷贝/home/yyz目录下的源文件到setup-dir目录中,如下图:
建立编译目录:
[root@localhost setup-dir] #cd ../build-dir
[root@localhost build -dir] #mkdir build-binutils build-gcc build-glibc
三、输出环境变量
输出如下的环境变量方便我们编译。
为简化操作过程。下面就建立shell命令脚本environment-variables:
[root@localhost build -dir] #cd ../doc
[root@localhost doc] #mkdir scripts
[root@localhost doc] #cd scripts
用编辑器vi编辑环境变量脚本envionment-variables:[root@localhost scripts]
#vi envionment-variables
export PRJROOT=/home/yyz/cross/embedded-toolchains
export TARGET=arm-linux
export PREFIX=$PRJROOT/tool-chain
export TARGET_PREFIX=$PREFIX/$TARGET
export PATH=$PREFIX/bin:$PATH
截图如下:
执行如下语句使环境变量生效:
[root@localhost scripts]# source ./environment-variables
四、建立二进制工具(binutils)
下面将分步介绍安装binutils-2.19.1的过程。
[root@localhost script] # cd $PRJROOT/src-dir
[root@localhost src-dir] # tar jxvf ../setup-dir/binutils-2.19.1.tar.bz2
[root@localhost src-dir] # cd $PRJROOT/build-dir/build-binutils
创建Makefile:
[root@localhost build-binutils] #../../src-dir/binutils-2.19.1/configure --target=$TARGET --prefix=$PREFIX
在build-binutils目录下面生成Makefile文件,然后执行make,make install,此过程比较缓慢,大约需要一个15分钟左右。完成后可以在$PREFIX/bin下面看到我们的新的binutil。
输入如下命令
[root@localhost build-binutils]#ls $PREFIX/bin
㈨ linux的PC机上,用什么编译器编译arm程序比较好,比如像arm7的LPC24xx。
当然用交叉编译工具了。arm-linux-gcc,本人比较懒,你可以上网搜索,很多的。
编译uboot推荐3.3.1版本,编译内核推荐4.4.3版本。是不同的版本,一定记得哈
㈩ arm-linux-gcc交叉编译器的制作,以及版本选择问题。
,需要必须有足够动经验来支持。
另外,用 RH9 的都是高手,我想你的知识不需要来提问了吧?
1、在 PC 上编译 arm 的程序当然需要较差编译器,这个需要自己安装,或者着现成的交叉编译器环境,一般是一个特殊参数编译出来的 gcc + binutils + glibc + linux-header。这个每个人动环境不同,一般都需要自己编译一个,当然没有特殊需求,也可以找现成的。不过很难找,因为这套环境还要和你动系统搭配,不然环境不匹配,连这个环境都不能运行,那就更谈不上编译东西了。
有关自己编译搭建交叉编译环境,可以看看一个特殊的 Linux 发行版 LFS 的分支: CLFS 。
2、移植分很多意思,移植有可能就意味着这套源代码不能在目标系统上面编译,需要你根据相应的知识去修改源代码来让这套代码适应目标编译器的要求,比如源代码有 SSE4 的优化,这套程序在非 SSE4 CPU 上无法编译运行,但目标机器连 SSE1 都不支持。那么就需要移植。
或者移植仅仅是根据新的环境进行编译,不需要进行源代码修改,只需要进行一下编译就能运行的程序,也可以称为移植,就是从一个环境、架构 -》另一个环境、架构。都可以称为移植,但真正的移植意味着修改程序源代码来适应新环境。你说的这种移植是最简单的移植。
3、决定目标硬件环境 -》搭建目标编译器 -》制作目标环境(内核,基础软件库)-》进行应用移植(移植需要的软件、主应用程序)-》搭建系统文件系统 -》导入目标系统-》启动目标系统&应用。说起来很简单,因为这是完全没有问题的条件下。
至于超级终端。那是用来控制目标系统的。目标系统有可能不能插键盘鼠标显示器,这就需要一个远程网络链接来进行控制。以及通过远程链接来发送数据。这都需要终端的支持。
虚拟机下面进行开发,不能发挥你的计算机的性能。而且因为隔着 VMware 的软件模拟层,可能还不会很方便的让你链接目标设备。
至于用 socket ,我还没见到你的目标需要这个东西,因为所有的东西都是现成的源代码。不需要你从 0 开始写,当然你想自己写一个系统内核,或者服务器程序,或者全套的系统+应用,我绝对不拦你,但希望你写完这套东西,能把源代码发布出来。
ads 可以认为是一个支持环境,他本身不是一个系统的开发 SDK 。
-------------------------------------
ads 没用过,印象里他还有模拟器,调试器什么的程序。功能上要比 Linux 开发环境,WinCE 环境下面的东西更多更偏向于硬件方面,毕竟 ads 是 arm 出品的,不太可能偏向于软件部分设计。Linux 和 WinCE 都是系统而不是硬件工具。
你可以认为交叉编译器是一个应用程序,一个输出器。把源代码输出为 arm 的代码,这个应用程序的输出,是靠他自己的环境,而不是当前系统的环境的。
当前系统的各个软件的版本,不能影响交叉编译器输出的环境(理论上,现实有的时候总是从别的地方给你打击……),交叉编译器一般至少有 gcc 、binutils 、glibc 库、linux kernel 头文件。
在软件需求上。
头文件谁都不依赖,glibc 只需要内核头文件,其他程序全都依赖于 glibc 。也就是所有程序都不依赖内核,仅仅是依赖于内核头文件。
gcc 和 binutils 是把程序源代码根据上面各个环节的需提供的功能来输出为上面环节里面的二进制程序。依赖你当前环境的,只有 gcc 和 binutils 两个程序的执行、控制环节。只有他们两个依赖的,而不是你的交叉编译后的程序。
至于编译器版本的选择,新版本功能更好,旧版本兼容更好。
这个要看你的实际需要了。应用程序源代码也调编译器的,同时也依赖于软件库的功能。
arm 开发建议稳定、兼容优先。当然也可以尝试最新的编译环境,来获取更好的优化(前提是还有什么代码优化的话)。
另外,团IDC网上有许多产品团购,便宜有口碑