gcc交叉编译
交叉编译工具链作为嵌入式Linux开发的基础,直接影响到嵌入式开发的项目进度和完成质量。由于目前大多数开发人员使用Windows作为嵌入式开发的宿主机,在Windows中通过安装VMware等虚拟机软件来进行嵌入式Linux开发,这样对宿主机的性能要求极高...
❷ 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网上有许多产品团购,便宜有口碑
❸ 用交叉编译器(已经更改为arm-linux-gcc) 编译内核;但是提示gcc没有找到
提示 gcc:not command;就表示是gcc命令没找到,这个和你的arm-linux-gcc没关系,因为如果arm-linux-gcc找不到的话,会提示arm-linux-gcc找不到的,所以你就只能猜是不是host边的gcc没找到,然后在你的主机端安装gcc开发包就可以了。
嵌入式一种重要的能力就是debug,自己锻炼下吧,以后这种简单的问题就能搞定了。
❹ LINUX交叉编译工具链和GCC是什么关系啊
编译工具链一般最简化的为
binutils
+
gcc
+
glibc
+
kernel-header
组合的环境。
GCC
就是编译器,他的输出每次安装只能有针对一个架构的指令输出。如果要多个架构输出,那就要装多个
GCC
,所以编译工具链里面会有一个
GCC
。
交叉编译就是跨架构编译,编译出来的程序不能在本机执行(当然有例外情况)。所以这个时候就需要交叉编译工具链。
工具链光有
GCC
是不行的,还需要一个
binutils
的二进制连接器,以及一个最基本的目标架构的
C
库,C
库还需要一个目标架构的内核源代码才能完全工作(当然不是必须的,但编译有的时候需要)
又因为
GCC
、binutils
不能实现单软件同时多架构输出,所以需要单独另装,又加上
C
库和内核头文件需要目标架构的东西而不能用本机本地架构的数据。
所以一个交叉编译工具链就是针对目标架构准备的单独安装单独使用的
binutils
+
gcc
+
glibc
+
kernel-header
的集合了。
PS:这个
kernel-header
并不一定就是
Linux
,他还可以是别的系统核心开发库,比如
FreeBSD
。
❺ bootloader和ARM linux gcc交叉编译有关系吗
首先这两者之间没有一个直接的联系。
在做嵌入式开发的时候,如果是ARM平台,那么相应的bootloader也是需要使用ARM平台的交叉编译工具进行编译的,因为每一个架构的汇编指令(其实更准确来说,应该是机器码)是不一样的,因此需要针对于此架构的编译器进行编译,生成ARM平台可用的bootloader。
举个例子:
A代码 --> 经过 intel 架构的 gcc 编译工具 ---> B 格式的程序(可以在支持B格式的intel架构的设备上运行)
A代码 --> 经过 ARM 架构的 交叉gcc 编译工具 ---> C 格式的程序(可以在支持C格式的ARM架构的设备上运行)
bootloader 类似于PC上的BIOS,是在启动操作系统之前,做一些硬件初始化的工具,以保证可以正常加载内核进行启动。
❻ 在Ubuntu下,安装arm-linux-gcc交叉编译器,环境变量也都设置好了,运行arm-linux-gcc 提示未找到命令
先找一下有无arm-linux-gcc这个文件:
find / -xdev -name arm-linux-gcc
再看一下有无执行权限:
ls -l arm-linux-gcc
再用绝对路径执行一下看看:
/path/to/arm-linux-gcc -v
❼ gcc -arm这个交叉编译工具。有没有可以再window上使用的
yagarto和codesourcery都是在windows下用的,官方已经编译打包好的EXE文件
cygwin下可以自己编译源代码,做出GNU工具链
mingw也可以实现
还有一些在windows下用的IDE,专门针对GNU工具链的,code::blocks,emide等
我在用emIDE,arm-none-eabi-gdb调试ARM
❽ gcc交叉编译怎么找头文件及lib库的
是在specs里面读取的路径信息。
命令行中键入 gcc -v
Reading specs from /usr/lib/gcc/i686-pc-cygwin/3.4.4/specs
Configured with: /usr/build/package/orig/test.respin/gcc-3.4.4-3/configure --ver
bose --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --libdir=/usr/lib --libe
xecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --enable-langu
ages=c,ada,c++,d,f77,pascal,java,objc --enable-nls --without-included-gettext --
enable-version-specific-runtime-libs --without-x --enable-libgcj --disable-java-
awt --with-system-zlib --enable-interpreter --disable-libgcj-debug --enable-thre
ads=posix --enable-java-gc=boehm --disable-win32-registry --enable-sjlj-exceptio
ns --enable-hash-synchronization --enable-libstdcxx-debug
Thread model: posix
gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
注意“--prefix=/usr” 以及“--libdir=/usr/lib ”
表示gcc ld as 等可执行文件安装在/usr/bin,而libc.a 等文件是在/usr/lib中。
解压缩交叉编译器时,也是要解压缩在在--prefix 指定的目录下。
比如 下载了arm-linux 的交叉编译器cross-3.3.2.tar.bz2,解压缩之后,运行 arm-linux-gcc -v
得到 --prefix=/usr/local/arm。那么就要把 bin lib 等所有的文件和文件夹到/usr/local/arm目录下。
否则到时候运行arm-linux-gcc hello.c会提示找不到stdio.h 或者 lib.so.6 等
HOWTO Use the GCC specs file
About Specs file
The "gcc" program invoked by users is a convenient front-end driver executable which will invoke other programs in the background such as cc1, as or ld to do its work according to the command line parameter given. A specs file is plain text used to control the default behavior for the "gcc" front-end. The specs file is usually built-in but for flexibility purposes, it can be overridden with an external version.
Basic Specs file modifications
CC will proce a specs file via the following command.
gcc -mpspecs > specs
You may use a text editor of your choice to inspect it. It may be confusing at first, but there are many places of interest. To use the specs file, invoke gcc with -specs= or place it at "/mingw/lib/gcc/mingw32//specs" to make GCC use it by default, where refers to the GCC version installed.
Adding include directories to the search path
& #160;he *cpp: section should be modified. It contains the following by default:
*cpp:
%{posix:-D_POSIX_SOURCE} %{mthreads:-D_MT}
If "z:\libx\include" needs to be added to the GCC includes search path, it should be changed to the following
*cpp:
%{posix:-D_POSIX_SOURCE} %{mthreads:-D_MT} -I/z/libx/include
Adding lib directories to the search path
& #160;he *link_libgcc: section should be modified. It contains the following by default:
*link_libgcc:
%D
& #160;f "z:\libx\lib" needs to be added to the GCC library search path, it should be changed to the following
*link_libgcc:
%D -L/z/libx/lib
❾ gcc和交叉编译工具生成的可执行文件有什么不同
可执行文件的目标平台不一样。你说的gcc应该是指在pc上,即x86体系结构。而交叉编译生成的应该是其他体系平台的,如ARM。只能在对应的平台上运行。
❿ 交叉编译,arm-linux-gcc的问题。交叉编译环境如何建立,下面的方法咋不行
请把报错贴出来,把应用程序include段贴出来