❶ 交叉编译器的原理
编译是从源代码(通常为高级语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。然而,也存在从低阶语言到高阶语言的编译器,这类编译器中用来从由高阶语言生成的低阶语言代码重新生成高阶语言代码的又被叫做反编译器。也有从一种高阶语言生成另一种高阶语言的编译器,或者生成一种需要进一步处理的的中间代码的编译器(又叫级联)。
典型的编译器输出是由包含入口点的名字和地址, 以及外部调用(到不在这个目标文件中的函数调用)的机器代码所组成的目标文件。一组目标文件,不必是同一编译器产生,但使用的编译器必需采用同样的输出格式,可以链接在一起并生成可以由用户直接执行的可执行程序。
❷ 交叉编译时提示 对'__C_ctype_b'的未定义引用
出现这种情况的原因,主要是C/C++编译为obj文件的时候并不旅卖需要函数的具体实现,只要有函数的原型即可。但是在链接为可执行文件的时候就必须要具体的实现了。如果错误是未声明的引用,那就是找不到函数的原型,解决办法这里就不细致说了,通常是相关的头文件未包含。
解决办法
指定原因就好办了,既然知道是缺少了函数的喊昌具体实现,那么就给它这个函数的实现就好了。比如上面的例子,是因为缺失了dlopen、dlsym、dlerror、dlclose这些函数的实现,这几个函数是用于加载动态链接库的,编译的时候需要添加-ldl来使用dl库(这是静态库,在系统目录下/usr/lib/i386-linux-gnu/libdl.a、/usr/lib/x86_64-linux-gnu/libdl.a)。
但是看上面编译的时候是有添加-ldl选项的,那么为什么不行呢?
gcc 依赖顺序问题
这个主要的原因是gcc编译的时候,各个文件依赖顺序的问题。
在gcc编译的时候,如果文件a依赖于文件b,那么编译的时候必须把a放前面,b放后面。
例如:在main.c中使用了pthread库相关函数,那么编译的时候必须是main.c在前,-lpthread在后。gcc main.c -lpthread -o a.out。
上面拆渗逗出现问题的原因就是引入库的顺序在前面了,将其放置在后面即可了。
g++ -o spider bloomfilter.o confparser.o crc32.o dso.o hashs.o md5.o qstring.o sha1.o socket.o spider.o threads.o url.o -rdynamic -lpthread -levent -lcrypt -ldl
❸ 什么是交叉编译,为什么要使用交叉编译
交叉编译的概念(来自网络):
简单地说,就是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。
举个例子:
我们在Linux系统比如Ubuntu上编写的C程序完全可以拿到Windows系统上正常运行。
❹ 什么是交叉编译技术,并简述在嵌入式系统中采用该技术的原因
很简单,交叉编译就是在宿主机上编译能在目标板上运行的程序,之所以用交叉编译,就是因为很多目标机的功能不是很强大,例如没有足够的内存,CPU也不行。所以就要借助宿主机来做好它所需要是东东,然后目标机用
❺ 什么是交叉编译,为什么要采用交叉编译
在一个平台架构上,编译另一个平台架构的可执行代码,就是交叉编译。
例如在x86架构的PC上编译arm嵌入式设备的可执行程序。
交叉编译是不得不用,
首先在目标设备的系统还没引导起来的时候,编译目标平台的引导程序,显然只能交叉编译。
还有因为目标设备往往能力太低,没法安装编译器,或者勉强安装了,也慢得像蜗牛。
❻ ubuntu下进行嵌入式C语言开发时,什么叫交叉编译为什么要交叉编译
交易编译就是将文件编译成目标机可执行的文件。
比如说:你在PC机上写一个helloword,怎么让它到开发板上运行,开发板上的指令跟PC机不到,就需要用到交叉编译工具,编译成开发板上能识别的指令。
❼ 嵌入式系统开发为什么要采用交叉编译的方式
由于嵌入式系统资源匮乏,一般不能像PC一样安装本地编译器和调试器,不能在本地编写、编译和调试自身运行的程序,而需借助其它系统如PC来完成这些工作,这样的系统通常被称为宿主机。宿主机通常是Linux系统,并安装交叉编译器、调试器等工具;宿主机也可以是Windows系统,安装嵌入式Linux集成开发环境。在宿主机上编写和编译代码,通过串口、网口或者硬件调试器将程序下载到目标系统里面运行。所谓的交叉编译,就是在宿主机平台上使用某种特定的交叉编译器,为某种与宿主机不同平台的目标系统编译程序,得到的程序在目标系统上运行而非在宿主机本地运行。这里的平台包含两层含义:一是核心处理器的架构,二是所运行的系统,这样,交叉编译有3种情形:(1)目标系统与宿主机处理器相同,运行不同的系统;(2)目标系统与宿主机处理器不同,运行相同的系统;(3)目标系统与宿主机处理器不同,运行不同的系统。实际上,在PC机上进行非Linux的嵌入式开发,哪怕使用IDE集成环境如Keil、ADS、Realview,都是交叉编译和调试的过程,只是IDE工具隐藏了细节,没有明确提出这个概念而已。
❽ 为什么要用交叉编译器
交叉编译,简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。
有时是因为目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。
综上,在嵌入式开发的时候我们就要使用交叉编译器。